Hello there, ('ω')ノ
📦 テンポラリファイルとは?
テンポラリ(temp)ファイルとは、アプリが一時的な処理のために作成するファイルのことです。
たとえば:
- 圧縮ファイルを一時的に展開する
- ユーザーの画像を一時的に加工する
- 入力フォームの下書きを保存しておく
処理後に削除される前提で作られるため、開発者もセキュリティ対策をおろそかにしがちです。
💣 よくある脆弱性パターン
| パターン | 説明 |
|---|---|
| 削除し忘れ | 一時ファイルが削除されず、機密情報が端末内に残る |
| アクセス制限の欠如 | 誰でも読み書きできる場所(外部ストレージなど)に保存している |
| ファイル名の衝突 | 他アプリと同じファイル名で上書き・乗っ取りが起きる |
| 内容の暗号化なし | パスワードや画像データをそのまま平文で保存している |
🔍 実際のコード例(危険)
File tempFile = new File(Environment.getExternalStorageDirectory(), "temp.txt"); FileWriter writer = new FileWriter(tempFile); writer.write("ユーザーパスワード: 123456"); writer.close();
このコードでは、外部ストレージに平文でtempファイルを作成しており、他のアプリやユーザーが簡単に中身を読めてしまいます。
🧪 診断ポイント
✅ 1. 保存先を確認する
getExternalStorageDirectory()や/sdcard/を使っていないか?getCacheDir()やgetFilesDir()など、内部ストレージに限定されているか?
✅ 2. ファイル名が固定 or ハードコードされていないか?
- 例:
"temp.txt"や"output.jpg"のように毎回同じファイル名だと危険 - 他アプリとファイル名が衝突して、データの乗っ取りや改ざんが可能に
✅ 3. 削除処理があるか?
tempFile.delete()やdeleteOnExit()のようなクリーンアップ処理があるか?- 削除せず放置すると、いつまでも情報が残るリスクがある
✅ 4. 中身の暗号化がされているか?
- 機密性の高いデータ(パスワード、画像、トークン)などがそのまま保存されていないか?
- AESなどの暗号化処理を挟んでいるか?
🛡️ 安全な実装のために
| 対策 | 内容 |
|---|---|
| 内部ストレージを使う | getCacheDir() や createTempFile() を活用し、外部には出さない |
| ファイル名にランダム性を持たせる | UUIDなどを使って、予測不能なファイル名にする |
| 書いたら消す | 用が済んだら delete() を必ず実行する |
| 暗号化を検討する | 一時的とはいえ、機密データにはAES等の暗号化をかける |
| アプリ終了時に掃除する | アプリの onDestroy() やバックグラウンド化時に削除処理を仕込む |
🧠 実際にあった事故例
- バグ報告機能で撮影したスクリーンショットが外部ストレージに残っていた → ユーザーの個人情報やチャット内容が漏洩
- 音声メモアプリで録音データがtempとして保存され、削除されず放置 → 他アプリがそれを再生・コピーできてしまった
- 一時ファイルの名前が固定で、別アプリがその名前を使って悪用 → 意図しない動作やファイル改ざんが発生
✅ まとめ
- Tempファイルは「一時的」な存在でも、セキュリティの穴になりやすい
- 保存先・ファイル名・削除処理・暗号化の4点を必ずチェック
- Androidでは外部ストレージ=他アプリもアクセス可能な危険領域と理解すること
- MobSFや手動診断でファイル操作の箇所を特定し、動作と実害を検証することが重要!
Best regards, (^^ゞ