vulnerability-validation について
コードスキャンの検出事項について、到達可能性と悪用可能性を調べるセキュリティレビュー用スキルです。分析根拠を記録し、判定を分類して、確認済みの問題にはPoCとCVSSスコアを作成します。
主な機能
- 01到達可能性とデータフローの分析
- 02既存の緩和策の確認
- 03悪用可能性の評価とステータス分類
- 04PoC作成とCVSS評価
- 05検証結果のJSON出力
活用シーン
- 01セキュリティスキャン後の誤検知の除外
- 02HIGHまたはCRITICALの検出事項の優先検証
- 03修正前の検出事項の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ factory-ai/ factory-plugins --skill vulnerability-validationインストール後、Claude Code で/vulnerability-validationを入力して読み込まれたか確認します。
同梱ファイルvalidation-examples.md
詳細
脆弱性の検証
このコードベースのコンテキストで実際に悪用可能かどうかを評価し、セキュリティ上の指摘事項を検証します。このスキルでは、誤検知を除外し、実際の脆弱性を確認して、概念実証のエクスプロイトを生成します。
このスキルを使用するタイミング
- commit-security-scan の後 - イシューの作成や PR のブロック前に、指摘事項を検証します
- HIGH/CRITICAL の指摘事項 - 深刻度の高い指摘事項の検証を優先します
- パッチ適用前 - 修正に取り組む前に、脆弱性が実在することを確認します
- セキュリティレビュー - 特定の指摘事項を詳細に検証します
前提条件
.factory/threat-model.mdが存在すること(threat-model-generationスキルで生成)security-findings.jsonが存在すること(commit-security-scanスキルで生成)
入力
| 入力 | 説明 | 必須 | デフォルト |
|---|---|---|---|
| Findings file | security-findings.json へのパス | はい | security-findings.json |
| Threat model | 脅威モデルへのパス | いいえ | .factory/threat-model.md |
| Finding IDs | 検証する特定の指摘事項(カンマ区切り) | いいえ | すべての指摘事項 |
| Severity filter | この深刻度以上の指摘事項のみを検証 | いいえ | すべての深刻度 |
手順
検証する指摘事項ごとに、以下の手順に従います。
ステップ 1: コンテキストの読み込み
commit-security-scanのsecurity-findings.jsonを読み込みます- システムのコンテキストを把握するため、
.factory/threat-model.mdを読み込みます - 入力に基づいて、検証する指摘事項を特定します
ステップ 2: 到達可能性の分析
指摘事項ごとに、脆弱なコードに到達できるかどうかを判断します。
-
エントリーポイントをたどる
- 外部ユーザーはこのコードパスに到達できますか?
- どの HTTP エンドポイント、CLI コマンド、またはイベントハンドラーからここに到達しますか?
- このコードに到達するには認証が必要ですか?
-
呼び出しチェーンをマッピングする
- エントリーポイントから始めて、脆弱なコードまでの経路をたどります
- チェーン内の各関数呼び出しを記録します
- 成立が必要な分岐条件を記録します
-
到達可能性を分類する
EXTERNAL- 認証されていない外部入力から到達可能AUTHENTICATED- 有効なユーザーセッションが必要INTERNAL- 内部サービスからのみ到達可能UNREACHABLE- デッドコード、または条件によってブロックされている
ステップ 3: 制御フローの分析
攻撃者が脆弱な入力を制御できるかどうかを判断します。
-
ソースを特定する
- 汚染データはどこから発生しますか?
- HTTP パラメーター、ファイルアップロード、データベースクエリ、環境変数ですか?
-
データフローをたどる
- ソースからシンク(脆弱な関数)までデータをたどります
- 各変換または検証ステップを記録します
- サニタイズ、エンコード、型変換の有無を記録します
-
攻撃者による制御可能性を評価する
- 攻撃者は入力を完全に制御できますか?
- 長さ制限、文字制限、または形式の検証はありますか?
- データは何らかのサニタイズを経由しますか?
ステップ 4: 緩和策の評価
既存のセキュリティ制御によって悪用が防止されるかどうかを確認します。
-
入力検証
- 脆弱なコードに到達する前に入力は検証されていますか?
- どのような検証ルールが適用されていますか?
-
フレームワークによる保護
- フレームワークは自動的な保護を提供しますか?(例:ORM のパラメーター化、React の XSS エスケープ)
- その保護は有効になっており、適切に設定されていますか?
-
セキュリティミドルウェア
- WAF ルール、レート制限、またはその他の制御はありますか?
- CSP ヘッダーやその他のブラウザー保護は適用されますか?
-
脅威モデルを参照する
- この脅威の種類に該当する「既存の緩和策」セクションを確認します
- 緩和策が実際に導入されていることを確認します
ステップ 5:悪用可能性の評価
悪用の難易度を判断します。
| 評価 | 基準 |
|---|---|
EASY | 特別な条件は不要で、標準的なツールと公知の手法で悪用できます |
MEDIUM | 特定の条件、タイミング、または脆弱性の連鎖が必要です |
HARD | 内部情報、まれな条件、または高度な手法が必要です |
NOT_EXPLOITABLE | 理論上の脆弱性ですが、実際には悪用できません |
以下を考慮します。
- 攻撃の複雑さ
- 必要な権限
- 必要なユーザー操作
- 影響範囲
ステップ 6:概念実証を作成する
確認された脆弱性について、概念実証を作成します。
-
エクスプロイトペイロードを作成する
- 脆弱性を実証する最小限のペイロードを作成します
- 無害なペイロードを使用します(実際の損害を与えないもの)
-
リクエストを記録する
- HTTP メソッド、URL、ヘッダー、本文
- または CLI コマンド、入力ファイルなど
-
期待される動作と実際の動作を説明する
- 期待される動作(安全な動作)
- 実際の動作(脆弱な動作)
PoC の構成例:
{
"payload": "' OR '1'='1",
"request": "GET /api/users?search=' OR '1'='1",
"expected_behavior": "Returns users matching search term",
"actual_behavior": "Returns all users due to SQL injection"
}
ステップ 7:CVSS スコアを算出する
以下に基づいて CVSS 3.1 スコアを割り当てます。
| 指標 | 選択肢 |
|---|---|
| Attack Vector (AV) | ネットワーク (N)、隣接 (A)、ローカル (L)、物理 (P) |
| Attack Complexity (AC) | 低 (L)、高 (H) |
| Privileges Required (PR) | なし (N)、低 (L)、高 (H) |
| User Interaction (UI) | なし (N)、必要 (R) |
| Scope (S) | 変更なし (U)、変更あり (C) |
| Confidentiality (C) | なし (N)、低 (L)、高 (H) |
| Integrity (I) | なし (N)、低 (L)、高 (H) |
| Availability (A) | なし (N)、低 (L)、高 (H) |
例:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1(クリティカル)
ステップ 8:検出結果を分類する
分析に基づいて、各検出結果を分類します。
| ステータス | 意味 |
|---|---|
CONFIRMED | 脆弱性が実在し、悪用可能です |
LIKELY | おそらく悪用可能ですが、完全には検証できませんでした |
FALSE_POSITIVE | 実際には脆弱性ではありません(理由を記録してください) |
NEEDS_MANUAL_REVIEW | 人間のセキュリティ専門家によるレビューが必要です |
ステップ 9:出力を生成する
validated-findings.json を作成します。
{
"validation_id": "val-<timestamp>",
"validation_date": "<ISO timestamp>",
"scan_id": "<from security-findings.json>",
"threat_model_version": "<from threat-model.md>",
"validated_findings": [
{
"id": "VULN-001",
"status": "CONFIRMED",
"original_severity": "HIGH",
"validated_severity": "HIGH",
"exploitability": "EASY",
"reachability": "EXTERNAL",
"existing_mitigations": [],
"exploitation_path": [
"User submits search query via GET /api/users?search=<payload>",
"Express router passes query to searchUsers() handler",
"Handler passes unsanitized input to SQL template literal",
"PostgreSQL executes malicious SQL"
],
"proof_of_concept": {
"payload": "' OR '1'='1",
"request": "GET /api/users?search=' OR '1'='1",
"expected_behavior": "Returns users matching search term",
"actual_behavior": "Returns all users due to SQL injection"
},
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N",
"cvss_score": 9.1,
"validation_notes": "Confirmed via code tracing. No input validation or parameterization."
}
],
"false_positives": [
{
"id": "VULN-003",
"original_severity": "MEDIUM",
"reason": "Input is validated by Joi schema in middleware before reaching this code. Schema enforces UUID format which prevents injection.",
"evidence": "See src/middleware/validation.js:45 - Joi.string().uuid()"
}
],
"needs_manual_review": [
{
"id": "VULN-005",
"original_severity": "HIGH",
"reason": "Complex data flow through message queue. Unable to fully trace if sanitization occurs in consumer service."
}
],
"summary": {
"total_analyzed": 10,
"confirmed": 5,
"likely": 2,
"false_positives": 2,
"needs_manual_review": 1,
"by_severity": {
"CRITICAL": 1,
"HIGH": 3,
"MEDIUM": 1,
"LOW": 0
}
}
}
成功基準
以下を満たすと、このスキルは完了です。
- 指定されたすべての検出結果が分析されている
- 各検出結果にステータス(CONFIRMED、LIKELY、FALSE_POSITIVE、NEEDS_MANUAL_REVIEW)が付与されている
- 確認された検出結果について、悪用経路が記録されている
- 確認された検出結果について、概念実証エクスプロイトが作成されている
- 誤検知について、明確な根拠が示されている
-
validated-findings.jsonが有効な JSON である - 確認された検出結果について、CVSS スコアが算出されている
検証
完了する前に、以下のチェックを実行します。
# Verify output exists and is valid JSON
cat validated-findings.json | jq . > /dev/null && echo "✓ Valid JSON"
# Check all findings have status
jq '.validated_findings | all(.status)' validated-findings.json
# Check confirmed findings have PoC
jq '.validated_findings | map(select(.status == "CONFIRMED")) | all(.proof_of_concept)' validated-findings.json
# Check false positives have reasoning
jq '.false_positives | all(.reason)' validated-findings.json
実行例
すべての検出結果を検証する:
Validate the security findings from the last scan.
特定の検出結果を検証する:
Validate findings VULN-001 and VULN-002 from security-findings.json.
HIGH/CRITICAL のみを検証する:
Validate all HIGH and CRITICAL severity findings from the security scan.
特定のファイルを指定して検証する:
Validate findings in security-findings.json using threat model at .factory/threat-model.md.
参考資料
- CVSS 3.1 Calculator: https://www.first.org/cvss/calculator/3.1
- OWASP Testing Guide: https://owasp.org/www-project-web-security-testing-guide/
- 例:
validation-examples.md(このスキルのディレクトリ内) - 上流:
commit-security-scanスキル