Hello there, ('ω')ノ
📮 インテントフィルタとは?
インテントフィルタ(intent-filter)とは、アプリのどの機能(Activity, Service, BroadcastReceiverなど)が、どんなインテント(Intent)を受け取れるかを定義するものです。
AndroidManifest.xml の中で、次のように記述されます:
<activity android:name=".MyActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="myapp" /> </intent-filter> </activity>
この設定により、他のアプリやWebページから myapp:// で始まるリンクを受け取れるようになります。
⚠️ 設定ミスが引き起こすリスク
| ミスのタイプ | 内容 | 結果 |
|---|---|---|
exported="true" かつ認証なし |
外部アプリから自由に呼び出し可能 | 本来の操作が外部から実行される |
data属性の範囲が広すぎる |
android:scheme や android:host があいまい |
意図しないデータで動作 |
機密処理にintent-filterがある |
意図しないアクティビティが公開 | パスワード変更・設定初期化などが外部操作可に |
| 権限のないコンポーネントがインテントを受け取る | 検証不足のまま処理を実行 | インテントインジェクションが成立 |
💥 攻撃者が悪用する方法
攻撃者は以下のような手段でインテントを送信し、アプリの機能を不正に呼び出そうとします。
✅ ADBを使った例:
adb shell am start -n com.example.app/.MyActivity -a android.intent.action.VIEW -d "myapp://malicious"
✅ 他アプリからのIntent送信(コード)
Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.app", "com.example.app.MyActivity")); intent.setData(Uri.parse("myapp://malicious")); startActivity(intent);
これにより、本来内部だけで使うつもりだったアクティビティが外部から操作されてしまうのです。
🧪 診断ポイント
🔍 1. Manifestファイルの確認
exported="true"の有無intent-filterがついている Activity / Service / Receiver の一覧data属性の指定が適切かどうか(scheme、host、path)
🔍 2. Drozerを使って検証
Drozerコマンド例:
run app.activity.info -a com.example.app run app.activity.start --component com.example.app com.example.app.MyActivity
→ 外部から起動できるアクティビティやサービスがないかを確認し、実行時にどんな処理が行われるか観察します。
🛡️ 対策方法
| 対策 | 内容 |
|---|---|
| exportedの適切な設定 | Android 12以降は exported="false" がデフォルト。必要な場合のみ明示的に true に |
| 意図しないコンポーネントにintent-filterをつけない | 公開する必要があるものだけに設定 |
| インテントの中身を検証する | 受け取ったデータやパラメータにバリデーションを入れる |
| 権限付きインテントで制限する | android:permission 属性を使って特定のアプリにだけ許可する |
| Web経由でのリンク制御 | android:autoVerify="true" を使って信頼されたドメインからのみ起動可能にする(DeepLink用) |
✅ まとめ
- インテントフィルタはアプリの“入口”の設計図。ミスがあれば外部から自由に侵入されてしまう
- Manifestの
exportedやintent-filterの定義は公開範囲を明確に設計することが重要 - 診断では、外部から呼び出せるアクティビティ/サービス/ブロードキャストをリストアップし、誤動作や情報漏洩が起きないかを確認
- “本来は社内向けの裏口”が、外部にも開いていないか? それが今一度のチェックポイントです
Best regards, (^^ゞ