
Geschlossener Kreislauf zur Schwachstellenbehebung: erkennen -> Exploit reproduzieren -> Patch generieren -> mit einem Proof-Harness verifizieren. Durchgearbeitetes Beispiel: Langflow CVE-2026-33017
Eine geschlossene Pipeline zur Behebung von Schwachstellen: erkennen → Exploit reproduzieren → Patch generieren → Patch gegen einen Proof-Harness verifizieren — bevor ein Fix vertraut wird.
Die meisten „KI behebt deine CVE“-Demos hören beim Generieren eines Patches auf. kavach-loop weigert sich, einem Patch zu vertrauen, bis er zwei Dinge gegen eine echte laufende Instanz der verwundbaren Software bewiesen hat: (1) der ursprüngliche Exploit funktioniert nicht mehr, und (2) die Anwendung funktioniert weiterhin normal. Das durchgearbeitete Beispiel ist eine echte kritische CVE.
⚠️ Umfang & Sicherheit: jedes Modul mit Netzwerkzugriff ist fest auf localhost gesperrt (
127.0.0.1/::1) und lehnt jedes andere Ziel ab. Der Exploit-Code existiert, um zu beweisen, dass ein Patch gegen einen Wegwerf-Container funktioniert, den du selbst betreibst — nicht um irgendetwas anzugreifen. Führe dies nur gegen das mitgelieferte Ziel aus.
Nicht authentifizierte Remote-Code-Ausführung in Langflow ≤ 1.8.2 — GHSA-vwmf-pq79-vjvx / NVD. POST /api/v1/build_public_tmp/{flow_id}/flow baut einen öffentlichen Flow ohne Authentifizierung; vom Angreifer gelieferter Node-code erreicht exec() ohne Sandbox, über eine sechsstufige Aufrufkette vom Route-Handler bis zur Senke.
flowchart LR
T["exploit_repro/<br/>disposable Langflow 1.8.2<br/>container (localhost only)"]
D["detection/<br/>Semgrep rule over<br/>live-extracted source"]
E["exploit_repro/exploit.py<br/>PoC: confirm RCE is real"]
P["patch_gen/<br/>LLM unified diff,<br/>applied to a real copy"]
V["proof_harness/verify.py<br/>exploit blocked? + app<br/>still works? → one verdict"]
T --> D --> E --> P --> V
V -->|fused confidence score| OUT["trusted / rejected"]
| Phase | Modul | Was es tatsächlich tut |
|---|---|---|
| Erkennen | detection/detect.py + rules/unauthenticated-exec-sink.yaml | Führt einen echten Semgrep-Durchlauf über Quellcode aus, der live aus dem Zielcontainer abgerufen wird. Die Regel markiert ehrlich die zuverlässig erkennbare Vorbedingung (eine nicht authentifizierte Route, die vom Angreifer strukturierte Eingaben an einen nachgelagerten Aufruf weiterleitet), nicht die vollständige sechsstufige Taint-Analyse – und sagt dies auch, mit confidence: LOW, sodass jeder Treffer weiterhin bestätigt werden muss. |
| Reproduzieren | exploit_repro/exploit.py | Ein PoC nur für localhost, der bestätigt, dass die RCE tatsächlich ausgelöst wird, sodass wir einen echten Fehler patchen und nicht eine Vermutung aus der statischen Analyse. |
| Patchen | patch_gen/generate.py | Ruft den echten aktuellen Quellcode der verwundbaren Funktion aus dem laufenden Container ab, holt 1–2 Referenz-Fixmuster, fragt ein LLM nach einem Unified Diff und wendet diesen dann auf einen zweiten Einwegcontainer an und startet ihn neu, damit der gepatchte Code neu geladen wird. |
| Verifizieren | proof_harness/verify.py + test_functionality.py | Fasst zwei Prüfungen zu einem Urteil zusammen: Der PoC muss nun fehlschlagen, und Langflows normale authentifizierte REST-API (Health, Version, whoami, Flow-CRUD) muss weiterhin funktionieren. Ein Patch, der den Exploit blockiert, indem er die Anwendung aushöhlt, wird abgelehnt. |
Die Ehrlichkeit ist der Punkt: Die Erkennungsregel dokumentiert genau, was sie beweist und was nicht, und der Verifizierer weigert sich, einen Patch nur deshalb als gut zu bezeichnen, weil der Exploit nicht mehr funktioniert.
pip install -r requirements.txt # requests, pytest, openai, semgrep
export OPENAI_API_KEY=... # for patch_gen
cd exploit_repro/langflow-cve-2026-33017
docker compose up -d # vulnerable target on 127.0.0.1:7860
curl -s http://127.0.0.1:7860/health
cd ../..
python detection/detect.py # static-analysis finding
python exploit_repro/exploit.py # confirm the RCE (localhost only)
python patch_gen/generate.py # generate + apply + verify a patch
pytest proof_harness/ # functionality smoke tests
Stoppen und löschen: docker compose down -v.
Die einzelnen Phasen (Erkennung, Exploit-Reproduktion, Patch-Generierung, Proof-Harness) sind implementiert und laufen gegen das echte Ziel. main.py ist ein schlankes Orchestrierungs-Skelett — die Phasen werden derzeit direkt wie oben gezeigt gesteuert. Sie in einen einzigen main()-Aufruf zu integrieren, ist der nächste Schritt.
Kavach (कवच) ist Sanskrit für „Rüstung“. Die Schleife ist die Rüstung: Nichts wird ausgeliefert, bevor es nicht angegriffen und als standhaltend erwiesen wurde.