
Remediation delle vulnerabilità a ciclo chiuso: rilevamento -> riproduzione dell'exploit -> generazione della patch -> verifica con un proof harness. Esempio pratico: Langflow CVE-2026-33017
Una pipeline di remediation delle vulnerabilità a ciclo chiuso: rileva → riproduci l'exploit → genera una patch → verifica la patch contro un proof harness — prima che qualsiasi correzione venga considerata affidabile.
La maggior parte delle demo "l'AI corregge la tua CVE" si ferma alla generazione di una patch. kavach-loop si rifiuta di considerare affidabile una patch finché non ha dimostrato due cose contro un'istanza reale in esecuzione del software vulnerabile: (1) l'exploit originale non funziona più, e (2) l'applicazione continua a funzionare normalmente. L'esempio pratico è una CVE critica reale.
⚠️ Ambito e sicurezza: ogni modulo che interagisce con la rete è bloccato in modo rigido su localhost (
127.0.0.1/::1) e rifiuta qualsiasi altro target. Il codice dell'exploit esiste per dimostrare che una patch funziona contro un container usa-e-getta che esegui tu stesso — non per attaccare nulla. Esegui questo strumento solo contro il target incluso.
Esecuzione di codice remoto non autenticata in Langflow ≤ 1.8.2 — GHSA-vwmf-pq79-vjvx / NVD. POST /api/v1/build_public_tmp/{flow_id}/flow costruisce un flow pubblico senza autenticazione; il campo code del nodo fornito dall'attaccante raggiunge exec() senza sandbox, attraverso una catena di chiamate a sei salti dal route handler al sink.
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"]
| Fase | Modulo | Cosa fa realmente |
|---|---|---|
| Rilevamento | detection/detect.py + rules/unauthenticated-exec-sink.yaml | Esegue un vero passaggio Semgrep sul codice sorgente prelevato in tempo reale dal container di destinazione. La regola segnala onestamente la precondizione rilevabile in modo affidabile (una route non autenticata che inoltra input strutturato dall'attaccante verso una chiamata a valle), non l'intera propagazione del taint a sei salti — e lo dichiara esplicitamente, con confidence: LOW, così ogni rilevamento necessita comunque di conferma. |
| Riproduzione | exploit_repro/exploit.py | PoC solo su localhost che conferma che l'RCE si attiva effettivamente, così stiamo correggendo un bug reale, non un'ipotesi di analisi statica. |
| Patch | patch_gen/generate.py | Recupera il codice sorgente reale e attuale della funzione vulnerabile dal container in esecuzione, ottiene 1–2 pattern di correzione di riferimento, chiede a un LLM un diff unificato, quindi lo applica a un secondo container usa e getta e lo riavvia affinché il codice corretto venga ricaricato. |
| Verifica | proof_harness/verify.py + test_functionality.py | Fonde due controlli in un unico verdetto: il PoC deve ora fallire, e la normale API REST autenticata di Langflow (health, version, whoami, CRUD dei flow) deve continuare a funzionare. Una patch che blocca l'exploit smontando l'applicazione viene rifiutata. |
L'onestà è il punto centrale: la regola di rilevamento documenta esattamente cosa dimostra e cosa non dimostra, e il verificatore rifiuta di considerare buona una patch solo perché l'exploit ha smesso di funzionare.
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
Arresta e cancella: docker compose down -v.
Le singole fasi (rilevamento, riproduzione dell'exploit, generazione della patch, harness di verifica) sono implementate ed eseguite contro il target reale. main.py è uno scheletro di orchestrazione minimale — al momento le fasi vengono pilotate direttamente come mostrato sopra. Collegarle in un'unica chiamata main() è il passo successivo.
Kavach (कवच) in sanscrito significa "armatura". Il ciclo è l'armatura: nulla viene rilasciato finché non è stato attaccato e non è stato dimostrato che resiste.