埋め込み欠陥を持つFix-Likeアーティファクト
Fix Like Artifacts with Embedded Defects
AIエージェントが脆弱性をどれだけうまく修正できるかを測定するための研究ハーネス。
クイックスタート · データセット · ドキュメント · セキュリティモデル · コントリビューション
FLAWEDは、既知の脆弱なコミット時点でオープンソースプロジェクトをチェックアウトし、AIエージェントにバグの説明を渡してパッチを書くよう依頼します。エージェントが実際のアップストリームの修正を目にすることはありません。
その後、すべてのパッチは隔離されたコンテナ内で検証、監査、採点されるため、モデルがバグを修正したかどうかだけでなく、その過程で新たなバグを混入させなかったかどうかも確認できます。
flowchart LR
spec[bug spec] --> clone
clone["clone<br/>(open net)"] --> generate
generate["generate<br/>(offline)"] --> validate
validate["validate<br/>(offline)"] --> ast["ast<br/>(offline)"]
generate -.->|"patch.diff"| store[(Postgres)]
validate -.->|"verdict"| store
ast -.->|"summary"| store
store --> ui[web UI + notebook]
各ステージはそれぞれ独自のコンテナ内で実行されます。ネットワークアクセスを持つのはcloneだけです。それ以降のすべてのステージはLLMプロバイダーのAPIのみに制限されているため、エージェントは実行中にヒントやアップストリームの修正を取得できません。
| 機能 | 得られるもの |
|---|---|
| 反復サンプリング | 1回の実行で同じ入力をN回反復するため、結果は逸話ではなく分布になります。 |
| キャンペーン | 1つのバグをパッチャーのバリアントとプロンプトスタイル(曖昧な*「これ直して」*から完全なアドバイザリまで)にわたってスイープし、ライブダッシュボードで結果を比較できます。 |
| 結果の採点 | すべてのパッチは5つのシナリオのいずれかに分類されます。S1(クリーンな修正)からS5(バグを修正せず、新たな脆弱性を混入させた)まで。 |
| クロスバリデーション | パッチは他のモデルによって再判定され、主要な数値は自己検証とクロスバリデーションの両方の視点を平均するため、単一の判定者のバイアスが支配的になることはありません。 |
| チート検出 | 監査者が、エージェントがバグ自体を解決する代わりにアップストリームの修正を見つけてしまった反復をフラグ付けします。 |
FLAWEDはClaude、Codex、GeminiのCLIを同じ入力で直接対決させます。
[!WARNING] FLAWEDはDockerソケット(ホスト上ではroot相当)をマウントし、ステージコンテナ内で信頼できないサードパーティのコードを実行します。そのワークロードを処理できると信頼できるマシン上で実行してください。詳細は
docs/security-model.mdを参照してください。
Dockerが必要で、デーモンソケットにアクセスできる必要があります。
# 1. Configure. Writes .env for you (data dir + provider API keys)
./setup.sh
# 2. Bring up the stack (Postgres, API + worker, web UI, notebook)
docker compose up --build
# 3. Open http://127.0.0.1:8080
次に最初の実行を行います。
bugs/以下に同梱されています。Web UIのBug Specsページにドラッグするか、CLIを使用します。
./scripts/import-all-bugs.sh
[!NOTE] 大規模なアップストリーム(例: Chromium)に対する最初の実行は遅くなります。validateステージは、実際のアップストリームパッチと差分を取るためにリポジトリ全体を一度クローンします。クローンはキャッシュされ、その後再利用されます。
Docker、Node 20+、pnpm、uv、および@devcontainers/cli(npm i -g @devcontainers/cli)が必要です。NixユーザーはDocker以外のすべてをnix-shellで用意できます。
make dev # uv sync + web deps
docker compose up -d postgres # FLAWED needs a Postgres to talk to
cp .env.example .env # points FLAWED_DB_URL at it
uv run flawed init # builds base images, creates the schema
uv run flawed serve # API + worker + webapp on port 8080
Webの開発ループには、2つ目のターミナルでmake web-devを実行します。UIをポート5173で提供し、/apiをflawed serveにプロキシします。
このリポジトリに対してAIコーディングエージェントを安全に実行するための隔離されたdevcontainerは、.devcontainer/README.mdに文書化されています。
バグスペックは入力の単位です。リポジトリ、脆弱なコミット、バグの説明、オプションの再現手順、およびバグが現実的にどのように報告されるかをモデル化した一連のプロンプトバリアント(SASTの検出結果、バグバウンティレポート、 embargoされたアドバイザリ、生のPoCなど)を保持します。スペックはバージョン管理され不変であるため、過去の実行のプロンプトと判定が黙って変わることはありません。
JSONコントラクトはbugs.schema.jsonにあり、docs/bug-specs.mdに文書化されています。同梱されているすべてのスペックは、公開開示され、アップストリームで修正された脆弱性を記述しています。
Postgresが唯一の信頼できる情報源です。実行メタデータおよびアーティファクトのバイト列(パッチ、判定、トランスクリプト、ログ)はデータベース内に存在するため、デプロイメントはそのDBによって完全に捕捉されます。data/ディレクトリは、ステージが実行時にマウントする一時的なスクラッチ領域です。
scripts/export_dataset.pyとscripts/import_dataset.pyで行います(Web UIからも利用可能)。scripts/export_artifacts.pyを使用します。uv run alembic upgrade headは起動時に自動的に実行されます)。すべてを自分で実行する代わりに、完了したキャンペーンをロードできるよう、事前構築済みのデータセットを公開しています。各データセットは1つの完全なスナップショットの.tar.gzで、**https://flawed.s3.us-east-1.amazonaws.com**でホストされています。
単一のバンドル内のすべてのキャンペーン。
| バンドル | アーカイブ |
|---|---|
| すべてのキャンペーン | full.tar.gz |