Hello there, ('ω')ノ
💣 インテント爆発(Intent Bomb / Intent Hijack)とは?
インテント爆発とは、他アプリから勝手にアプリ内の処理を呼び出す攻撃手法です。
本来アプリの内部でのみ使われるはずの機能(Activity、Service、BroadcastReceiverなど)が、外部にも“公開”されている状態(=exported)だと、攻撃者がそれを悪用してアプリを異常動作させることができます。
⚠️ 「Exported」の基本をおさらい
✅ Exportedの意味
AndroidManifest.xml に定義されるコンポーネント(Activity、Service、Receiver など)に対し、次のように設定できます:
<activity android:name=".AdminActivity" android:exported="true" />
これが true の場合、他のアプリやadbコマンドから自由に呼び出せてしまいます。
❗ 危険なケースの例
- 認証不要の「設定画面」や「管理画面」が外部から起動できる
- BroadcastReceiverに不正なインテントを送って任意コードを実行させる
- アプリ内部でだけ使うServiceが外部からトリガーできてしまう
🧪 実機での診断手順
✅ 1. Manifestファイルを調査(静的解析)
android:exported="true" のついたコンポーネントがどれかを探します。
MobSFを使えば、自動的に「Exported Components」として一覧化されます。
また、Android 12以降では intent-filter がある場合に exported の明示が必須ですが、それ以前のバージョンでは明示しないとデフォルトでtrue扱いになることがあります。
✅ 2. ADBコマンドで呼び出し検証(動的解析)
adb shell am start -n com.example.app/.AdminActivity
このコマンドで対象のActivityが起動できた場合、それは外部からのアクセスが許可されている状態です。
同様にDrozerを使っても確認できます:
run app.activity.start --component com.example.app com.example.app.AdminActivity
✅ 3. 実害の確認
単に起動できるだけでなく、認証不要で機密データが見える or 操作できる場合、それは致命的な脆弱性です。
たとえば:
- ユーザー情報の表示
- 設定変更
- ファイル削除
- トークンの取得など
🧠 攻撃者の視点:インテント爆発の流れ
- 対象アプリのManifestを解析し、exportedなコンポーネントを特定
- ADBや自作アプリからそのコンポーネントにインテントを送る
- アプリが本来意図していない画面や処理を実行してしまう
- 認証バイパス・情報漏洩・任意の操作につながる
🛡️ 防止するには?
| 対策 | 内容 |
|---|---|
| 不要なexportedを排除 | 外部に公開する必要がないコンポーネントには exported="false" を明示 |
| 必ず認証処理を入れる | ExportedなActivityやService内でも、トークンやログイン状態の確認を必ず行う |
| Intentの送信元チェック | getCallingPackage() や getReferrer() などを活用して送信元アプリを検証 |
| ブロードキャストに署名レベル制限を | android:permission 属性を使って制限をかける |
| Android 12以降のガイドライン遵守 | exported の明示や制限付きIntentの使用を徹底 |
✅ まとめ
- Exportedの設定ミスは、アプリの内部処理を外部にさらしてしまう重大な脆弱性
- 「インテント爆発」として、攻撃者にアプリを好き放題操作される入口になる
- 静的解析(Manifest確認)+ 動的検証(ADB/Drozer)で診断可能
- 基本は「exportしない」「認証する」「送信元をチェックする」の3原則!
Best regards, (^^ゞ