跳转至

Android Class Loading Hijacking

Android 类加载劫持

描述

Android Class Loading Hijacking 是一种安全漏洞,攻击者可以通过利用 Android 加载类的方式,在 Android 设备上执行恶意代码。这通常是通过欺骗 Android 系统加载恶意类而非预期类来实现的。攻击者随后可以利用此恶意类获取对敏感数据的未授权访问权限、操纵设备功能,甚至完全控制设备。此漏洞极其危险,因为可以在用户不知情的情况下被利用,并且会影响任何未对其类加载过程进行妥善安全处理的应用程序。

public final class DexClassLoaderCall {

    private static final String TAG = DexClassLoaderCall.class.toString();

    @Override
    public String getDescription() {
        return "Use of dex class load";
    }

    @Override
    public void run() throws Exception {
        /*
            Dex class loading from external storage
         */
        String apkFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/app.apk";
        DexClassLoader classLoader1 = new DexClassLoader(
                apkFile,
                apkFile,
                apkFile,
                ClassLoader.getSystemClassLoader());
        classLoader1.loadClass("a.b.c");

        /*
            Dex class loading from hard-coded sdcard path
         */
        DexClassLoader classLoader2 = new DexClassLoader(
                "/sdcard/test.apk",
                "/sdcard/test.apk",
                "/sdcard/test.apk",
                ClassLoader.getSystemClassLoader());
        classLoader2.loadClass("a.b.c");

    }
}

建议

为了降低 Android Class Loading Hijacking 的风险,开发人员应当:

  • 除非绝对必要,否则避免使用动态类加载方法。
  • 确保加载的类来自受信任的来源。
  • 确保加载的类不可被其他应用程序写入。
public final class DexClassLoaderCall {

    private static final String TAG = DexClassLoaderCall.class.toString();

    @Override
    public String getDescription() {
        return "Use of dex class load";
    }

    @Override
    public void run() throws Exception {
        Context context = getContext(); 
        File apkFile = new File(context.getFilesDir(), "app.apk");
        DexClassLoader classLoader1 = new DexClassLoader(
                apkFile.getAbsolutePath(),
                context.getCacheDir().getAbsolutePath(),
                null,
                context.getClassLoader());
        classLoader1.loadClass("a.b.c");

        DexClassLoader classLoader2 = new DexClassLoader(
                context.getPackageCodePath(),
                context.getCacheDir().getAbsolutePath(),
                null,
                context.getClassLoader());
        classLoader2.loadClass("a.b.c");
    }
}

链接

标准

  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_9
  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY251
    • SECURITY212
    • SECURITY213