Shikata Ga Nai

Private? There is no such things.

第72回:模擬アプリ診断演習②

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, (^^ゞ