AIに偽陽性を大量に出さずに実際のコード脆弱性を発見させる方法
LLMにソースコードを指して「脆弱性を探して」と指示したことがある人なら、その結果を覚えているだろう。モデルは Typically、理論的な観察の壁を生成する:ここにOWASPチェックリストの検証が足りない、そこにもう一层のサニタイズを追加できる、この変数の名前は怪しい。等々。実際には、このような発見の90%は、開発者の時間を無駄にするノイズであることが判明する。
Cloudflareチームはsecurity-audit-skillをオープンソース化した。これはコーディングエージェント向けの指示とパイプラインのセットで、継続的なリポジトリ監査のための内部ハーネス構築に使用されている。
通常のAI監査の主な問題点
ほとんどの静的アナライザーと単純なニューラルネットワークプロンプトには2つの問題がある:悪用可能性の検証不到と、文脈の幻覚である。ニューラルネットワークは危険な関数を見ているが、入力データがすでに3つの層でフィルタリングされていることに気づかない。
Cloudflareは反対のアプローチを取り、厳格な原則に基づいてこのスキルを構築した:
- レポート生成は実際に悪用可能なもののみに限定。「理論的には攻撃者が~」といった表現は即座にフィルタリングされる。
- 脆弱性を発見した人物には検証権がない。別の独立したエージェントが検証役として機能する。
- 最初の防御層が攻撃ベクトルを確実にブロックしている場合、2番目の保護層の欠如は脆弱性と見なされない。
- 重要度の評価は形式的なチェックリストの一致ではなく、実際の影響に基づいて行われる。
6フェーズパイプラインの動作
1つの長いプロンプトではなく、このツールは作業を6つの連続した段階に分割する。並列サブエージェントが内部で動作し、それぞれが厳密に定義されたタスクを担当する。
+-------------------------------------------------------------+
| 1. Recon -> Карта архитектуры и точек входа |
| 2. Hunt -> Параллельные атаки по разным векторам |
| 3. Validate -> Попытка опровергнуть каждую находку |
| 4. Report -> Формирование читаемых отчетов |
| 5. Structured -> Генерация findings.json со схемой |
| 6. Verify -> Сверка фактов со свежими агентами |
+-------------------------------------------------------------+
1. Recon(偵察)
エージェントがプロジェクトを調査し、信頼境界を定義し、エントリーポイントを特定し、全体的なアーキテクチャをマッピングする。結果は攻撃エージェントのマップとして機能するファイル architecture.md である。
2. Hunt(ハンティング)
複数のエージェントが異なる角度から並行してコードベースをテストする。プロジェクトは異なる攻撃クラスのプロンプトを持つ別々のファイルに分割される:
- インジェクション、アクセス制御、ビジネスロジック。
- Webプロトコルの特性、キャッシュ、認証 (
WEB-PROTOCOL-AND-AUTH.md)。 - DOMインジェクションやプロトタイプポリューションなどのクライアントサイドの脅威 (
CLIENT-SIDE.md)。 - ネイティブコードのメモリ安全性とバイナリ脆弱性 (
MEMORY-SAFETY-AND-BINARY.md)。 - LLMシステムの問題:プロンプトインジェクション、コンテキストリーク、ツールコール操作 (
AI-AND-LLM.md)。
各ハンティングエージェントは、疑わしいコールチェーンをさらに深く調査するために追加のプロセスを生成できる。
3. 敵対的検証
最も有用な段階。新しいエージェントは潜在的なバグのリストを受け取り、意図的に攻撃が機能しないことを証明しようとする。保護が実装されている場合、またはベクトルが隣接モジュールによってブロックされている場合、その発見は容赦なく取り消される。
4. レポートと構造化出力
ファイル REPORT.md と FINDINGS-DETAIL.md が生成され、Mediumレベル以上の脆弱性については詳細なトレースと findings.json が含まれる。構造化されたJSONは、外部依存関係のないNode.jsベースのスクリプト validate-findings.cjs によって検証される。
5. 独立検証
最終品質管理。クリーンなコンテキストを持つエージェントが、レポートの主張を行ごとに実際のコードと照合して検証し、行番号や関数名の幻覚を排除する。
インストールと実行
パッケージはSkills CLI経由で、ツールコールと並列サブエージェントをサポートする任意のコーディングエージェントに接続する。
プロジェクトインストール:
npx skills add https://github.com/cloudflare/security-audit-skill --skill security-audit
システム全体のグローバルインストール:
npx skills add https://github.com/cloudflare/security-audit-skill --skill security-audit --global
その後、エージェントでコードベースを開き、プレーンテキストで記述する:
security audit this codebase
または、特定のディレクトリとレポートパスを指定する:
do a security review, output to ~/audits/my-project
興味深い詳細として、実行は蓄積できる。テスト中に、1回の実行ではトラバーサルパスのランダム性により実際の問題の約半分しか発見されないことがわかった。このスキルは以前の findings.json を読み取り、既知のバグをスキップして、未踏査のコードブランチを調査できる。
対象ユーザー
このツールは並列ツールコールをサポートする高性能なモデルを必要とするため、弱いローカル環境では動作しない可能性が高い。
ただし、リファクタリングやテスト作成にエージェントを既に使用している場合、リリース前や大きなマージ前に細心の注意を払ったセキュリティ監査役を追加するのは優れたアイデアだ。「攻撃者」と「懐疑論者」の役割分担アプローチは、偽陽性の処理に伴う手動作業を大幅に削減する。
関連プロジェクト