コンテンツにスキップ

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のリスクを軽減するため、開発者は以下の対策を実施する必要があります。

  • 必要不可欠な場合を除き、動的なクラス読み込み(Dynamic Class Loading)メソッドの使用を避ける。
  • 読み込まれるクラスが信頼できるソースからのものであることを確認する。
  • 読み込まれるクラスが他のアプリケーションから書き込み不可であることを確認する。
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