
Fix-Like-Artefakte mit eingebetteten Defekten
Fix Like Artifacts with Embedded Defects
Ein Research-Harness zur Messung, wie gut KI-Agenten Schwachstellen patchen.
Quickstart · Datasets · Dokumentation · Sicherheitsmodell · Mitwirken
FLAWED checkt ein Open-Source-Projekt an einem bekannten verwundbaren Commit aus, übergibt einem KI-Agenten eine Beschreibung des Bugs und bittet ihn, einen Patch zu schreiben. Der Agent sieht nie den echten Upstream-Fix.
Jeder Patch wird anschließend in isolierten Containern validiert, auditiert und bewertet, sodass du nicht nur siehst, ob das Modell den Bug behoben hat, sondern auch, ob es dabei neue eingeführt hat.
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]Jede Stufe läuft in ihrem eigenen Container. Nur clone hat Netzwerkzugriff.
Jede spätere Stufe ist auf die API des LLM-Anbieters beschränkt, sodass Agenten
während des Laufs keine Hinweise oder den Upstream-Fix abrufen können.
| Funktion | Was sie dir bietet |
|---|---|
| Wiederholte Stichproben | Ein Lauf führt N Iterationen derselben Eingabe aus, sodass Ergebnisse Verteilungen sind, keine Anekdoten. |
| Kampagnen | Fahre einen Bug über Patcher-Varianten und Prompt-Stile hinweg durch, von einem vagen „fix this plz" bis zu einem vollständigen Advisory, und vergleiche die Ergebnisse auf einem Live-Dashboard. |
| Ergebnisbewertung | Jeder Patch landet in einem von fünf Szenarien, von S1 (sauberer Fix) bis S5 (Bug nicht behoben und eine neue Schwachstelle eingeführt). |
| Kreuzvalidierung | Patches werden von anderen Modellen erneut beurteilt, und die Kennzahlen mitteln die Selbst- und Kreuzvalidierungsperspektive, damit die Voreingenommenheit eines einzelnen Richters nicht dominiert. |
| Betrugserkennung | Ein Auditor markiert Iterationen, in denen der Agent den Upstream-Fix gefunden hat, anstatt den Bug selbst zu lösen. |
FLAWED lässt die CLIs von Claude, Codex und Gemini mit denselben Eingaben direkt gegeneinander antreten.
[!WARNING] FLAWED bindet den Docker-Socket ein (root-äquivalent auf dem Host) und führt nicht vertrauenswürdigen Code Dritter in seinen Stufen-Containern aus. Führe es auf einer Maschine aus, der du diese Arbeitslast zutraust. Siehe
docs/security-model.md.
Du brauchst Docker, mit zugänglichem Daemon-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
Dann starte deinen ersten Lauf.
bugs/.
Ziehe eine in die Seite Bug Specs der Web-UI oder nutze die CLI.
./scripts/import-all-bugs.sh
[!NOTE] Der erste Lauf gegen ein großes Upstream (z. B. Chromium) ist langsam. Die validate-Stufe klont das gesamte Repo einmal, um gegen den echten Upstream-Patch zu diffen. Der Klon wird zwischengespeichert und danach wiederverwendet.
Du brauchst Docker, Node 20+, pnpm, uv und
@devcontainers/cli (npm i -g @devcontainers/cli). Nix-Nutzer können
nix-shell für alles außer Docker verwenden.
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
Für den Web-Dev-Loop führe make web-dev in einem zweiten Terminal aus. Es
serviert die UI auf Port 5173 und proxyt /api an flawed serve.
Ein isolierter Devcontainer, um KI-Coding-Agenten sicher gegen dieses Repo
laufen zu lassen, ist in .devcontainer/README.md
dokumentiert.
Eine Bug-Spec ist die Eingabeeinheit. Sie enthält ein Repo, einen verwundbaren Commit, eine Bug-Beschreibung, einen optionalen Reproducer und eine Reihe von Prompt-Varianten, die modellieren, wie der Bug realistischerweise gemeldet werden könnte (SAST-Finding, Bug-Bounty-Bericht, gesperrtes Advisory, roher PoC, …). Specs sind versioniert und unveränderlich, sodass Prompt und Urteil eines historischen Laufs sich nie stillschweigend ändern.
Der JSON-Vertrag liegt in bugs.schema.json und ist in
docs/bug-specs.md dokumentiert. Alle mitgelieferten Specs
beschreiben öffentlich offengelegte, upstream-behobene Schwachstellen.
Postgres ist die einzige Quelle der Wahrheit. Lauf-Metadaten und
Artefakt-Bytes (Patches, Urteile, Transkripte, Logs) liegen in der Datenbank,
sodass ein Deployment vollständig durch seine DB erfasst wird. Das Verzeichnis
data/ ist flüchtiger Scratch-Speicher, den die Stufen zur Laufzeit einbinden.
scripts/export_dataset.py und scripts/import_dataset.py (auch aus der
Web-UI verfügbar).scripts/export_artifacts.py.uv run alembic upgrade head läuft automatisch beim Start).Wir veröffentlichen vorgefertigte Datasets, damit du abgeschlossene Kampagnen
laden kannst, anstatt alles selbst laufen zu lassen. Jedes Dataset ist ein
.tar.gz eines vollständigen Snapshots, gehostet unter
https://flawed.s3.us-east-1.amazonaws.com.
Alle Kampagnen in einem Bundle.
| Bundle | Archiv |
|---|---|
| Alle Kampagnen | full.tar.gz |
| Kampagne | Patcher-Modell | Größe | Archiv |
|---|---|---|---|
| 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 |
Snapshots → Import datasets, füge einen der obigen Archiv-Links ein und
klicke auf Find archives. FLAWED importiert einen direkten .tar.gz-Link
unverändert und entpackt ihn in deine Snapshots. Stelle ihn dann aus der
Snapshot-Liste wieder her (das Wiederherstellen ist ein separater, explizit
bestätigter Schritt).
Der Import entdeckt mehrere Archive auf einmal nur, wenn die URL ein auflistbarer Bucket oder eine Verzeichnisindexseite ist. Nichts davon trifft hier zu, also importiere die Links einzeln.
Lade ein Archiv herunter, entpacke es in das Snapshot-Verzeichnis
(FLAWED_HOST_SNAPSHOT_DIR, oder standardmäßig ./flawed-snapshots), und es
erscheint in der Snapshot-Liste, bereit zur Wiederherstellung.
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"
Der Import legt das Bundle nur auf der Festplatte ab. Das Wiederherstellen, das das aktuelle Deployment ersetzt, erfolgt separat über die Snapshots-Seite.
| Doku | Inhalt |
|---|---|
docs/architecture.md | Komponenten, Datenfluss, Speicherlayout |
docs/pipeline.md | Die Stufen, Iterationssemantik, Container-Layout |
docs/security-model.md | Netzwerkrichtlinie pro Stufe, Sandboxing, Bedrohungsmodell |
docs/bug-specs.md | Eingabevertrag, Prompt-Zusammensetzung, Versionierung |
docs/cli.md | flawed-Befehlsreferenz + Umgebungsvariablen |
docs/webapp.md | UI-Tour |
docs/notebook.md | JupyterLab-Integration + das flawed-Hilfsmodul |
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)
| Aufgabe | Befehl |
|---|---|
| Alle Python- + Node-Abhängigkeiten synchronisieren | make dev |
| Tests ausführen | make test |
| Lint | make lint |
| Auto-Formatierung | make format |
| Web-Dev-Server (Port 5173) | make web-dev |
| E2E-Smoke-Test | make e2e |
Tests brauchen Docker. Sie starten ihr eigenes Postgres über testcontainers.
FLAWED wird unter der MIT-Lizenz veröffentlicht. Beiträge sind willkommen. Siehe CONTRIBUTING.md, und melde Sicherheitsprobleme bitte privat gemäß SECURITY.md.
.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 |