AgentSkillsCN

security-review

从安全角度分析当前PR的变更内容,提出潜在的漏洞与改进建议

SKILL.md
--- frontmatter
name: security-review
description: 現在のPRの変更内容をセキュリティ観点で分析し、脆弱性や改善点を提案する
argument-hint: "[対象ブランチ(省略時はmain)]"
allowed-tools: Bash, Read, Edit, Grep, Glob, AskUserQuestion, Task, TaskCreate, TaskUpdate, TaskList

PR セキュリティレビュースキル

現在のブランチのPR差分をセキュリティ観点で分析し、脆弱性や改善点を報告する。

前提

  • セキュリティの問題は重大度(Critical / High / Medium / Low / Info)で分類する
  • 誤検知を減らすため、実際にリスクがあるものだけを報告する
  • ユーザーが選択した修正のみを適用する

実行手順

Step 1: 差分の取得

  1. 引数でベースブランチが指定されていればそれを使う。省略時は main をベースとする
  2. 以下のコマンドで変更ファイル一覧と差分を取得する:
    • git diff <base-branch>...HEAD --name-only で変更ファイル一覧
    • git diff <base-branch>...HEAD で全体の差分
  3. 変更ファイルが存在しない場合は「差分がありません」と報告して終了する

Step 2: 変更ファイルの分析

  1. 変更された各ファイルの全体を読み込む(差分だけでなくファイル全体のコンテキストが必要)
  2. ファイルの言語・フレームワークを特定し、それに応じた観点で分析する

Step 3: セキュリティ分析

以下の観点で脆弱性・リスクを洗い出す。

インジェクション系

  • SQLインジェクション: 文字列結合によるクエリ構築、パラメータ化されていないクエリ
  • コマンドインジェクション: ユーザー入力を含むシェルコマンド実行、exec/spawnの引数
  • コードインジェクション: eval(), Function(), テンプレートリテラルでの動的コード生成
  • XSS(クロスサイトスクリプティング): innerHTML, dangerouslySetInnerHTML, サニタイズ未実施の出力
  • パストラバーサル: ユーザー入力を含むファイルパスの構築

認証・認可

  • ハードコードされた認証情報: パスワード、APIキー、トークン、シークレットの直書き
  • 認証バイパス: 認証チェックの欠落、不適切な認証フロー
  • 認可の不備: 権限チェックの欠落、IDOR(Insecure Direct Object Reference)
  • セッション管理: セッション固定、不適切なトークン管理

データ保護

  • 機密データの露出: ログへの機密情報出力、エラーメッセージでの内部情報漏洩
  • 暗号化の不備: 弱いハッシュアルゴリズム(MD5, SHA1)、ハードコードされた暗号鍵
  • CORS設定: ワイルドカード許可、不適切なオリジン設定

依存関係・設定

  • 安全でない依存関係: 既知の脆弱性を含むパッケージの追加・更新
  • デバッグ設定の残存: デバッグモード有効、verbose ログ、開発用エンドポイント
  • 不適切なエラーハンドリング: スタックトレースの露出、エラーの握りつぶし

ロジック上のセキュリティ

  • レースコンディション: 並行処理での競合、TOCTOU(Time of Check to Time of Use)
  • リソース枯渇: 無制限のファイルアップロード、レート制限の欠如、ReDoS
  • 安全でないデシリアライゼーション: 信頼されていないデータのデシリアライズ
  • SSRF(Server-Side Request Forgery): ユーザー入力を含むHTTPリクエストの送信先

フロントエンド固有(該当する場合)

  • CSP(Content Security Policy): インラインスクリプトの使用、unsafe-eval
  • Prototype Pollution: オブジェクトのマージ処理での汚染リスク
  • オープンリダイレクト: 外部URLへの未検証リダイレクト

Step 4: 発見事項の作成と提示

  1. 発見した問題を以下のフォーマットで一覧にまとめる:
code
## セキュリティレビュー結果

### [Critical/High/Medium/Low/Info] #1: [タイトル]
- **ファイル**: `path/to/file.ts:行番号`
- **カテゴリ**: [インジェクション | 認証・認可 | データ保護 | 依存関係・設定 | ロジック | フロントエンド]
- **CWE**: CWE-XXX(該当する場合)
- **現状**: 問題の内容と攻撃シナリオを簡潔に説明
- **修正案**: 具体的な修正方法を説明
- **コード例**:(before/after を示す)
  1. 重大度の高いものから順に並べる
  2. 問題が0件の場合は「セキュリティ上の問題は検出されませんでした」と報告する

Step 5: ユーザーへの確認

  1. 発見事項を提示した後、AskUserQuestion を使ってユーザーにどの修正を適用するか確認する
  2. Critical/High の問題がある場合は、その修正を強く推奨する旨を添える
  3. 発見事項が4つ以下の場合は各項目をオプションとして提示する
  4. 発見事項が5つ以上の場合は以下のように段階的に確認する:
    • まず「すべて修正」「重大度別に選択」「個別に選択」「修正しない」の選択肢を提示
    • ユーザーの選択に応じて詳細を確認する

Step 6: 修正の適用

  1. ユーザーが承認した修正のみを適用する
  2. 各修正適用後、変更内容を簡潔に報告する
  3. すべての修正適用後、最終的なサマリーを表示する

注意事項

  • PR差分に含まれないファイルへの指摘は行わない。ただし差分内のコードが参照している箇所に明らかな脆弱性がある場合は Info として言及する
  • 誤検知を最小限に抑える。確信が持てない場合は Info レベルで報告し「確認推奨」と付記する
  • 自動フォーマッタやリンターで検出可能なスタイルの問題は対象外とする
  • セキュリティの修正は既存の機能を壊さないよう慎重に行う

引数

ベースブランチ: $ARGUMENTS