security-review について
コードの悪用可能な脆弱性を調べるセキュリティレビュー用スキルです。報告前にデータフローやフレームワークの保護を確認し、攻撃者が制御する入力を伴う高確度の問題に絞ります。
主な機能
- 01コードの脆弱性レビュー
- 02入力データフローと発生元の追跡
- 03検証処理とフレームワーク保護の確認
- 04確度に基づく問題の選別
- 05重大度に応じたレポート構成
活用シーン
- 01APIルートとエンドポイントのレビュー
- 02フロントエンドコードとテンプレートの確認
- 03ファイルアップロードと外部リクエストの評価
- 04CI/CDと依存関係の設定レビュー
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ getsentry/ skills --skill security-reviewインストール後、Claude Code で/security-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSESPEC.mdinfrastructure/docker.mdlanguages/javascript.mdpython.mdreferences/api-security.mdauthentication.mdauthorization.mdbusiness-logic.mdcryptography.mdcsrf.mddata-protection.mddeserialization.mderror-handling.mdfile-security.mdinjection.mdlogging.mdmisconfiguration.mdmodern-threats.mdssrf.mdsupply-chain.mdxss.md詳細
セキュリティレビューのスキル
コードに悪用可能なセキュリティ脆弱性がないか特定します。報告するのは、攻撃者が制御できる入力を伴う、明確な脆弱性パターンがある確度の高い問題のみにしてください。
対象範囲:調査と報告
重要な区別:
- 報告対象:ユーザーが提供した特定のファイル、差分、またはコードのみ
- 調査対象:報告前に確信を得るためのコードベース全体
問題を指摘する前に、コードベースを必ず調査して、以下を確認してください。
- この入力は実際にどこから来るのか。(データフローを追跡してください)
- 別の場所で検証やサニタイズが行われているか。
- どのように設定されているか。(設定、構成ファイル、ミドルウェアを確認してください)
- フレームワークによる保護機能はあるか。
パターンに一致するという理由だけで問題を報告しないでください。まず調査し、悪用可能だと確信できるものだけを報告してください。
確信度
| レベル | 基準 | 対応 |
|---|---|---|
| 高 | 脆弱なパターンがあり、攻撃者が制御できる入力であることが確認されている | 重要度を付けて報告 |
| 中 | 脆弱なパターンはあるが、入力元が不明 | 「要確認」として注記 |
| 低 | 理論上の問題、ベストプラクティス、徹底的な防御 | 報告しない |
指摘しないもの
一般的なルール
- テストファイル(テストのセキュリティを明示的にレビューする場合を除く)
- 使用されていないコード、コメントアウトされたコード、ドキュメント文字列
- 定数またはサーバー管理の構成値を使用するパターン
- 到達する前に認証が必要なコードパス(代わりに認証要件を注記してください)
サーバー管理の値(攻撃者が制御する値ではありません)
これらは攻撃者が制御するのではなく、運用者が設定します。
| ソース | 例 | 安全な理由 |
|---|---|---|
| Django の設定 | settings.API_URL、settings.ALLOWED_HOSTS | デプロイ時に設定または環境変数で設定される |
| 環境変数 | os.environ.get('DATABASE_URL') | デプロイ時の構成 |
| 構成ファイル | config.yaml、app.config['KEY'] | サーバー側のファイル |
| フレームワークの定数 | django.conf.settings.* | ユーザーが変更できない |
| ハードコードされた値 | BASE_URL = "https://api.internal" | コンパイル時の定数 |
SSRF の例 — 脆弱性ではありません:
# SAFE: URL comes from Django settings (server-controlled)
response = requests.get(f"{settings.SEER_AUTOFIX_URL}{path}")
SSRF の例 — 脆弱性です:
# VULNERABLE: URL comes from request (attacker-controlled)
response = requests.get(request.GET.get('url'))
フレームワークによって緩和されるパターン
指摘する前に、言語ごとのガイドを確認してください。誤検知になりやすい例を以下に示します。
| パターン | 通常は安全な理由 |
|---|---|
Django の {{ variable }} | デフォルトで自動エスケープされる |
React の {variable} | デフォルトで自動エスケープされる |
Vue の {{ variable }} | デフォルトで自動エスケープされる |
User.objects.filter(id=input) | ORM がクエリをパラメーター化する |
cursor.execute("...%s", (input,)) | パラメーター化されたクエリ |
innerHTML = "<b>Loading...</b>" | ユーザー入力を含まない定数文字列 |
以下の場合のみ指摘してください:
- Django:
{{ var|safe }}、{% autoescape off %}、mark_safe(user_input) - React:
dangerouslySetInnerHTML={{__html: userInput}} - Vue:
v-html="userInput" - ORM:文字列補間を使った
.raw()、.extra()、RawSQL()
レビュープロセス
1. コンテキストを特定する
レビュー対象のコードはどの種類ですか?
| コードの種類 | 読み込むリファレンス |
|---|---|
| API エンドポイント、ルート | authorization.md、authentication.md、injection.md |
| Django/DRF のビュー、権限クラス、オブジェクトレベルのアクセス制御 | アクセス制御には、利用可能であれば django-access-review スキルを使用します。利用できない場合は authorization.md を使用します |
| フロントエンド、テンプレート | xss.md、csrf.md、modern-threats.md(DOM clobbering、prototype pollution) |
| ファイル処理、アップロード | file-security.md |
| 暗号、シークレット、トークン | cryptography.md、data-protection.md |
| データのシリアライズ | deserialization.md |
| 外部へのリクエスト | ssrf.md |
| ビジネスワークフロー | business-logic.md |
| GraphQL、REST 設計 | api-security.md |
| 設定、ヘッダー、CORS | misconfiguration.md |
| CI/CD、依存関係 | supply-chain.md |
| エラー処理 | error-handling.md |
| 監査、ログ記録 | logging.md |
オブジェクトのマージ/クローン、__proto__、DOM の id/name 参照、WebSocket ハンドラー、LLM プロンプトの構築 | modern-threats.md |
2. 言語ガイドを読み込む
ファイル拡張子またはインポートに基づいて判断します。
| 目印 | ガイド |
|---|---|
.py、django、flask、fastapi | languages/python.md |
.js、.ts、express、react、vue、next | languages/javascript.md |
その他の言語には専用ガイドがありません。references/ のファイルを参照し、コードベースでフレームワークの保護機能を直接確認してください。
3. インフラストラクチャガイドを読み込む(該当する場合)
| ファイルの種類 | ガイド |
|---|---|
Dockerfile、.dockerignore | infrastructure/docker.md |
| GitHub Actions のワークフロー | 利用可能であれば gha-security-review スキルを使用します。利用できない場合は references/supply-chain.md を使用します |
| その他の CI/CD パイプライン、ロックファイル、パッケージマニフェスト | references/supply-chain.md |
4. 問題を指摘する前に調査する
潜在的な問題ごとに、確信を深めるためコードベースを調査してください。
- この値の実際の由来はどこですか?データフローをたどってください。
- デプロイ時(設定、環境変数)に設定される値ですか、それともユーザー入力ですか?
- 別の箇所に検証、サニタイズ、許可リストがありますか?
- どのようなフレームワークの保護機能が適用されますか?
広いコンテキストを理解したうえで、確信度が高い問題のみ報告してください。
5. 悪用可能性を確認する
潜在的な問題ごとに、次の点を確認してください。
入力は攻撃者が制御できますか?
| 攻撃者が制御する値(調査対象) | サーバーが制御する値(通常は安全) |
|---|---|
request.GET、request.POST、request.args | settings.X、app.config['X'] |
request.json、request.data、request.body | os.environ.get('X') |
request.headers(ほとんどのヘッダー) | ハードコードされた定数 |
request.cookies(署名なし) | 設定から取得した内部サービス URL |
URL パスのセグメント:/users/<id>/ | 管理者/システムによるデータベースの内容 |
| ファイルのアップロード(内容とファイル名) | 署名済みのセッションデータ |
| 他のユーザーによるデータベースの内容 | フレームワークの設定 |
| WebSocket メッセージ |
フレームワークによる軽減策はありますか?
- 言語ガイドで自動エスケープやパラメーター化を確認します
- サニタイズを行うミドルウェア/デコレーターを確認します
上流で検証されていますか?
- このコードより前に行われる入力検証
- サニタイズライブラリ(DOMPurify、bleach など)
6. 確信度が高い問題のみ報告する
理論上の問題は除外してください。調査後に悪用可能だと確認できたもののみ報告してください。
重大度の分類
| 重大度 | 影響 | 例 |
|---|---|---|
| Critical | 直接的なエクスプロイト、深刻な影響、認証不要 | RCE、データに対する SQL インジェクション、認証バイパス、ハードコードされたシークレット |
| High | 条件付きで悪用可能、重大な影響 | 保存型 XSS、メタデータへの SSRF、機密データに対する IDOR |
| Medium | 特定の条件が必要、中程度の影響 | 反射型 XSS、状態変更操作に対する CSRF、パストラバーサル |
| Low | 多層防御、直接的な影響は最小限 | ヘッダーの欠落、詳細すぎるエラー、重要度の低いコンテキストでの脆弱なアルゴリズム |
すぐに参照できるパターン
常に報告(Critical)
eval(user_input) # Any language
exec(user_input) # Any language
pickle.loads(user_data) # Python
yaml.load(user_data) # Python (not safe_load)
unserialize($user_data) # PHP
deserialize(user_data) # Java ObjectInputStream
shell=True + user_input # Python subprocess
child_process.exec(user) # Node.js
常に報告(High)
innerHTML = userInput # DOM XSS
dangerouslySetInnerHTML={user} # React XSS
v-html="userInput" # Vue XSS
f"SELECT * FROM x WHERE {user}" # SQL injection
`SELECT * FROM x WHERE ${user}` # SQL injection
os.system(f"cmd {user_input}") # Command injection
常に報告(シークレット)
password = "hardcoded"
api_key = "sk-..."
AWS_SECRET_ACCESS_KEY = "..."
private_key = "-----BEGIN"
まずコンテキストを確認(報告前に必ず調査)
# SSRF - ONLY if URL is from user input, NOT from settings/config
requests.get(request.GET['url']) # FLAG: User-controlled URL
requests.get(settings.API_URL) # SAFE: Server-controlled config
requests.get(f"{settings.BASE}/{x}") # CHECK: Is 'x' user input?
# Path traversal - ONLY if path is from user input
open(request.GET['file']) # FLAG: User-controlled path
open(settings.LOG_PATH) # SAFE: Server-controlled config
open(f"{BASE_DIR}/{filename}") # CHECK: Is 'filename' user input?
# Open redirect - ONLY if URL is from user input
redirect(request.GET['next']) # FLAG: User-controlled redirect
redirect(settings.LOGIN_URL) # SAFE: Server-controlled config
# Weak crypto - ONLY if used for security purposes
hashlib.md5(file_content) # SAFE: File checksums, caching
hashlib.md5(password) # FLAG: Password hashing
random.random() # SAFE: Non-security uses (UI, sampling)
random.random() for token # FLAG: Security tokens need secrets module
出力形式
## Security Review: [File/Component Name]
### Summary
- **Findings**: X (Y Critical, Z High, ...)
- **Risk Level**: Critical/High/Medium/Low
- **Confidence**: High/Mixed
### Findings
#### [VULN-001] [Vulnerability Type] (Severity)
- **Location**: `file.py:123`
- **Confidence**: High
- **Issue**: [What the vulnerability is]
- **Impact**: [What an attacker could do]
- **Evidence**:
```python
[Vulnerable code snippet]
- 修正方法: [修正方法]
検証が必要
[VERIFY-001] [潜在的な問題]
- 場所:
file.py:456 - 質問: [検証が必要な内容]
If no vulnerabilities found, state: "No high-confidence vulnerabilities identified."
---
## Reference Files
### Core Vulnerabilities (`references/`)
| File | Covers |
|------|--------|
| `injection.md` | SQL, NoSQL, OS command, LDAP, template injection |
| `xss.md` | Reflected, stored, DOM-based XSS |
| `authorization.md` | Authorization, IDOR, privilege escalation |
| `authentication.md` | Sessions, credentials, password storage |
| `cryptography.md` | Algorithms, key management, randomness |
| `deserialization.md` | Pickle, YAML, Java, PHP deserialization |
| `file-security.md` | Path traversal, uploads, XXE |
| `ssrf.md` | Server-side request forgery |
| `csrf.md` | Cross-site request forgery |
| `data-protection.md` | Secrets exposure, PII, logging |
| `api-security.md` | REST, GraphQL, mass assignment |
| `business-logic.md` | Race conditions, workflow bypass |
| `modern-threats.md` | Prototype pollution, LLM injection, WebSocket |
| `misconfiguration.md` | Headers, CORS, debug mode, defaults |
| `error-handling.md` | Fail-open, information disclosure |
| `supply-chain.md` | Dependencies, build security |
| `logging.md` | Audit failures, log injection |
### Language Guides (`languages/`)
- `python.md` - Django, Flask, FastAPI patterns
- `javascript.md` - Node, Express, React, Vue, Next.js
### Infrastructure (`infrastructure/`)
- `docker.md` - Container security