Files
claude-howto/ja/06-hooks/security-scan.sh
T
Luong NGUYEN b9a973bf32 docs: accuracy pass against Claude Code v2.1.220 (#155)
Internal accuracy pass against v2.1.220 — no missing upstream features, but broken example code, disagreeing counts, and metadata drift.

Functional fixes: pre-commit.sh now exits 2 so it actually blocks; dependency-check.sh reads file_path from stdin JSON instead of $1; database-mcp.json uses ${DATABASE_URL}; broken fences repaired; three command templates had invalid skill names.

Factual corrections: /fork and /subtask unswapped and /subtask added; /fewer-permission-prompts; permissions.defaultMode; dontAsk/auto unreversed; 31 hook events verified name-by-name; subagent depth 3; skill precedence enterprise > project > personal; /output-style removed not deprecated; permissionDecision gained defer.

Follow-up review fixed defects the pass left behind: zh/vi headers claiming 31 events above 25-name lists, a surviving hardcoded DB credential in the MCP README examples, an unbalanced fence swallowing a metadata footer, and non-canonical tool names. All four translated CATALOG summary tables were recounted so their arithmetic holds.

Full detail in CHANGELOG.md under v2.1.220-r2.
2026-08-04 15:41:12 +07:00

79 lines
3.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ファイル書き込み時のセキュリティスキャン
# フック:PostToolUsematcher: Write
#
# ハードコードされたシークレット・API キー・認証情報をファイルからスキャンする。
# 検出時は additionalContext を介して非ブロッキングの警告を出力する。
#
# 対応:macOS、Linux、WindowsGit Bash
# Claude Code フックプロトコルに従い、標準入力から JSON を読み取る
INPUT=$(cat)
# sed で file_path を抽出(Windows Git Bash を含む全プラットフォーム互換)
# grep -PWindows Git Bash で使えない)と python3 依存を避ける
FILE_PATH=$(echo "$INPUT" | sed -n 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
if [ -z "$FILE_PATH" ] || [ ! -f "$FILE_PATH" ]; then
exit 0
fi
# バイナリファイル・ベンダディレクトリ・ビルド成果物はスキップ
case "$FILE_PATH" in
*.png|*.jpg|*.jpeg|*.gif|*.svg|*.ico|*.woff|*.woff2|*.ttf|*.eot) exit 0 ;;
*/node_modules/*|*/.git/*|*/dist/*|*/build/*) exit 0 ;;
esac
ISSUES=""
# ハードコードされたパスワードの検出
# JSON 形式("password": "value")とコード形式(password = 'value')の両方に対応
# 区切り文字には \\n を使う — JSON の改行エスケープとして有効で、printf でも安全に通る
if grep -qiE '"password"[[:space:]]*:[[:space:]]*"[^"]+"' "$FILE_PATH" 2>/dev/null; then
ISSUES="${ISSUES}- 警告: ハードコードされたパスワードの可能性を検出\\n"
elif grep -qiE '(password|passwd|pwd)[[:space:]]*=[[:space:]]*'"'"'[^'"'"']+'"'"'' "$FILE_PATH" 2>/dev/null; then
ISSUES="${ISSUES}- 警告: ハードコードされたパスワードの可能性を検出\\n"
fi
# ハードコードされた API キーの検出
if grep -qiE '"(api[_-]?key|apikey|access[_-]?token)"[[:space:]]*:[[:space:]]*"[^"]+"' "$FILE_PATH" 2>/dev/null; then
ISSUES="${ISSUES}- 警告: ハードコードされた API キーの可能性を検出\\n"
fi
# ハードコードされたシークレット・トークンの検出
if grep -qiE '(secret|token)[[:space:]]*=[[:space:]]*['"'"'"][^'"'"'"]+['"'"'"]' "$FILE_PATH" 2>/dev/null; then
ISSUES="${ISSUES}- 警告: ハードコードされたシークレットまたはトークンの可能性を検出\\n"
fi
# 秘密鍵の検出
if grep -q "BEGIN.*PRIVATE KEY" "$FILE_PATH" 2>/dev/null; then
ISSUES="${ISSUES}- 警告: 秘密鍵を検出\\n"
fi
# AWS アクセスキーの検出
if grep -qE "AKIA[0-9A-Z]{16}" "$FILE_PATH" 2>/dev/null; then
ISSUES="${ISSUES}- 警告: AWS アクセスキーを検出\\n"
fi
# semgrep が利用可能ならスキャン(JSON 出力との混在を避けるため stdout は抑止)
if command -v semgrep &> /dev/null; then
semgrep --config=auto "$FILE_PATH" --quiet >/dev/null 2>/dev/null
fi
# trufflehog が利用可能ならスキャン(JSON 出力との混在を避けるため stdout は抑止)
if command -v trufflehog &> /dev/null; then
trufflehog filesystem "$FILE_PATH" --only-verified --quiet >/dev/null 2>/dev/null
fi
# 問題が見つかったら additionalContext として出力(非ブロッキング警告)
# Claude Code PostToolUse プロトコルが要求する hookSpecificOutput 形式を使う
if [ -n "$ISSUES" ]; then
# ファイルパスを JSON 用にエスケープ(バックスラッシュとダブルクォート)
# ISSUES は既に \\n を区切り文字に用いている(有効な JSON エスケープ)— ダブルクォートのみエスケープする
SAFE_PATH=$(printf '%s' "$FILE_PATH" | sed 's/\\/\\\\/g; s/"/\\"/g')
SAFE_ISSUES=$(printf '%s' "$ISSUES" | sed 's/"/\\"/g')
printf '{"hookSpecificOutput": {"hookEventName": "PostToolUse", "additionalContext": "セキュリティスキャンで %s に問題を検出しました:\\n%s環境変数の使用を検討してください。"}}' "$SAFE_PATH" "$SAFE_ISSUES"
fi
exit 0