Security Audit Skill
Python コードのセキュリティをレビューするときは、このチェックリストと分析パターンを使ってください。
セキュリティ脆弱性チェックリスト
入力バリデーション
- すべてのユーザー入力が検証されているか
- SQL インジェクションのリスクがないか
- ファイルパストラバーサルのリスクがないか
- バッファオーバーフローのリスクがないか
- 型チェックが適切に行われているか
認証・認可
- パスワードが平文で保存されていないか
- パスワードが十分なハッシュ関数(bcrypt, argon2)を使用しているか
- JWT トークンの検証が行われているか
- セッション管理が適切か
- 権限チェックが実装されているか
暗号化・データ保護
- 機密データが暗号化されているか
- 通信が HTTPS/TLS で保護されているか
- キーの管理が安全か(環境変数、シークレット管理)
- ログに機密情報が含まれていないか
エラーハンドリング
- エラーメッセージが詳細すぎないか(情報漏洩のリスク)
- 例外を適切にキャッチしているか(bare except なし)
- スタックトレースが公開されていないか
外部依存
- サードパーティライブラリが信頼できるか
- 依存関係が最新版か(セキュリティパッチが当たっているか)
- 不要な依存関係を削除しているか
コード実行
- eval(), exec() を使用していないか
- pickle を信頼できないデータで使用していないか
- subprocess で shell=True を使用していないか
- 動的コード生成が安全か
ファイルアクセス
- ファイルパーミッションが適切か
- ファイルの読み書き時に例外処理をしているか
- 一時ファイルが安全に作成・削除されているか
- 機密ファイルがバージョン管理に含まれていないか
環境設定
- API キーがハードコードされていないか
- Debug モードが本番環境で有効になっていないか
- デフォルト認証情報を使用していないか
セキュリティ分析パターン
パターン 1: 入力バリデーション関数の分析
# チェックするコード
def validate_and_process_user_input(user_input: str) -> dict:
"""ユーザー入力を検証して処理する."""
# 分析ポイント:
# 1. 入力の型チェックがあるか
# 2. 長さ制限があるか
# 3. 許可される文字が制限されているか
# 4. 範囲チェックがあるか
# 5. エラーハンドリングが適切か
pass
パターン 2: 認証・パスワード処理の分析
# チェックするコード
def hash_password(password: str) -> str:
"""パスワードをハッシュ化する."""
# 分析ポイント:
# 1. ハッシュ関数は安全か (bcrypt, argon2, scrypt vs MD5, SHA1)
# 2. ソルトが使用されているか
# 3. イテレーション回数は十分か
# 4. メモリコストの設定は適切か
pass
パターン 3: 外部データ処理の分析
# チェックするコード
import pickle
def load_data(filename: str):
"""ファイルからデータを読み込む."""
# 分析ポイント:
# 1. pickle を信頼できないソースで使用していないか
# 2. json, yaml, xml は安全か
# 3. シリアライゼーション方式の安全性
pass
出力フォーマット
次の形式で結果をまとめてください。
# Security Audit: [filename]
## 総合リスク評価: [LOW / MEDIUM / HIGH / CRITICAL]
## 検出された脆弱性
### 脆弱性 1: [タイトル]
**重大度**: [LOW / MEDIUM / HIGH / CRITICAL]
**ファイル/行番号**: [location]
**説明**: [詳細説明]
**影響**: [セキュリティへの影響]
```python
# 問題のあるコード
problematic_code()
修正提案:
# 修正後のコード
fixed_code()
脆弱性 2: [タイトル]
[同じフォーマット]
セキュリティベストプラクティスの実装状況
- 入力バリデーション: [完全 / 部分的 / 未実装]
- 認証: [完全 / 部分的 / 未実装]
- 暗号化: [完全 / 部分的 / 未実装]
- エラーハンドリング: [完全 / 部分的 / 未実装]
- ログ記録: [完全 / 部分的 / 未実装]
改善の優先順位
緊急 (CRITICAL)
- [脆弱性]
高 (HIGH)
- [脆弱性]
中 (MEDIUM)
- [脆弱性]
低 (LOW)
- [脆弱性]
推奨する次のステップ
- [提案1]
- [提案2]
- [提案3]
## チェックリスト別の分析方法
### 1. パスワードセキュリティ分析
パスワード処理関数を見つけたら、以下をチェック:
- ハッシュ関数の種類
- ソルトの存在と生成方法
- ストレッチング回数
- タイミング攻撃対策
### 2. 入力バリデーション分析
外部入力を受け取るすべての場所をチェック:
- 型チェック
- 長さチェック
- 文字種チェック
- 範囲チェック
### 3. 依存関係分析
`requirements.txt` を見つけたら、以下をチェック:
- パッケージのバージョン固定方法
- セキュリティアップデートの頻度
### 4. 設定・環境分析
`.env`, `config.py` などを見つけたら:
- ハードコードされた秘密情報
- デバッグモードの有効化
- デフォルト認証情報
## 参考リソース
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [Python セキュリティ ベストプラクティス](https://python.readthedocs.io/en/latest/library/security_warnings.html)
- [CWE - Common Weakness Enumeration](https://cwe.mitre.org/)
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)