- Agents Please コードレビューガイド:AI 支援によるプルリクエストレビューに、再現性のあるプロセスを使用します。
- 最優先事項:レビュー対象のスコープ、権限、シークレット、正確なリビジョンを確認します。
- 最適なワークフロー:広範囲にスキャンし、リスクのあるデータフローを追跡してから、検出結果を手動で検証します。
- 主な警告:開発者が再現するまでは、生成された検出結果を仮説として扱います。
- 最終確認:承認前に、テスト、パッチレビュー、回帰テストのカバレッジを必須とします。
Agents Please コードレビューガイド:スコープと安全性
Agents Please コードレビューガイドは、AI エージェントを使用してプルリクエスト、リポジトリ、または独立したコードサンプルを検査するチーム向けに設計されています。目的はレビュアーを置き換えることではありません。レビュー準備を迅速化し、セキュリティに関わる経路を明らかにし、人間のエンジニアが調査すべき質問をより明確に把握できるようにすることです。
まず、レビューの境界を狭く設定します。エージェントがアクセスできるブランチ、コミット、変更ファイル、プログラミング言語、テストコマンド、ディレクトリを特定します。スコープを制限すると結果を監査しやすくなり、無関係なレガシーコードがレビューを圧倒する可能性も減らせます。
レビュー範囲を広げるためだけに、本番環境の認証情報、秘密鍵、顧客記録、または制限のないシェルアクセスを決して提供しないでください。可能な限り、使い捨てのチェックアウト、最小権限のトークン、サニタイズ済みのフィクスチャを使用します。
レビューの境界
| レビュー項目 | 推奨される判断 | 重要な理由 |
|---|---|---|
| コミットまたはプルリクエスト | 正確なリビジョンを記録する | コードの変更に伴って検出結果がずれるのを防ぐ |
| ファイルスコープ | 変更ファイルと直接的な依存関係を含める | コンテキストと管理しやすい出力のバランスを取る |
| シークレット | 削除、無効化、またはマスクする | 偶発的な漏えいを制限する |
| ツール | まず読み取り専用の検索を許可する | 意図しない変更を減らす |
| テストコマンド | 安全で決定論的なコマンドだけを承認する | 破壊的なスクリプトやネットワークの副作用を避ける |
有用なレビューが答えるべきこと
優れた AI 支援レビューは、次の 5 つの質問への回答に役立つ必要があります。
- 何が変更され、どの動作に影響するのか?
- 信頼できない入力はシステムのどこから入るのか?
- その入力を受け取る関数、サービス、権限はどれか?
- 報告された各問題を裏付ける証拠は何か?
- どのテストまたはパッチがリスクを低減するのか?
一般的な懸念を列挙するだけのレポートは、ファイルパス、影響を受けるシンボル、データフローの推論、実践的な検証手順を含む、より短いレポートほど有用ではありません。
スコープ
- 正確なコミット
- 変更ファイル
- 関連する依存関係
- レビュー対象外
セキュリティ
- シークレットの取り扱い
- 権限制限
- 入力境界
- 外部呼び出し
証拠
- ファイルと行
- 再現経路
- 信頼度
- 前提条件
解決
- 推奨パッチ
- 回帰テスト
- 担当者
- 検証ステータス
AI 支援レビューを準備する
準備によって、エージェントが実行可能な分析を生成するか、推測の寄せ集めを生成するかが決まります。開始前に、平易な言葉で短いレビュー概要を書きます。機能の目的、想定される信頼境界、既知の機密操作、変更してはならない領域を含めてください。
Web サービスの場合、概要には認証、認可、ファイルアップロード、バックグラウンドジョブ、サードパーティリクエスト、データベースへの書き込み、モデルまたはプロンプトとの統合を含めることがあります。ライブラリの場合は、安全でないパーサー、シリアライズ、依存関係の変更、公開 API との互換性を重視することがあります。
入力がソースからシンクへどのように移動するかを説明するよう、エージェントに依頼します。これは通常、「すべてのバグを見つけて」と依頼するより有用です。より狭い指示のほうが、レビュアーが検証できる証拠を生成するためです。
レビュー概要テンプレート
| 概要の項目 | 内容の例 | レビュー上の利点 |
|---|---|---|
| 機能の目的 | ユーザー設定可能な Webhook 通知を追加する | 意図された動作を定義する |
| 信頼境界 | ユーザー設定が外部 HTTP クライアントに到達する | SSRF の可能性を明らかにする |
| 機密資産 | トークン、テナントデータ、内部メタデータ | 影響を明確にする |
| 必須チェック | 認可、URL 検証、エラーハンドリング | 焦点を絞ったチェックリストを作成する |
| 検証 | ユニットテストとモック化したネットワークリクエスト | 完了条件を定義する |
実践的な指示セット
発見、推論、報告を分離する指示を使用します。
- 変更されたコードと、その直接の呼び出し元をマッピングする。
- 外部入力、機密データ、特権操作、ネットワークリクエストを特定する。
- 疑わしい値を、検証、変換、保存、出力の各段階で追跡する。
- コード上の証拠で裏付けられる問題だけを報告する。
- 確認済みの欠陥、妥当性のある懸念、作成者への質問を区別する。
- 明示的に許可されていない限り、変更を適用せずにテストを提案する。
この構造は、よくある失敗も防ぎます。つまり、エージェントが危険なパターンに気づいても、バリデーター、フレームワークの制御、上流の権限によってすでに悪用が防止されているかどうかを確認しないという失敗です。
レビュー対象を固定する
リポジトリ、ブランチ、コミットハッシュ、変更ファイル一覧を記録します。分析中にプルリクエストが変更された場合は、分析を再開するか、新しいリビジョンであることを明確に示します。
信頼モデルを説明する
匿名ユーザー、認証済みユーザー、管理者、サービスアカウント、バックグラウンドワーカー、サードパーティシステムを特定します。影響を受ける各操作に、どのロールがアクセスできるかを明記します。
高リスクのシンクを定義する
データベースクエリ、ファイルパーサー、テンプレートレンダリング、外部リクエスト、シェルコマンド、デシリアライズ、認証情報の使用、権限チェックを強調します。
証拠に基づく検出結果を求める
各検出結果について、パス、シンボルまたは行範囲、入力ソース、危険な操作、影響、信頼度、推奨される検証方法を必須にします。
出力を手動でレビューする
重要な主張を再現し、周辺のコードを確認し、既存の制御をチェックして、その問題が有効か、緩和されているか、誤りかを判断します。
検出結果の優先順位を付け、データフローを追跡する
AI コードレビューは、表現がどれほど恐ろしく聞こえるかではなく、悪用可能性と影響に基づいて検出結果を順位付けすると、より効果的になります。コメントの欠落と、ユーザーが制御できるサーバーサイドリクエストに同じ注意を向けるべきではありません。
信頼できない入力と、特権的または外部から見える動作を結び付ける経路から着手します。一般的な例には、データベースクエリに到達するリクエストパラメータ、パーサーに到達するアップロードコンテンツ、HTTP クライアントに到達する設定可能な URL、別のモデルへの指示に挿入されるユーザーテキストなどがあります。
信頼度の高い問題でも影響が限定的な場合があり、重大な問題でも環境を理解するまで確認できないことがあります。レポートでは、信頼度と影響を別々に記録してください。
検出結果の分類
| 検出結果の種類 | 証拠の基準 | レビュアーの対応 |
|---|---|---|
| 確認済みの欠陥 | 明確な経路と制御の欠落 | 再現し、パッチを適用して回帰テストを追加する |
| 可能性の高い懸念 | 強いパターンだがコンテキストが不完全 | 依存関係と周辺ロジックを確認する |
| 設計上の質問 | 動作が意図的である可能性がある | 担当者に信頼モデルの明確化を求める |
| 誤検知 | 既存の制御が経路を遮断している | 制御を記録して検出結果をクローズする |
| 情報提供 | 保守性または堅牢化に関する問題 | チームの優先順位に従って予定に入れる |
リスクのトリアージマトリクス
| 影響 | 信頼度 | 優先度 |
|---|---|---|
| 高 | 高 | 直ちに調査 |
| 高 | 中 | マージ前に検証 |
| 中 | 高 | 可能であれば現在の変更で修正 |
| 中 | 低 | 追加のコンテキストを求める |
| 低 | 任意 | 保守作業とまとめて対応 |
脆弱性の疑いをレビューする際は、完全な連鎖を示すようエージェントに依頼します。
- ソース:値はどこから発生するのか?
- 変換:デコード、解析、連結、正規化のいずれかが行われているか?
- 制御:どの検証、認可、エンコード、許可リストが適用されるか?
- シンク:どの操作が値を使用するのか?
- 影響:攻撃者または誤動作するユーザーによって何が引き起こされる可能性があるか?
- 検証:主張を実証する安全なテストは何か?
たとえば、外部リクエストだからといって、自動的にサーバーサイドリクエストフォージェリの問題になるわけではありません。レビュアーは、攻撃者が宛先を操作できるか、プライベートアドレスまたはメタデータアドレスに到達できるか、リダイレクトが制御されているか、アプリケーションに許可された宛先ポリシーがあるかを確認する必要があります。
同様に、プロンプトに挿入された文字列が、必ずしもプロンプトインジェクションの成功を意味するわけではありません。レビューでは、モデルの境界、生成された出力の権限、利用可能なツール、信頼できないコンテンツがシステム指示から明確に分離されているかを特定する必要があります。
セキュリティに関わるパターンをレビューする
焦点を絞ったレビューでは、すべての一致が悪用可能だと決めつけることなく、頻繁に欠陥を生み出すパターンを調査します。以下のカテゴリは、Agents Please ワークフローの出発点として役立ちます。
無害な概念実証用の値を使用し、トークン、個人データ、内部ホスト名、破壊的なコマンドを編集して隠してください。レビューのレポートは、攻撃手順書になることなくリスクを示す必要があります。
| パターン | 確認すべき質問 | より安全なレビューの兆候 |
|---|---|---|
| 外部 HTTP リクエスト | ユーザーがスキーム、ホスト、ポート、リダイレクトを制御できるか? | 検証済みの宛先と制限されたネットワークアクセス |
| データベースクエリ | 入力はデータとしてバインドされているか、それともクエリテキストに連結されているか? | パラメータ化クエリと最小限の権限 |
| ファイルアップロード | 種類、サイズ、名前、保存場所が制限されているか? | ランダム化された名前、分離されたストレージ、安全な解析 |
| テンプレートまたは HTML 出力 | 信頼できないコンテンツが出力コンテキストに合わせてエンコードされているか? | コンテキストに応じたエスケープと安全なレンダリング |
| 認可チェック | すべてのオブジェクトに対してサーバー側でアクセスが確認されているか? | 集中管理されたポリシーと所有権の検証 |
| プロンプトの構築 | 信頼できないテキストがタスクの境界を上書きできるか? | 区切り付きコンテンツ、制限されたツール、出力の検証 |
| デシリアライズ | 攻撃者が制御するデータによってクラスまたは動作を選択できるか? | 安全な形式と明示的なスキーマ |
| テナントまたはアカウントのコンテキスト | 呼び出し元が別のスコープを直接選択できるか? | サーバー由来のコンテキストと認可チェック |
パッチレビューの基準
提案された修正は、報告された症状を隠すだけでなく、原因に対処する必要があります。次の点を確認してください。
- 正しい信頼境界で入力を検証している。
- 正当なユーザーに対して期待される動作を維持している。
- 関連するすべてのコードパスに認可を適用している。
- 機密情報を漏えいさせずに失敗を処理している。
- 修正がなければ失敗する回帰テストを含んでいる。
- 別のエンドポイントやバックグラウンドジョブを通じて、2 つ目のバイパスを導入していない。
入力制御
危険な操作の前に、形式、長さ、エンコーディング、許可された値を検証します。
アクセス制御
信頼できるサーバーコンテキストから ID とスコープを導出し、オブジェクトレベルの権限を適用します。
出力制御
ユーザー、インタープリター、外部サービスに返す前に、データをエンコード、フィルタリング、制約、またはレビューします。
レビューを完了し、修正を追跡する
レビューは、エージェントがレポートを生成した時点では完了しません。チームがどの検出結果が有効かを判断し、担当者を割り当て、適切な修正を適用し、変更が安全に動作することを確認した時点で完了します。
受け入れた検出結果と未解決の質問は分けて管理します。これにより、長いレポートがリリースを妨げる少数の問題を覆い隠すことを防げます。また、将来同じコードパスに遭遇するレビュアーにとって有用な履歴にもなります。
重要な検出結果について、修正済み、緩和済み、担当者付きで受け入れ済み、または証拠を文書化してクローズ済みのいずれかの処置が決まってから承認します。「エージェントが安全だと言っている」は、十分な処置とはいえません。
レビュー完了表
| 段階 | 必要な証拠 | 完了の兆候 |
|---|---|---|
| 発見 | スコープと変更ファイルのマップ | レビュアーが変更内容を理解している |
| 分析 | パスと推論を伴う検出結果 | 主張を検証できる |
| トリアージ | 影響と信頼度のラベル | 優先順位が明確になっている |
| 修正 | パッチと回帰テスト | 根本原因に対処している |
| 検証 | テスト、手動チェック、または安全な再現 | 修正が意図どおり機能している |
| クローズ | 担当者、ステータス、理由 | レビュー記録を監査できる |
コードレビュー完了チェックリスト:
- 正確なコミットとレビューのスコープを確認する
- シークレットを削除し、エージェントの権限を制限する
- 信頼できない入力から機密操作までを追跡する
- 影響と信頼度に基づいて検出結果を分類する
- テストまたは安全な再現によって修正を検証する
- 受け入れたリスクと未解決のフォローアップ作業を記録する
有用な最終レポートは、簡潔でありながら具体的です。受け入れた各問題について、影響を受けるコンポーネント、リスク、証拠、推奨される修正、担当者、検証ステータスを含めます。却下した各問題については、無効と判断した制御または前提条件を記録します。これにより、後続のプルリクエストで同じ調査を繰り返す必要が減ります。
同じ誤検知が頻繁に発生する場合は、レビュー指示を改善するか、リポジトリのガイダンスを追加します。同じ実際の欠陥が繰り返し発生する場合は、手動検出を繰り返し頼るのではなく、共有ヘルパー、フレームワークの制御、lint ルール、テストフィクスチャ、またはアーキテクチャの変更に投資します。
受け入れた検出結果、却下した検出結果、推奨される修正の短い例を保存します。時間が経つにつれ、これらの例によって将来のエージェント指示がより正確になり、人間のレビュアーが判断基準を調整しやすくなります。
FAQ:Agents Please コードレビューワークフロー
Q: Agents Please コードレビューガイドのワークフローを開始する最も安全な方法は何ですか?
使い捨てのチェックアウト、正確なコミット、読み取り専用のツール、サニタイズ済みのデータ、狭いファイルスコープから始めます。セキュリティ上の検出結果を求める前に、変更内容をマッピングするようエージェントに依頼してください。
Q: AI が生成した脆弱性は、直ちにプルリクエストをブロックすべきですか?
それだけでは不十分です。レポートを仮説として扱い、完全なデータフロー、既存の制御、悪用可能性、期待される動作を確認してください。適格なレビュアーがリスクを確認するか、チームが文書化されたポリシーを採用した後にのみブロックします。
Q: プロンプトインジェクションの懸念はどのようにレビューすべきですか?
どのコンテンツが信頼できないのか、それがどこでプロンプトに入るのか、モデルがどのような権限を持つのか、どのツールやアクションを利用できるのか、出力がどのように検証されるのかを特定します。リスクは文字列補間だけでなく、システム全体の境界によって決まります。
Q: コードレビューの検出結果を実行可能にするものは何ですか?
実行可能な検出結果には、影響を受けるファイルまたはシンボル、入力からシンクまでの経路、現実的な影響、信頼度、対象を絞った修正案、安全な検証方法が含まれます。
AI を使用してレビュー範囲を広げ、証拠を整理します。ただし、スコープの管理、リスクの判断、最終承認は、責任を負う人間のエンジニアが行うようにしてください。