Hello there, ('ω')ノ
📚 コンテンツプロバイダとは?
Androidでは、アプリ間でデータをやり取りする仕組みとして「コンテンツプロバイダ」が用意されています。
たとえば…
- 電話帳アプリ → 他のアプリから連絡先データを取得できる
- 音楽アプリ → 外部からプレイリストの読み取り・書き込みが可能
というように、アプリがデータを公開・共有するためのインターフェースです。
⚠️ なぜ脆弱性になり得るのか?
本来はアクセス制限(パーミッション)をかけるべきところを、
- 無制限に公開していた
exported=trueで外部からアクセス可能にしていたreadPermission/writePermissionを指定していなかった
などの設定ミスがあると、悪意のあるアプリや診断ツールから中身が抜き取られてしまう恐れがあります。
🛠 Drozerを使った診断のステップ
ではさっそく、Drozerを使って実際に診断してみましょう。
ここでは仮想アプリ com.example.vulnerableapp を例に進めます。
✅ ① URIの一覧を取得する
dz> run app.provider.finduris -a com.example.vulnerableapp
出力例:
content://com.example.vulnerableapp.provider.UserProvider [Read permission: null | Write permission: null]
→ この結果から、「読み書き両方に制限がない」ことがわかります。
✅ ② 実際に中身を読み取ってみる
dz> run app.provider.query content://com.example.vulnerableapp.provider.UserProvider
出力例:
| id | username | password | |----|----------|--------------| | 1 | alice | password123 | | 2 | bob | qwerty! |
→ このように、アプリ内部のユーザーデータが丸見えになってしまう場合があります。これは完全にアウトです!
✅ ③ 書き込みができるかも試す
dz> run app.provider.insert content://com.example.vulnerableapp.provider.UserProvider "username=bob&password=hacked"
→ 書き込みに成功すれば、外部アプリからデータ改ざんができてしまう状態。これは情報漏洩だけでなく不正操作も可能になる重大な脆弱性です。
🔍 さらに深掘りできるDrozerのモジュール
| モジュール名 | 説明 |
|---|---|
app.provider.info |
プロバイダの詳細設定を表示 |
app.provider.query |
実際にデータベースを読み取る |
app.provider.insert |
データの挿入(書き込み)テスト |
app.provider.delete |
データ削除のテスト |
app.provider.update |
データ更新のテスト |
→ 実行可能かどうかを確認することで、「読み取り可能なだけか」「改ざんもできるか」を分類できます。
✅ 診断時のチェックポイント
| チェック項目 | 内容 |
|---|---|
| URIのパスが外部に公開されていないか | content://... にアクセスできてしまう |
| パーミッションが適切に設定されているか | readPermission / writePermission の指定があるか |
| データの読み書き制限が効いているか | Drozerで試してみて反応するか |
| 実際のデータ構造に機微情報が含まれていないか | ユーザー情報、ID、位置情報など |
🧠 なぜこれが危険なのか?
- 誰でもユーザーデータを読み取れる → 個人情報漏洩
- 外部から勝手に書き換えられる → データ改ざんやなりすまし
- ログイン情報などを取得 → アカウント乗っ取りのリスクも
実際の脆弱なアプリでも、テスト用のContent Providerを削除し忘れて公開していたという事例があります。
✅ まとめ
- コンテンツプロバイダはアプリ間のデータ共有の仕組みだが、設定ミスによりデータ漏洩の温床になる
- Drozerを使えば、外部からアクセスできるかを実際に確認できる
- URIの列挙 → データ読み取り・書き込み → パーミッション確認という流れで診断する
- 特に
nullのパーミッション設定には要注意!
Best regards, (^^ゞ