説明
パスワード、トークン、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)
説明:
- 変更前: ユーザーのパスワードを平文ファイルに書き込みます。
- 変更後: パスワード専用のハッシュを使用し、元の値を永続化しません。