Shikata Ga Nai

Private? There is no such things.

第37回:インテント爆発:悪用される「Exported」設定

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 操作できる場合、それは致命的な脆弱性です。

たとえば:

  • ユーザー情報の表示
  • 設定変更
  • ファイル削除
  • トークンの取得など

🧠 攻撃者の視点:インテント爆発の流れ

  1. 対象アプリのManifestを解析し、exportedなコンポーネントを特定
  2. ADBや自作アプリからそのコンポーネントにインテントを送る
  3. アプリが本来意図していない画面や処理を実行してしまう
  4. 認証バイパス・情報漏洩・任意の操作につながる

🛡️ 防止するには?

対策 内容
不要なexportedを排除 外部に公開する必要がないコンポーネントには exported="false" を明示
必ず認証処理を入れる ExportedなActivityやService内でも、トークンやログイン状態の確認を必ず行う
Intentの送信元チェック getCallingPackage()getReferrer() などを活用して送信元アプリを検証
ブロードキャストに署名レベル制限を android:permission 属性を使って制限をかける
Android 12以降のガイドライン遵守 exported の明示や制限付きIntentの使用を徹底

✅ まとめ

  • Exportedの設定ミスは、アプリの内部処理を外部にさらしてしまう重大な脆弱性
  • 「インテント爆発」として、攻撃者にアプリを好き放題操作される入口になる
  • 静的解析(Manifest確認)+ 動的検証(ADB/Drozer)で診断可能
  • 基本は「exportしない」「認証する」「送信元をチェックする」の3原則!

Best regards, (^^ゞ