修复带有嵌入式缺陷的类工件
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,因此智能体无法在运行过程中获取提示或上游修复。
FLAWED 让 Claude、Codex 和 Gemini CLI 在相同输入下正面交锋。
[!WARNING] FLAWED 会挂载 Docker socket(在宿主机上等同于 root 权限),并在其阶段容器内执行不受信任的第三方代码。请在你信任能够承载此工作负载的机器上运行它。参见
docs/security-model.md。
你需要 Docker,并且守护进程 socket 可访问。
# 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 用户可以通过
nix-shell 获取除 Docker 之外的所有内容。
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 开发循环,请在第二个终端中运行 make web-dev。它会在端口 5173 上提供
UI,并将 /api 代理到 flawed serve。
一个用于安全地针对此仓库运行 AI 编码智能体的隔离 devcontainer 记录在
.devcontainer/README.md 中。
漏洞规格 是输入单元。它包含一个仓库、一个存在漏洞的提交、一段漏洞描述、一个可选的重现器,以及一组提示变体,用于模拟该漏洞在现实中可能被报告的方式(SAST 发现、漏洞赏金报告、禁运公告、原始 PoC……)。规格是版本化且不可变的,因此历史运行的提示和判定永远不会被悄悄改变。
JSON 契约位于 bugs.schema.json,并在 docs/bug-specs.md 中有文档说明。所有随附的规格都描述已公开披露、上游已修复的漏洞。
Postgres 是唯一事实来源。运行元数据以及产物字节(补丁、判定、记录、日志)都存放在数据库中,因此一次部署完全由其数据库所捕获。data/ 目录是临时暂存区,各阶段在运行时挂载它。
scripts/export_dataset.py 和
scripts/import_dataset.py(也可从 Web UI 使用)。scripts/export_artifacts.py。uv run alembic upgrade head
会在启动时自动运行)。我们发布预构建的数据集,以便你可以加载已完成的活动,而不必自己运行所有内容。每个数据集是一个完整快照的 .tar.gz,托管在 https://flawed.s3.us-east-1.amazonaws.com。
单个捆绑包中的所有活动。
| 捆绑包 | 归档 |
|---|---|
| 所有活动 | full.tar.gz |
Snapshots → Import datasets,粘贴上面的某个归档链接,然后点击
Find archives。FLAWED 会按原样导入直接的 .tar.gz 链接,并将其解包到你的快照中。然后从快照列表中恢复它(恢复是一个单独的、需明确确认的步骤)。
仅当 URL 是可列举的存储桶或目录索引页面时,导入才会一次性发现多个归档。此处两者都不适用,因此请逐个导入链接。
下载一个归档,将其解包到快照目录
(FLAWED_HOST_SNAPSHOT_DIR,默认是 ./flawed-snapshots),它就会出现在快照列表中,随时可以恢复。
curl -LO https://flawed.s3.us-east-1.amazonaws.com/compressed/campaigns/full/cve-2026-45185-exim-bdat-uaf_full_gpt-5.5_1782988292.tar.gz
mkdir -p "$FLAWED_HOST_SNAPSHOT_DIR"
tar -xzf cve-2026-45185-exim-bdat-uaf_full_gpt-5.5_1782988292.tar.gz -C "$FLAWED_HOST_SNAPSHOT_DIR"
导入只是将捆绑包暂存到磁盘上。恢复它(会替换当前部署)是在快照页面上单独完成的。
packages/
flawed-core/ models, DB schema, settings
flawed-orchestrator/ run lifecycle, worker pool, devcontainer driver
flawed-stage-*/ the pipeline stages (clone, generate, validate, …)
flawed-agent-runner/ runs INSIDE the container (Claude / Codex / Gemini CLIs)
flawed-api/ FastAPI + SSE + notebook proxy
flawed-cli/ the `flawed` CLI
apps/web/ React + Vite + Tailwind webapp
containers/ base image, network lockdown, notebook container
bugs/ example bug specs
docs/ documentation (see above)
测试需要 Docker。它们通过 testcontainers 启动自己的 Postgres。
FLAWED 在 MIT License 下发布。欢迎贡献。 参见 CONTRIBUTING.md,并请按照 SECURITY.md 私下报告安全问题。
| 功能 | 它能为你带来什么 |
|---|
| 重复采样 | 一次运行会对同一输入执行 N 次迭代,因此结果是分布,而非个例。 |
| 活动(Campaigns) | 将同一个漏洞在多种补丁器变体和提示风格下进行扫描,从含糊的 "fix this plz" 到完整的公告,并在实时仪表盘上比较结果。 |
| 结果分级 | 每个补丁都会归入五种场景之一,从 S1(干净修复)到 S5(未修复漏洞且引入了新漏洞)。 |
| 交叉验证 | 补丁会由其他模型重新评判,最终数字会综合自评和交叉验证两种视角,从而避免单一评判者的偏见占主导。 |
| 作弊检测 | 审计器会标记出智能体找到上游修复而非自行解决漏洞的迭代。 |
| 活动 | 补丁器模型 | 大小 | 归档 |
|---|
| CVE-2026-22738 (Spring AI SpEL injection) | claude-opus-4-8 | 515.0 MB | .tar.gz |
| CVE-2026-22738 (Spring AI SpEL injection) | gpt-5.5 | 663.9 MB | .tar.gz |
CVE-2026-31431 (Linux algif_aead) | claude-opus-4-8 | 1.1 GB | .tar.gz |
CVE-2026-31431 (Linux algif_aead in-place) | gpt-5.5 | 966.9 MB | .tar.gz |
| CVE-2026-34197 (ActiveMQ Jolokia RCE) | claude-opus-4-8 | 645.2 MB | .tar.gz |
| CVE-2026-34197 (ActiveMQ Jolokia RCE) | gpt-5.5 | 819.0 MB | .tar.gz |
| CVE-2026-45185 (Exim BDAT use-after-free) | claude-opus-4-8 | 1.1 GB | .tar.gz |
| CVE-2026-45185 (Exim BDAT use-after-free) | gpt-5.5 | 1.0 GB | .tar.gz |
| CVE-2026-8512 (Chromium fsevents UAF) | claude-opus-4-8 | 500.7 MB | .tar.gz |
| CVE-2026-8512 (Chromium fsevents UAF) | gpt-5.5 | 342.7 MB | .tar.gz |
| freenginx-26 (Perl SV refcount UAF) | gpt-5.5 | 166.4 MB | .tar.gz |
| GHSA-wpqr-6v78-jr5g (Gemini CLI trust model) | claude-opus-4-8 | 1.2 GB | .tar.gz |
| GHSA-wpqr-6v78-jr5g (Gemini CLI trust model) | gpt-5.5 | 1.3 GB | .tar.gz |
| 文档 | 内容 |
|---|
docs/architecture.md | 组件、数据流、存储布局 |
docs/pipeline.md | 各阶段、迭代语义、容器布局 |
docs/security-model.md | 各阶段网络策略、沙箱化、威胁模型 |
docs/bug-specs.md | 输入契约、提示组合、版本化 |
docs/cli.md | flawed 命令参考 + 环境变量 |
docs/webapp.md | UI 导览 |
docs/notebook.md | JupyterLab 集成 + flawed 辅助模块 |
| 任务 | 命令 |
|---|
| 同步所有 Python + Node 依赖 | make dev |
| 运行测试 | make test |
| Lint | make lint |
| 自动格式化 | make format |
| Web 开发服务器(端口 5173) | make web-dev |
| E2E 冒烟测试 | make e2e |