Shikata Ga Nai

Private? There is no such things.

第41回:ファイル操作に潜む脆弱性(例:tempファイル)

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