
PoC Python pour CVE-2026-12944, une vulnérabilité SSRF via urllib et de lecture de fichiers dans Langflow 1.10.0. Identifie les versions et exploite le endpoint custom_component.
Langflow 1.10.0 SSRF via urllib
Langflow OSS ≤ 1.10.0 — exécution de code via composant personnalisé avec urllib.request / socket. La liste de refus du scanner de composants omettait ces modules de la bibliothèque standard. IBM a corrigé cela dans la version 1.10.1.
IBM l'évalue PR:L. Le point d'exécution est POST /api/v1/custom_component et cet appel nécessite un cookie de session / jeton bearer. Voici comment ce PoC en obtient un :
--test ne s'authentifie pas. Il effectue uniquement GET /api/v1/version (plus un GET / de connectivité).--read / --fetch s'authentifient d'abord, puis envoient le composant en POST.LANGFLOW_AUTO_LOGIN. Le script fait et, si le JSON contient , envoie . Aucun nom d'utilisateur ni mot de passe.GET /api/v1/auto_loginaccess_tokenAuthorization: Bearer …POST /api/v1/login avec --uname / --password en application/x-www-form-urlencoded (username, password). Les valeurs par défaut standard sont langflow / langflow.POST /api/v1/custom_component avec {"code": …} qui appelle urllib.request.urlopen(...).--uname / --password n'existent que pour l'étape 4. Ils sont inutilisés sur une installation par défaut.
Pour tests autorisés uniquement. N'exécutez pas ceci contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation de test.
Prérequis : Python 3, bibliothèque standard uniquement.
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
| Option | Ce qu'elle fait |
|---|---|
-u / --url | URL de base de Langflow (requise). http:// ou https://. Un nom d'hôte sans schéma est essayé en HTTPS d'abord, puis en HTTP. Les redirections http→https conservent le POST. Les certificats TLS invalides sont réessayés sans vérification ; --insecure ignore la vérification dès le départ |
--test | Empreinte uniquement : GET /api/v1/version (public). Pas de connexion, pas de custom_component |
--read PATH | Déclenche le gadget : lecture file:// de PATH via urllib.request (s'exécute sur le serveur) |
--fetch URL | SSRF : urllib.request.urlopen(URL) et affiche le corps de la réponse |
--uname / --password | Uniquement si AUTO_LOGIN est désactivé (valeurs par défaut standard : langflow / langflow) |
--insecure | Ignorer la vérification TLS |
--timeout | Délai d'attente HTTP en secondes (par défaut 30) |
Point de terminaison de --test : GET /api/v1/version. Un 200 avec "version" / "main_version" affiche VERSION, puis IN_WINDOW si cette chaîne est 1.0.0–1.10.0, puis PRESENT. Il ne touche jamais /api/v1/auto_login ni /api/v1/custom_component.
--read / --fetch atteignent GET /api/v1/auto_login (ou POST /api/v1/login), puis POST /api/v1/custom_component.
Sortie standard : VERSION, IN_WINDOW, OUT_OF_WINDOW, PRESENT, VULNERABLE, NEED_AUTH, NOT_FOUND, NOT_VULNERABLE, READ.

CVE : CVE-2026-12944. Bulletin IBM ; mettre à niveau vers 1.10.1.