Hello there, ('ω')ノ
🔐 パーミッション昇格とは?
パーミッション昇格とは、本来は制限されている操作や情報へのアクセスを、攻撃手法によって不正に得てしまうことを指します。
Androidでは、アプリごとに明示的に許可された操作(パーミッション)しかできないはずですが、他のアプリやOSの機能を悪用することで、許されていない操作を“間接的”に行える場合があります。
💡 たとえばこんな例
| 権限 | 本来できること | 昇格による悪用例 |
|---|---|---|
READ_SMS |
SMSを読む | 権限を持つ他アプリにインテントを送り、内容を取得 |
CALL_PHONE |
電話をかける | 意図せず電話がかかるように仕向ける |
ACCESS_FINE_LOCATION |
GPS情報の取得 | 位置情報付きIntentの受信で取得 |
| システム設定変更 | 通常は不可 | 特権的なBroadcastを利用して書き換え |
🧪 典型的な攻撃手法:権限委譲の悪用
Androidでは、アプリ間で以下のような情報や処理の受け渡し機構(インテントやコンテンツプロバイダ)があります。
攻撃の流れ(例)
- 攻撃者のアプリ(パーミッションなし)
- 権限を持つアプリ(脆弱な実装)
- 処理を受け渡され、権限を持つアプリが「代わりに操作してしまう」
つまり、**「持っていないけど、持ってるふりをして誰かに代行させる」**ようなイメージです。
💥 よくある脆弱なケース
✅ 1. 暗黙的インテントの受信処理に認証がない
Intent intent = getIntent(); String command = intent.getStringExtra("cmd"); if ("reset".equals(command)) { resetAllSettings(); // ← 本来はユーザー操作でしか実行できない処理 }
→ 誰でもこのインテントを送ることで、アプリの設定を勝手にリセットできてしまう。
✅ 2. Exportedコンポーネントがノーガード
<service android:name=".LocationService" android:exported="true" />
→ 外部アプリが自由にServiceを起動できてしまい、位置情報の取得が可能に。
🔍 診断ポイント(静的・動的)
🔎 静的解析(Manifest・コード確認)
exported="true"のコンポーネントが、危険な処理を含んでいないか?- 暗黙的インテント(
IntentFilter)で不特定多数の呼び出しを受けていないか? - コンテンツプロバイダでアクセス制限(パーミッションやURIチェック)があるか?
🧪 動的解析(DrozerやADB)
- Drozerで
run app.activity.infoやrun app.service.startを使い、外部から起動できるActivity/Serviceをリストアップ - 実際に意図しない処理が実行されるかを
adb shell am start ...などで検証
🛡️ 対策方法
| 対策 | 内容 |
|---|---|
| exportedを制限 | Android 12以降は exported の明示と制限が必須 |
| インテントの送信元を検証 | getCallingPackage() や getReferrer() で確認 |
| パーミッションのチェック | 外部からのリクエストには checkCallingPermission() を使う |
| 署名付きアプリだけに許可 | android:protectionLevel="signature" のパーミッションを活用 |
| 不要なインテントやAPIの公開を避ける | 内部利用に限定できる処理は外部に出さない設計にする |
🧠 よくある誤解と現実
| 誤解 | 実際は… |
|---|---|
| 自分のアプリ内だけだから安全 | 外部からインテントを送られると簡単に突破されることも |
| パーミッションが必要な操作だから安心 | それを代わりに実行できる仕組みがないとは限らない |
| DrozerやADBの操作は特殊 | 実は悪意あるアプリが裏で同じことをしている場合もある |
✅ まとめ
- パーミッション昇格とは、「本来できない操作を、権限を持つアプリを通して実行してしまう攻撃」
- 典型的なパターンは、exportedなActivityやServiceに対する未検証なインテント受信
- 診断では、外部から呼び出せる処理の有無と、それに制限があるかどうかを確認することが重要
- 対策の基本は「制限する・検証する・公開しすぎない」の3点!
Best regards, (^^ゞ