PR セキュリティレビュースキル
現在のブランチのPR差分をセキュリティ観点で分析し、脆弱性や改善点を報告する。
前提
- •セキュリティの問題は重大度(Critical / High / Medium / Low / Info)で分類する
- •誤検知を減らすため、実際にリスクがあるものだけを報告する
- •ユーザーが選択した修正のみを適用する
実行手順
Step 1: 差分の取得
- •引数でベースブランチが指定されていればそれを使う。省略時は
mainをベースとする - •以下のコマンドで変更ファイル一覧と差分を取得する:
- •
git diff <base-branch>...HEAD --name-onlyで変更ファイル一覧 - •
git diff <base-branch>...HEADで全体の差分
- •
- •変更ファイルが存在しない場合は「差分がありません」と報告して終了する
Step 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: 発見事項の作成と提示
- •発見した問題を以下のフォーマットで一覧にまとめる:
code
## セキュリティレビュー結果 ### [Critical/High/Medium/Low/Info] #1: [タイトル] - **ファイル**: `path/to/file.ts:行番号` - **カテゴリ**: [インジェクション | 認証・認可 | データ保護 | 依存関係・設定 | ロジック | フロントエンド] - **CWE**: CWE-XXX(該当する場合) - **現状**: 問題の内容と攻撃シナリオを簡潔に説明 - **修正案**: 具体的な修正方法を説明 - **コード例**:(before/after を示す)
- •重大度の高いものから順に並べる
- •問題が0件の場合は「セキュリティ上の問題は検出されませんでした」と報告する
Step 5: ユーザーへの確認
- •発見事項を提示した後、
AskUserQuestionを使ってユーザーにどの修正を適用するか確認する - •Critical/High の問題がある場合は、その修正を強く推奨する旨を添える
- •発見事項が4つ以下の場合は各項目をオプションとして提示する
- •発見事項が5つ以上の場合は以下のように段階的に確認する:
- •まず「すべて修正」「重大度別に選択」「個別に選択」「修正しない」の選択肢を提示
- •ユーザーの選択に応じて詳細を確認する
Step 6: 修正の適用
- •ユーザーが承認した修正のみを適用する
- •各修正適用後、変更内容を簡潔に報告する
- •すべての修正適用後、最終的なサマリーを表示する
注意事項
- •PR差分に含まれないファイルへの指摘は行わない。ただし差分内のコードが参照している箇所に明らかな脆弱性がある場合は Info として言及する
- •誤検知を最小限に抑える。確信が持てない場合は Info レベルで報告し「確認推奨」と付記する
- •自動フォーマッタやリンターで検出可能なスタイルの問題は対象外とする
- •セキュリティの修正は既存の機能を壊さないよう慎重に行う
引数
ベースブランチ: $ARGUMENTS