Hello there, ('ω')ノ
✅ 診断対象アプリ(再掲)
- アプリ名:NotepadApp(架空の脆弱なメモ帳アプリ)
- 主な機能:メモ作成/削除/閲覧/共有
- 特徴:ログイン機能なし、データはSQLite、他アプリとの連携あり
🎯 今回の診断目的
「開発者が意図していないのに、外部に公開されてしまっている情報や機能」を見つけ出す
たとえば:
- ExportedなActivity
- 公開されたコンテンツプロバイダ
- 共有ボタンの挙動
- 外部から呼べるBroadcastReceiver など
🧪 Step 1:Drozerでコンポーネント診断
まずはDrozerでアプリ内の公開コンポーネントを洗い出します。
run app.package.attacksurface com.example.notepadapp
出力例:
Activities: - com.example.notepadapp.ui.ViewNoteActivity [exported=true] Content Providers: - com.example.notepadapp.provider.Notes Receivers: - com.example.notepadapp.receiver.ShareReceiver [exported=true]
👉 複数のコンポーネントが 外部に公開(exported)されていることが確認できました。
🧪 Step 2:共有機能の挙動を確認
アプリには「メモを共有する」ボタンがあり、他のアプリにメモを送ることができます。
疑わしい挙動:
- 本来はSNSなどに共有する用途だが、どんなアプリからでもメモを受け取れてしまう
- 外部アプリがこの共有Intentを悪用して任意データを挿入できるかも?
am start -a android.intent.action.SEND \ -t "text/plain" \ --es android.intent.extra.TEXT "テストメモ" \ com.example.notepadapp/.receiver.ShareReceiver
👉 開発者が想定しない形式のIntentでも受け入れてしまう脆弱な設計
🧪 Step 3:Logcatに機密情報が出ていないか確認
adb logcat | grep -i "note"
出力例:
D/NoteManager: 保存されたメモ内容 → パスワード一覧
👉 ログに重要なメモ内容がそのまま出力されている これは開発者が**「開発中だけのつもり」で残してしまったコード**の可能性があります。
✅ 今回発見された“意図しない情報公開”まとめ
| 種類 | 脆弱性内容 | 想定されるリスク |
|---|---|---|
| Exported Activity | 認証なしで画面が呼び出される | メモの盗み見や不正操作の可能性 |
| Content Provider | URIから誰でも読み取れる | 全ユーザーのメモ情報が外部流出 |
| Exported Receiver | 不正なIntentで任意コードが実行 | アプリ動作を外部から制御される可能性 |
| Logcat出力 | メモ内容が平文で出力される | デバッグログからの情報漏洩 |
✅ 対応策のポイント
| 問題 | 対策方法 |
|---|---|
| Exported Activity/Receiver | AndroidManifest.xmlで exported="false" に明示的に設定する |
| Content Provider | android:exported="false" + アプリ内で checkPermission() 実装 |
| Logcat出力 | BuildConfig.DEBUG を使って本番環境ではログ出力を止める |
| 共有機能の制御 | intent.getPackage() で許可されたアプリのみ許容する仕組みに |
✅ まとめ
- アプリは意図しない公開ポイントが多くなりがち
- DrozerやIntentを使った動作検証で、それらを特定することができる
- Manifestファイルの見直しと、コードレベルの制御の両面から対策する必要がある
- 特に企業アプリや個人情報を扱うアプリでは、これらの診断は必須!
Best regards, (^^ゞ