Hello there, ('ω')ノ
🗄 SQLiteとは?
SQLiteは、Androidアプリで最も一般的に使われている組み込み型のデータベースです。
アプリ内の以下のようなデータを保存するために使われます:
- ログイン履歴やユーザー設定
- キャッシュ情報やセッション情報
- 位置情報の履歴や検索履歴
- ときにはパスワードやトークンまで(←危険)
アプリの内部ストレージ(/data/data/<パッケージ名>/databases/)に、.db 拡張子のSQLiteファイルとして保存されます。
🛠 診断の準備:実機またはエミュレータへのアクセス
✅ ルート権限が必要(または仮想環境)
SQLiteファイルは通常、アプリ固有のディレクトリ内にあるため、通常の端末ではアクセスできません。 診断には次のいずれかが必要です:
- ルート化されたAndroid実機
- Emulator +
adb rootが可能な設定 - 仮想Android(例:Bluestacks + adb)
- または対象アプリを自分でビルドした診断用APK
🔍 診断ステップ①:SQLiteファイルを取り出す
adb root adb shell cd /data/data/com.example.app/databases/ ls # → example.db などがあれば対象 exit adb pull /data/data/com.example.app/databases/example.db
🧪 診断ステップ②:中身を確認する
取得した .db ファイルは、PC上のSQLiteブラウザやCLIで内容を確認できます。
✅ SQLiteブラウザ(GUI)
- DB Browser for SQLite → テーブル構造・データ内容・検索・エクスポートなどが簡単にできる
✅ コマンドラインでもOK:
sqlite3 example.db sqlite> .tables sqlite> SELECT * FROM users;
🔐 チェックすべき診断ポイント
✅ 1. パスワードやトークンが平文で保存されていないか?
| id | username | password | |----|----------|--------------| | 1 | taro | admin1234 | ←これはNG! | 2 | hanako | 8f9e...(ハッシュ)|
→ 平文保存は完全にアウト。**ハッシュ化(理想的にはソルト付き)**されているかを確認。
✅ 2. 秘密情報が必要以上に保存されていないか?
- アクセストークン
- クレジットカード番号(論外)
- GPSの詳細履歴
- 通信で渡されたIDトークンなど
→ 一時的にしか使わない情報が、永続的に残っていないか?
✅ 3. データにアクセス制御がないか?
- ルートでなくても
.dbにアクセスできてしまう設定はNG - 外部ストレージ(SDカードなど)に保存されていないかも要確認
✅ 4. SQLインジェクションの痕跡がないか?
コードに以下のようなパターンがある場合は注意:
db.rawQuery("SELECT * FROM users WHERE name = '" + userInput + "'", null);
→ ユーザー入力を直接クエリに使っている場合、SQLインジェクションのリスクがある
🧠 SQLite診断のリアルな例
以下のようなケースが、実際の診断で見つかっています:
| 発見された問題 | 影響 |
|---|---|
| 平文のパスワードが複数ユーザー分保存されていた | アカウント乗っ取りのリスク |
| アクセストークンが無期限で保持されていた | 第三者による不正APIアクセス |
| GPS位置履歴が全件保存 | プライバシー侵害 |
🛡️ 対策方法
| 対策 | 内容 |
|---|---|
| パスワードはハッシュ+ソルトで保存 | SHA-256 + 個別ソルトなど |
| 機密情報は一時記憶にとどめる | 保存せず、セッション終了時に削除 |
| SQLiteファイルの権限設定を厳格に | MODE_PRIVATE での保存を徹底 |
| PreparedStatementを使う | SQLインジェクション対策として推奨 |
✅ まとめ
- Androidアプリ内のSQLiteデータベースには重要情報が保存されていることが多く、診断対象として重要
- 実機から
.dbファイルを取得し、GUIまたはCLIで中身を可視化する - パスワードやトークンの平文保存、保存期間、アクセス権限、SQL構文に注目してチェックしよう
- アプリが漏らさないように設計されているか?をデータベースからも見抜くことができる
Best regards, (^^ゞ