
Modello Nuclei per il rilevamento di CVE-2026-33017, una vulnerabilità di esecuzione remota di codice non autenticata in Langflow ≤ 1.8.2. Esegue pre-controlli non distruttivi per distinguere le build vulnerabili da quelle corrette tramite l'analisi delle risposte HTTP.
Modello Nuclei che rileva CVE-2026-33017 — una vulnerabilità di esecuzione remota di codice non autenticata in Langflow ≤ 1.8.2 raggiungibile tramite l'endpoint pubblico di build dei flussi:
POST /api/v1/build_public_tmp/{flow_id}/flow
L'handler vulnerabile accetta un grafo di flusso data controllato
dall'attaccante e passa data.nodes[].data.node.template.code.value
direttamente a exec() di Python durante la build del grafo, senza sandbox.
La correzione (≥ 1.9.0) rimuove il parametro data dalla firma dell'handler,
quindi una build patchata rifiuta la stessa richiesta al livello di
validazione di FastAPI con HTTP 422.
Il template è non distruttivo. Invia un payload inerte contro un ID di
flusso zero-UUID, quindi non può raggiungere exec() nemmeno su un host
vulnerabile. Distingue l'handler vulnerabile da quello patchato esclusivamente
tramite la firma della risposta HTTP.
| Fase | Richiesta | Cosa ti dice |
|---|---|---|
| 1 | GET /api/v1/version |
Routing per la fase 2:
Una conferma reale di RCE richiede comunque (a) un UUID di flusso PUBLIC reale sul target e (b) un callback out-of-band (DNS/HTTP). Questo passaggio è volutamente non incluso qui — questo template è il pre-check sicuro che decide se ha senso eseguire un exploit attivo.
Host singolo:
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
Scansione di massa da una lista:
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
Con output di debug (vedi richieste/risposte grezze):
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
Valida il template localmente prima di eseguirlo:
nuclei -validate -t CVE-2026-33017.yaml
Target vulnerabile:
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
Target patchato — nessun finding emesso (la risposta 422 non corrisponde ad alcuna regola).
Query di discovery comuni per host Langflow (usale solo contro asset che sei autorizzato a testare):
http.title:"Langflow"app="Langflow"intitle:"Langflow" inurl:"/flows"AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HNelle build vulnerabili, l'handler pubblico è dichiarato all'incirca come:
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value reaches exec() in the
# Component build path
data è controllata dall'attaccante. L'handler patchato rimuove completamente
il parametro e impone data=None; ecco perché una richiesta che include un
campo data nel corpo viene respinta con 422 sulle build patchate.
/api/v1/build_public_tmp/
sul reverse proxy.LANGFLOW_AUTO_LOGIN=False, configura le credenziali del
superutente e ruota LANGFLOW_SECRET_KEY.access_type=PUBLIC sono
quelli che un attaccante cercherebbe nell'URL.Questo template è pubblicato solo per sicurezza difensiva e test autorizzati. Eseguirlo contro sistemi di cui non si è proprietari o per cui non si dispone di esplicita autorizzazione scritta è illegale nella maggior parte delle giurisdizioni e viola i termini di servizio della piattaforma.
Usando questo template accetti che:
lopseg — https://github.com/lopseg
Pull request e issue sono benvenute.
MIT
| Conferma che il target è Langflow ed estrae la versione della build. |
| 2 | POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow con un corpo contenente il campo data e un template.code.value inerte | Decisione di routing di seguito. |
| Stato | Il corpo contiene | Verdetto |
|---|
404 | flow / public | VULNERABILE — l'handler ha accettato data, la ricerca è poi fallita perché l'UUID è finto. |
200 | job_id / build / task | VULNERABILE — l'handler ha accettato data ed è entrato nel percorso di build. |
5xx | exec / Component / traceback | VULNERABILE — l'handler ha raggiunto il percorso di codice exec prima di fallire. |
422 | Field required / extra / data | PATCHED — la firma dell'handler non accetta più data. |