機密情報の平文保存

機密情報の平文保存

説明

パスワード、トークン、APIキーなどの認証用シークレットを平文のファイルやシリアライズしたデータに保存すると、保存先へのアクセス権を得た攻撃者が値をそのまま読み取れます。

想定される影響

  • アカウントやセッションの乗っ取り、APIキーの悪用につながる可能性があります。
  • ログ、バックアップ、一時ファイルに機密情報が長期間残る可能性があります。
  • 侵害による被害がアプリケーションの保存領域以外にも広がる可能性があります。

対処方法

  • ファイルにはシークレットそのものではなく、不透明な参照値を保存してください。
  • 保存が必要な場合は、信頼できる暗号ライブラリで暗号化し、鍵を別途管理してください。
  • 元のパスワードではなく、Argon2id、bcrypt、PBKDF2などによるパスワードハッシュを保存してください。
  • ログ、JSON/YAML設定ファイル、一時ファイルにもシークレットを平文で残さないでください。

例

変更前

python
from pathlib import Path
from flask import request

def bad_password_file():
    password = request.args.get("password")
    Path("/var/app/password.txt").write_text(password)

変更後

python
from argon2 import PasswordHasher

def safe_password_hash(password):
    return PasswordHasher().hash(password)

説明:

  • 変更前: ユーザーのパスワードを平文ファイルに書き込みます。
  • 変更後: パスワード専用のハッシュを使用し、元の値を永続化しません。

参考資料