Claude for Securing Source Code (defending-code-reference-harness)
https://github.com/anthropics/defending-code-reference-harness
AnthropicによるClaudeを使った自律的脆弱性発見と人間レビューによる修正のリファレンス実装
Mythosで培った知見
概要
recon → find → triage → report → patch のループを実装したリファレンス
メンテナンスされず、コントリビューションも受け付けない
製品ではなくリファレンスであり、再利用すべきは構造・プロンプト・2コンテナのトラストバウンダリ
軽量なSDKのみの解説はcompanion cookbookにある
言語構成はPython93.3%、Shell、C、Dockerfile
2つの構成要素
Claude Codeスキル: /quickstart /threat-model /vuln-scan /triage /patch /customize
対話的なスコープ設定・スキャン・トリアージ・パッチ
repoをClaude Codeで開き/quickstartで全体把握
harness/: 自律パイプライン(recon → find → verify → report → patch)
C/C++のメモリ破壊向けにDocker+ASANと並列エージェントで実装
/customizeで別言語・別ディテクタ・別脆弱性クラスへ移植
セキュリティ境界
対話的スキル(/quickstart /threat-model /vuln-scan /triage)はファイル読み書きのみで、各ツール使用を承認すれば安全
静的findings上の/patchもファイルのみ
/customizeはパイプラインソースも編集し検証コマンドを実行しうる
自律パイプライン(Step2以降、パイプライン結果への/patch含む)は対象コードを実行する
gVisorエージェントサンドボックスを同梱し、その外でのエージェント起動を拒否する
scripts/setup_sandbox.shを一度実行しbin/vp-sandboxed経由で起動
マネージド版: Claude Security
Anthropicが提供するホスト型製品Claude Security
複数プロジェクトにまたがりソースコードの脆弱性を発見・修正
多段検証パイプラインで偽陽性を削減し、トリアージ・修正検証・迅速な修正生成まで管理
本repoはオープンソースのリファレンスで、Bedrock・Vertex・Azure含む任意のClaude APIアクセスで利用可能
ランプアップ(段階導入)
Day1: 脅威モデル+最初の静的スキャン+トリアージ
Day2: C/C++ライブラリでリファレンスパイプラインを実行
Day3-5: 自分のターゲット向けにカスタマイズ
Week2: 自律スキャン・トリアージ・パッチを開始
Step1: 脅威モデル・スキャン・トリアージ
ファイル読み書きのみで追加サンドボックス不要
CLAUDE_CODE_SUBAGENT_MODELでサブエージェントのモデルを固定
/threat-model bootstrapで先に脅威モデルを作る(撃つ前に狙う)
/vuln-scanで脅威モデルに沿った静的スキャン
/triageで検証・重複排除・ランク付け
/patchで検証済みfindingsの修正候補生成
生成物: THREAT_MODEL.md VULN-FINDINGS.{json,md} TRIAGE.{json,md} PATCHES/
これらは静的候補で、実行検証されたクラッシュにはStep2へ
Step2: 自律パイプラインの実行
Step1の脅威モデルのフォーカスエリアに導かれ、自律的にクラッシュを発見・検証・報告
中身は3つ
1. ターゲットごとのDockerイメージ: DockerfileがASAN(クラッシュ検出器)付きでコンパイル
2. recon: ネットワーク隔離コンテナでソースを読み(実行なし)、攻撃対象を分割提案してfocus_areas化
並列findエージェントが別々の箇所から始め、浅いバグへの集中を避ける
3. run: N個のfindエージェントが各自隔離コンテナで並列実行
ソース読取 → 不正入力作成 → ASANバイナリ実行 → クラッシュが3/3再現まで反復
別のgradeエージェントがfinderが触れていないクリーンコンテナで各クラッシュを検証
runは自律エージェントを起動するためgVisorコンテナ内でegressをAPIに制限
結果はresults/<target>/<timestamp>/、--streamで数分以内に最初のレポート
Step3: 自分のターゲット向けカスタマイズ
リファレンスはC/C++/ASANだが構造は汎用的
移植は名詞の入れ替えで済み、ループの再構築は不要
ディテクタ: ASANクラッシュ署名 → 例外/カナリアファイル/DNSコールバック
PoCの形: クラッシュ入力ファイル → HTTPリクエスト列/txリスト/テストハーネス
ビルド: targets/*/Dockerfile → 自分の言語のコンテナビルド
まず読み取り専用のStep1スキルを自分のコードに向け、実出力を見てから/customizeの面談へ進む
Step4: スキャン・トリアージ・パッチの運用
自律ループを自分のターゲットで回し、バッチをトリアージし、上位をパッチして繰り返す
/triageはrun間の重複を畳み、スキャナの主張ではなく導出したexploitabilityで再ランクし、各findingをコンポーネントオーナーに振り分ける
/patchは修正生成の統一入口
パイプライン入力: 各diffを実行可能な「ラダー」で採点(適用+ビルド・元PoC停止・回帰テスト通過・新findエージェントが再攻撃)しverified: "ladder_passed"
静的入力: 実行オラクルがないため、diffとソース箇所のみ見る独立エージェントがレビューしverified: "static_review_only"
どちらもdiffはドラフトであり、upstream前に必ず読む
ベストプラクティス
スキャン前にシステムを地図化する
大規模コードベースはまず全体を読ませシステム設計と脅威モデルを抽出
コンポーネント単位で回し、個々が綺麗になったら連鎖バグを横断的に探す
できる限り多くのコンテキストを与える
研究資料・設計資料・git履歴・社内ポータルを併せて与えると非自明なバグに届く
ハント方法を指示せず、コンテキストを与えて離れる
長い指示や段階チェックリストは逆効果で、モデルが足場をパターンマッチしてしまう
作業を綺麗に分割する
並列エージェントは分割しないと同じ浅いバグに収束する、reconが最も有効
偽陽性を速く潰すことに投資する
検証器が要であり、安価なプログラム的ゲート(サニタイザ信号・パースチェック・3/3再現)を敵対的grader agentの前段に置く
書かれた論証より実行可能な証拠(クラッシュ、漏洩値)を優先
上級者向けのヒント
既存バックログを先に食わせる
旧スキャナ・過去モデル・bug bounty由来の未処理findingを下げ/反証させ、生存分で深刻度スコアを較正
ソースだけでなくライブなサンドボックスを与える
実行環境(HTTPトラフィック・ログ・シードDB・エミュレータ)があると静的レポートで止まらず文脈依存のexploitに連鎖する
分散を前提にrun間でunionを取る
同じプロンプト・同じターゲットでも結果や深刻度は一致しない、各runをサンプルとして扱う
judge agentでリストを絞る
第2エージェントが各findingを批判し第3が裁定、モデルは直接問えば自分のfindingを確実に下げる、/triageがこのループを内包
完璧なパイプラインを待たない
まずスキャンし、足りないものをモデルに言わせ、教訓を戻す、CHEATSHEET.mdが速く複利を生む
OSSターゲットは開示を調整する
検証済みCritical/HighはOSS調整機関経由で、Low/Mediumは保留、無調整のvuln放出はメンテナの善意を焼く