Info Call to dynamic code loading API

Description

List of all dynamic code loading API calls in the application. Loading code from untrsuted sources could allow the execution of malicious code in the context of the current application.

Recommendation

This entry is informative, no recommendations applicable.

Technical details

Method okhttp3.internal.huc.HttpURLConnectionImpl.defaultUserAgent() calling method java.lang.System.getProperty()


    private String defaultUserAgent()
    {
        String v1_1;
        String v0 = System.getProperty("http.agent");
        if (v0 == null) {
            v1_1 = okhttp3.internal.Version.userAgent();
        } else {
            v1_1 = okhttp3.internal.Util.toHumanReadableAscii(v0);
        }
        return v1_1;
    }

Method okhttp3.internal.SystemPropertiesConnectionPool.<clinit>() calling method java.lang.System.getProperty()


    static SystemPropertiesConnectionPool()
    {
        int v4;
        String v0 = System.getProperty("http.keepAlive");
        if ((v0 == null) || (Boolean.parseBoolean(v0))) {
            String v5 = System.getProperty("http.maxConnections");
            if (v5 == null) {
                v4 = 5;
            } else {
                v4 = Integer.parseInt(v5);
            }
        } else {
            v4 = 0;
        }
        long v2;
        String v1 = System.getProperty("http.keepAliveDuration");
        if (v1 == null) {
            v2 = 300000;
        } else {
            v2 = Long.parseLong(v1);
        }
        okhttp3.internal.SystemPropertiesConnectionPool.INSTANCE = new okhttp3.ConnectionPool(v4, v2, java.util.concurrent.TimeUnit.MILLISECONDS);
        return;
    }

Method okhttp3.internal.platform.Platform.isConscryptPreferred() calling method java.lang.System.getProperty()


    public static boolean isConscryptPreferred()
    {
        boolean v1_3;
        if (!"conscrypt".equals(System.getProperty("okhttp.platform"))) {
            v1_3 = "Conscrypt".equals(java.security.Security.getProviders()[0].getName());
        } else {
            v1_3 = 1;
        }
        return v1_3;
    }

Method com.google.android.gms.internal.zzahn.zzc() calling method java.lang.System.getProperty()


    public String zzc(com.google.android.gms.internal.zzahh p6)
    {
        String v0_3 = System.getProperty("java.vm.name", "Unknown JVM");
        StringBuilder v1_4 = System.getProperty("java.specification.version", "Unknown");
        return new StringBuilder(((String.valueOf(v1_4).length() + 1) + String.valueOf(v0_3).length())).append(v1_4).append("/").append(v0_3).toString();
    }

Method com.google.android.gms.internal.zzahm.zzc() calling method java.lang.System.getProperty()


    public String zzc(com.google.android.gms.internal.zzahh p6)
    {
        StringBuilder v1_3 = System.getProperty("java.specification.version", "Unknown");
        return new StringBuilder(((String.valueOf(v1_3).length() + 1) + String.valueOf("AppEngine").length())).append(v1_3).append("/").append("AppEngine").toString();
    }

Method android.support.multidex.MultiDex.doInstallation() calling method java.lang.System.getProperty()


    private static void doInstallation(android.content.Context p9, java.io.File p10, java.io.File p11, String p12, String p13)
    {
        try {
            if (!android.support.multidex.MultiDex.installedApk.contains(p10)) {
                android.support.multidex.MultiDex.installedApk.add(p10);
                if (android.os.Build$VERSION.SDK_INT > 20) {
                    android.util.Log.w("MultiDex", new StringBuilder().append("MultiDex is not guaranteed to work in SDK version ").append(android.os.Build$VERSION.SDK_INT).append(": SDK version higher than ").append(20).append(" should be backed by ").append("runtime with built-in multidex capabilty but it\'s not the ").append("case here: java.vm.version=\"").append(System.getProperty("java.vm.version")).append("\"").toString());
                }
                try {
                    ClassLoader v3 = p9.getClassLoader();
                } catch (RuntimeException v1) {
                    android.util.Log.w("MultiDex", "Failure while trying to obtain Context class loader. Must be running in test mode. Skip patching.", v1);
                }
                if (v3 != null) {
                    try {
                        android.support.multidex.MultiDex.clearOldDexDir(p9);
                    } catch (Throwable v4) {
                        android.util.Log.w("MultiDex", "Something went wrong when trying to clear old MultiDex extraction, continuing without cleaning.", v4);
                    }
                    java.io.File v0 = android.support.multidex.MultiDex.getDexDir(p9, p11, p12);
                    android.support.multidex.MultiDex.installSecondaryDexes(v3, v0, android.support.multidex.MultiDexExtractor.load(p9, p10, v0, p13, 0));
                } else {
                    android.util.Log.e("MultiDex", "Context class loader is null. Must be running in test mode. Skip patching.");
                }
            } else {
            }
        } catch (int v5_8) {
            throw v5_8;
        }
        return;
    }

Method android.support.multidex.MultiDex.<clinit>() calling method java.lang.System.getProperty()


    static MultiDex()
    {
        android.support.multidex.MultiDex.installedApk = new java.util.HashSet();
        android.support.multidex.MultiDex.IS_VM_MULTIDEX_CAPABLE = android.support.multidex.MultiDex.isVMMultidexCapable(System.getProperty("java.vm.version"));
        return;
    }

Method android.support.multidex.MultiDex$V4.install() calling method dalvik.system.DexFile.loadDex()


    private static void install(ClassLoader p13, java.util.List p14)
    {
        int v5 = p14.size();
        reflect.Field v10 = android.support.multidex.MultiDex.access$300(p13, "path");
        StringBuilder v9_1 = new StringBuilder(((String) v10.get(p13)));
        String[] v4 = new String[v5];
        java.io.File[] v3 = new java.io.File[v5];
        java.util.zip.ZipFile[] v6 = new java.util.zip.ZipFile[v5];
        dalvik.system.DexFile[] v2 = new dalvik.system.DexFile[v5];
        java.util.ListIterator v8 = p14.listIterator();
        while (v8.hasNext()) {
            java.io.File v0_1 = ((java.io.File) v8.next());
            String v1 = v0_1.getAbsolutePath();
            v9_1.append(58).append(v1);
            int v7 = v8.previousIndex();
            v4[v7] = v1;
            v3[v7] = v0_1;
            v6[v7] = new java.util.zip.ZipFile(v0_1);
            v2[v7] = dalvik.system.DexFile.loadDex(v1, new StringBuilder().append(v1).append(".dex").toString(), 0);
        }
        v10.set(p13, v9_1.toString());
        android.support.multidex.MultiDex.access$400(p13, "mPaths", v4);
        android.support.multidex.MultiDex.access$400(p13, "mFiles", v3);
        android.support.multidex.MultiDex.access$400(p13, "mZips", v6);
        android.support.multidex.MultiDex.access$400(p13, "mDexs", v2);
        return;
    }

Method com.google.android.gms.internal.zzax.zzm() calling method dalvik.system.DexClassLoader.<init>()


    private boolean zzm(String p10)
    {
        try {
            String v0_4 = this.zzagf.getCacheDir();
        } catch (String v0_13) {
            throw new com.google.android.gms.internal.zzaw(v0_13);
        } catch (String v0_12) {
            throw new com.google.android.gms.internal.zzaw(v0_12);
        } catch (String v0_11) {
            throw new com.google.android.gms.internal.zzaw(v0_11);
        } catch (String v0_10) {
            throw new com.google.android.gms.internal.zzaw(v0_10);
        }
        if (v0_4 == null) {
            v0_4 = this.zzagf.getDir("dex", 0);
            if (v0_4 == null) {
                throw new com.google.android.gms.internal.zzaw();
            }
        }
        int v1_0 = v0_4;
        String v2_0 = com.google.android.gms.internal.zzav.zzax();
        Object[] v3_0 = this.zza(p10, v1_0, v2_0);
        this.zzb(v1_0, v2_0);
        this.zzagh = new dalvik.system.DexClassLoader(v3_0.getAbsolutePath(), v1_0.getAbsolutePath(), 0, this.zzagf.getClassLoader());
        this.zza(v3_0);
        this.zza(v1_0, v2_0);
        Object[] v3_3 = new Object[2];
        v3_3[0] = v1_0;
        v3_3[1] = v2_0;
        this.zzn(String.format("%s/%s.dex", v3_3));
        return 1;
    }