mcpField
S
security-review

security-review

github.com/getsentryセキュリティ1.1k21.6k 回インストール5 日前に更新
リポジトリ

security-review について

コードの悪用可能な脆弱性を調べるセキュリティレビュー用スキルです。報告前にデータフローやフレームワークの保護を確認し、攻撃者が制御する入力を伴う高確度の問題に絞ります。

主な機能

  1. 01コードの脆弱性レビュー
  2. 02入力データフローと発生元の追跡
  3. 03検証処理とフレームワーク保護の確認
  4. 04確度に基づく問題の選別
  5. 05重大度に応じたレポート構成

活用シーン

  1. 01APIルートとエンドポイントのレビュー
  2. 02フロントエンドコードとテンプレートの確認
  3. 03ファイルアップロードと外部リクエストの評価
  4. 04CI/CDと依存関係の設定レビュー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/getsentry/skills --skill security-review

インストール後、Claude Code で/security-reviewを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
SPEC.md
infrastructure/
docker.md
languages/
javascript.md
python.md
references/
api-security.md
authentication.md
authorization.md
business-logic.md
cryptography.md
csrf.md
data-protection.md
deserialization.md
error-handling.md
file-security.md
injection.md
logging.md
misconfiguration.md
modern-threats.md
ssrf.md
supply-chain.md
xss.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
設定、ヘッダー、CORSmisconfiguration.md
CI/CD、依存関係supply-chain.md
エラー処理error-handling.md
監査、ログ記録logging.md
オブジェクトのマージ/クローン、__proto__、DOM の id/name 参照、WebSocket ハンドラー、LLM プロンプトの構築modern-threats.md
2. 言語ガイドを読み込む

ファイル拡張子またはインポートに基づいて判断します。

目印ガイド
.py、django、flask、fastapilanguages/python.md
.js、.ts、express、react、vue、nextlanguages/javascript.md

その他の言語には専用ガイドがありません。references/ のファイルを参照し、コードベースでフレームワークの保護機能を直接確認してください。

3. インフラストラクチャガイドを読み込む(該当する場合)
ファイルの種類ガイド
Dockerfile、.dockerignoreinfrastructure/docker.md
GitHub Actions のワークフロー利用可能であれば gha-security-review スキルを使用します。利用できない場合は references/supply-chain.md を使用します
その他の CI/CD パイプライン、ロックファイル、パッケージマニフェストreferences/supply-chain.md
4. 問題を指摘する前に調査する

潜在的な問題ごとに、確信を深めるためコードベースを調査してください。

  • この値の実際の由来はどこですか?データフローをたどってください。
  • デプロイ時(設定、環境変数)に設定される値ですか、それともユーザー入力ですか?
  • 別の箇所に検証、サニタイズ、許可リストがありますか?
  • どのようなフレームワークの保護機能が適用されますか?

広いコンテキストを理解したうえで、確信度が高い問題のみ報告してください。

5. 悪用可能性を確認する

潜在的な問題ごとに、次の点を確認してください。

入力は攻撃者が制御できますか?

攻撃者が制御する値(調査対象)サーバーが制御する値(通常は安全)
request.GET、request.POST、request.argssettings.X、app.config['X']
request.json、request.data、request.bodyos.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

コメント