セキュリティ観測。認可漏れ、インジェクション、機密漏えい、暗号誤用、依存脆弱性を検出。Use when: 認証/認可実装、外部入力処理、依存更新、コミット前チェック、セキュリティレビューして、脅威分析が必要な時。
This skill inherits all available tools. When active, it can use any tool Claude has access to.
references/threat-catalog.mdセキュリティバグは生成コードで最も"損失が大きい"失敗モードで、レビューで見落としやすい。 このスキルは、破局(情報漏えい・不正操作)の確率を下げる。
以下の3点を明確化する(これがないとテストも静的解析も焦点が合わない):
| 観点 | 質問 |
|---|---|
| 境界 | どこからが外部入力か? |
| 資産 | 守るべきデータは何か? |
| 権限 | 誰が何をできるべきか? |
鍵・トークン・パスワードの混入をスキャン:
# gitleaks
gitleaks detect --source . --verbose
# truffleHog
trufflehog filesystem .
# git-secrets
git secrets --scan
lockfile前提で脆弱性をスキャン:
# Node.js
npm audit
# Python
pip-audit
# Go
govulncheck ./...
# Rust
cargo audit
権限がない主体で必ず失敗することを検証:
def test_admin_endpoint_requires_admin_role():
# 一般ユーザーでログイン
token = login_as("user@example.com")
# 管理者エンドポイントへアクセス → 403
response = client.get("/admin/users", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 403
チェックすべき境界:
攻撃っぽい入力を当てる:
MALICIOUS_INPUTS = [
"'; DROP TABLE users; --", # SQLi
"<script>alert('xss')</script>", # XSS
"../../../etc/passwd", # Path traversal
"{{7*7}}", # SSTI
]
@pytest.mark.parametrize("payload", MALICIOUS_INPUTS)
def test_input_is_sanitized(payload):
response = client.post("/api/search", json={"query": payload})
# 実行されずエスケープされていること、または拒否されること
assert response.status_code in [200, 400]
assert payload not in response.text # 反射されていない
詳細は references/threat-catalog.md を参照。
┌─────────────────────────────────────┐
│ 信頼境界内 │
│ ┌─────────┐ ┌─────────────┐ │
─────────────────►│ │ API │───►│ Database │ │
外部入力 │ │ Gateway │ │ (資産: PII) │ │
(信頼境界外) │ └─────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Auth Service│ │
│ │ (資産: 認証情報) │
│ └─────────────┘ │
└─────────────────────────────────────┘
| エンドポイント | anonymous | user | admin | owner_only |
|---|---|---|---|---|
| GET /public | ✅ | ✅ | ✅ | - |
| GET /profile | ❌ | ✅ | ✅ | self |
| PUT /profile | ❌ | ✅ | ✅ | self |
| GET /admin | ❌ | ❌ | ✅ | - |
| DELETE /users | ❌ | ❌ | ✅ | - |