
倫理的ハッキング向けのAndroidディープリンク、Intent、WebViewブリッジ評価支援ツール
Android deeplink、Intent、WebViewブリッジの評価支援ツール
apk-interceptorは、許可されたアプリケーションセキュリティ評価のためのポータブルなAndroidテストAPKです。セキュリティエンジニアが、AndroidアプリがカスタムURIスキーム、ディープリンク、エクスポートされたActivity、WebView JavaScriptブリッジなどの外部エントリポイントをどのように処理するかを検証するのに役立ちます。
このツールは意図的に制約されています:
android.permission.INTERNET を宣言しませんcontent:// ペイロードファイルを1つだけ配信しますAndroidアプリケーションのセキュリティ評価中、静的解析による多くの発見事項は、確認される前にデバイス上での小さな概念実証(PoC)が必要です:カスタムURIスキームの登録、明示的インテントの送信、ローカル content:// ペイロードの配信、またはJavaScriptがWebViewブリッジに到達できるかどうかの確認などです。
ケースごとに新しい使い捨てテストアプリを構築するのは反復的でエラーが発生しやすい作業です。マニフェストエントリ、オーソリティ、URI許可、パッケージ名、またはインテント構築のわずかな違いが検証を遅らせ、結果の再現を難しくする可能性があります。
apk-interceptorは、その確認ステップを再現可能にするために作成されました。評価のたびに新しいPoC APKを書く代わりに、必要な許可されたスキームまたはアプリケーションIDでこのツールをビルドし、デバイス上でテストを実行し、設計上制約されたワークフローを維持します:INTERNET権限なし、外部データ送信なし、シェル実行なし、root依存なし。
apk-interceptorは以下の評価タスクに役立ちます:
詳細な脆弱性ウォークスルー:
content:// を介したWebView JavaScriptブリッジの露出アプリは、送信したインテント、受信したディープリンク、ブリッジコールバック、JavaScriptの結果、およびエラーのインメモリ評価ログを保持します。アプリのプロセスが終了するとログは消えます。ログは永続化されないため、作業中にスクリーンショットや画面録画で証拠を記録してください。
apk-interceptorは**確認(confirmation)**ツールであり、発見(discovery)や悪用(exploitation)のフレームワークではありません。静的解析からテスト対象(スキーム、Activityクラス、ブリッジ名)をすでに把握していることを前提とし、到達可能性を検証して証拠を記録するための安全なオンデバイス手段を提供します。評価デバイスにインストールし、クライアントと共有することも想定して構築されているため、INTERNET権限、シェル実行、データ外部送信、root要件は一切含まれていません。
一般的なAndroidツール群との位置づけは以下のとおりです:
apk-interceptorが代替ツールに対して最も明確な優位性を持つ2つの領域:
adb/静的解析では示せないものです。content:// → WebViewブリッジの検証:非エクスポートの単一ファイルプロバイダで、ペイロードは一時的なインテント読み取り許可を通じてのみ配信され、さらにペイロードの構文を先に検証するローカルセルフテストWebViewを備えています。apk-interceptorは送信とインターセプトを別物として扱います。これは使用前に理解すべき最も重要な点です:
| アクション | モジュール | ビルド時にカスタムスキームが必要? |
|---|---|---|
| 別のアプリにインテントまたはディープリンクを送信する | Sender | いいえ、実行時に任意のURI、パッケージ、またはActivityを入力します |
| カスタムスキームのディープリンクをインターセプト(受信)する | Interceptor | はい、ビルド時にスキームがAPKに固定されます |
評価対象アプリに細工したディープリンクを送信する場合、再ビルドは不要です。Senderタブの**暗黙的ディープリンク(Implicit Deeplink)**モードを使用して任意のURIを入力してください。
ディープリンクをインターセプトする場合、つまりAndroidがカスタムスキームをapk-interceptorにルーティングさせて潜在的なスキーム乗っ取りを観察できるようにするには、--scheme でそのスキームを指定してAPKをビルドする必要があります。スキームは意図的にビルド時に固定されます(設計上のガードレール)。apk-interceptorは実行時に任意のスキームを登録することは決してありません。評価対象のスキームを変更する場合は、再ビルドして再インストールしてください。
adb評価を許可されたカスタムURIスキームを指定してAPKをビルドします:
./build-interceptor.sh --scheme <authorized_custom_scheme>
adb install ./out/apk-interceptor-<authorized_custom_scheme>-debug.apk
オプションのビルドフラグ:
./build-interceptor.sh \
--scheme <authorized_custom_scheme> \
--app-id <custom.application.id> \
--output ./out
--app-id はビルド時にインストールされるアプリケーションID(デバイス上のパッケージIDと content://<applicationId>.payload オーソリティ)を設定します。デフォルトは com.sterrasec.apkinterceptor です。異なる評価用に複数の個別インストール可能なビルドが必要な場合は、--app-id で上書きしてください。Windowsでは build-interceptor.bat が相当します。
デフォルトのスキーム intercept-poc-example は無害なプレースホルダです。ビルドスクリプトはこのデフォルトスキームで評価用APKを生成することを拒否します。
各アプリバージョンの初回起動時に、apk-interceptorは許可された使用に関するダイアログを表示します。**理解しました(I understand)**をタップすると、同じバージョンでは再度ダイアログは表示されません。Senderタブには、他のアプリにインテントを送信できるため、常時警告が表示されます。
| Sender | Payload | Interceptor |
|---|---|---|
![]() | ![]() | ![]() |
このタブは、カスタムURIスキームのインターセプトを検証するために使用します。
表示される内容:
基本的なワークフロー:
**テストディープリンクを送信(Send Test Deeplink)について:これは常に固定の test ホストで <scheme>://test?<your params> を送信します。したがって、評価対象アプリの特定のディープリンクルートを駆動するためではなく、apk-interceptorがスキームを受信してログに記録することを確認するためのものです。評価対象アプリの必要なホストまたはパスに一致する細工したディープリンクを送信するには、代わりにSenderタブの暗黙的ディープリンク(Implicit Deeplink)**モードを使用してください。
adbの例:
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb\&message=hello%20world'
adb shell で複数のクエリパラメータを送信する場合は \& を使用してください。そうしないと、デバイスのシェルが & をコマンド区切り文字として扱う可能性があります。
期待される結果:
RECEIVED ログエントリが表示されるこのタブは、許可されたテスト中に制御されたインテントを送信するために使用します。
モード:
Intent(ACTION_VIEW, Uri.parse(uri)) を送信しますフィールドとコントロール:
暗黙的ディープリンクのワークフロー:
明示的Activityのワークフロー:
注:
content:// の添付は、対象のActivityが信頼できないインテントデータをWebViewに渡すかどうかをテストするときに役立ちます。data として配信されるため、**暗黙的ディープリンク(Implicit Deeplink)**モードで入力したURIを上書きしてしまうので、そこではオプションが非表示になります。PayloadProvider はエクスポートされていません。評価対象アプリが添付された content:// ペイロードを読み取れるのは、FLAG_GRANT_READ_URI_PERMISSION によってインテントが一時的な読み取りアクセスを許可するためだけです。そのフラグを有効にしたままにし、インテントを通じてURIを配信してください。他の方法で開かれた content:// URIは、別のアプリからは読み取れません。このタブは、ローカルのHTMLペイロードを作成し、apk-interceptor自身のセルフテストWebViewでJavaScriptブリッジの構文を検証するために使用します。
含まれる内容:
content:// URI生成されるペイロードURIの形式:
content://<applicationId>.payload/current.html
プロバイダはこの固定ファイルのみを配信します:
filesDir/payloads/current.html
ペイロードのセルフテストワークフロー:
localBridge)を入力します。BRIDGE_RESULT、console.log、evaluateJavascript result エントリを確認します。セルフテストJavaScriptの例:
console.log("payload loaded");
window.localBridge.logResult(window.localBridge.getInfo());
セルフテストブリッジが公開するもの:
window.<bridgeName>.logResult("message");
window.<bridgeName>.getInfo();
重要な制限:
セルフテストWebViewは、ローカルペイロードとブリッジ呼び出しの構文がapk-interceptor内で動作することを確認します。別のアプリのWebViewがペイロードを実行したか、独自のブリッジを呼び出したかを観察することはできません。評価対象アプリについては、そのアプリのUI、ログ、テストフック、またはアプリがデバッグ可能な場合はChrome DevToolsで確認してください。
リスク:
Androidアプリが検証済みのApp Linkの代わりにカスタムURIスキームを登録しています。他のアプリも同じスキームを登録できるため、Androidがアプリ選択ダイアログを表示したり、リンクを別のアプリにルーティングしたりする可能性があります。
apk-interceptorで確認できること:
手順:
記録すべき証拠:
リスク:
評価対象アプリが、十分な検証なしにナビゲーション、URL読み込み、機能フラグ、アカウント選択、またはレンダリングのためにディープリンクパラメータを信頼しています。
apk-interceptorで確認できること:
手順:
プレースホルダの例:
my-authorized-scheme://open?next=https%3A%2F%2Fauthorized-test.example%2Flanding
明示的にスコープ内でない限り、実際のサードパーティのドメインやアカウントを使用しないでください。
リスク:
エクスポートされたActivityが、呼び出し元、ユーザー状態、または必要な許可を検証せずに機密アクションを実行したり、機密データを表示したりします。
apk-interceptorで確認できること:
手順:
content:// ペイロードURIを添付します。記録すべき証拠:
content:// を介したWebView JavaScriptブリッジの露出リスク:
評価対象アプリが、addJavascriptInterface を介してJavaScriptブリッジも公開するWebViewに、信頼できない content:// インテントデータを読み込みます。
apk-interceptorで確認できること:
content:// として配信できるかどうか手順:
重要な制限:
apk-interceptorは、別のアプリが明示的に結果を返したり表示したりしない限り、そのアプリから結果を受け取ることはできません。このツールは、ローカルペイロードを配信して構文を検証するように設計されており、データを外部送信するためのものではありません。
APKがネットワークアクセスを要求しないことを確認します:
aapt dump permissions ./out/apk-interceptor-<scheme>-debug.apk
期待される結果:android.permission.INTERNET がないこと。
apk-interceptorへのディープリンクを明示的にトリガーします:
adb shell am start -W \
-n com.sterrasec.apkinterceptor/.InterceptActivity \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
Androidのリゾルバ経由でディープリンクをトリガーします:
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
明示的なコマンドは InterceptActivity の動作を確認します。暗黙的なコマンドはマニフェストのインテントフィルタとリゾルバの動作を確認します。
ユニットテストはRobolectricを使用してJVM上で実行されるため、デバイスやエミュレータは不要です。PayloadProvider をカバーしており、プロバイダが単一の current.html ペイロード以外を配信しないようにするパスホワイトリストとトラバーサルチェックを含みます。
./gradlew testDebugUnitTest
テスト結果は app/build/reports/tests/testDebugUnitTest/index.html に書き込まれます。同じタスクが main へのすべてのプッシュとプルリクエストでCIに実行されます。
android.permission.INTERNET なしPayloadProvider は /current.html のみを配信しますMIT
| シナリオ | モジュール | 検証に役立つ内容 |
|---|
| カスタムURIスキームの乗っ取り | Interceptor | 別のアプリが同じカスタムスキームを登録してリンクを受信できるかどうか |
| ディープリンクパラメータの処理 | Sender | 評価対象アプリが安全でないクエリ/パスパラメータを受け入れるかどうか |
| エクスポートされたActivityの露出 | Sender | エクスポートされたActivityが別のアプリから直接起動できるかどうか |
content:// を介したWebViewブリッジの露出 | Payload + Sender | ローカルのHTMLペイロードがWebView JavaScriptブリッジに到達できるかどうか |
| ローカルペイロードの構文チェック | Payload | HTML/JSペイロードがセルフテストWebViewで実行されるかどうか |
| ツール | 役割 | apk-interceptorとの違い |
|---|
| jadx / MobSF / QARK / Semgrep | 脆弱なエントリポイントを(静的に)発見する | apk-interceptorはスキャンや逆コンパイルを行いません。すでにある発見事項を確認します |
deep-C / NSdeepLink / adb am start | ディープリンクを列挙・送信する | apk-interceptorも送信できますが、差別化点は乗っ取ったスキームを受信して正確なURIとパラメータを表示することです |
| drozer | 汎用オンデバイス攻撃フレームワーク(エージェント+多くの場合root) | apk-interceptorは意図的な安全ガードレールを備えた単一の軽量APKで、範囲がより狭く、クライアントに安全に配布しやすいです |
| Metasploit / Frida | 武器化またはフッキング(例:addJavascriptInterface RCE) | apk-interceptorは無害なペイロードでブリッジの到達可能性を確認するだけです。データを外部送信したり、シェルコマンドを実行したりすることは決してありません |