
CVE Reproduction: cve-2026-0770-langflow_rce_reproduction
CVSS 9.8 (Critique) | ZDI-CAN-27325 | CWE-829 : Inclusion de fonctionnalités provenant d'une source non fiable
CVE-2026-0770 est une vulnérabilité critique d'exécution de code à distance non authentifiée dans Langflow, un framework d'application low-code pour la construction d'applications basées sur des LLM. La faille réside dans le point de terminaison /api/v1/validate où le paramètre exec_globals est transmis de manière non sécurisée à la fonction exec() de Python, permettant à des attaquants non authentifiés d'exécuter du code arbitraire avec les privilèges du processus Langflow (généralement root).
Découverte grâce à l'initiative Zero Day (ZDI-CAN-27325).
Le point de terminaison de validation de Langflow /api/v1/validate accepte une charge utile JSON contenant un champ exec_globals. Ce dictionnaire est destiné à un usage interne pour pré-remplir les variables globales lors de la validation de composants personnalisés. Cependant, le point de terminaison ne nettoie ni ne restreint le contenu de exec_globals, et les valeurs sont transmises directement à la fonction intégrée exec() de Python :
exec(user_code, exec_globals)
Un attaquant peut injecter du code Python arbitraire en fournissant un dictionnaire exec_globals contrefait qui remplace les fonctions intégrées ou injecte des callables malveillants. Lorsque Langflow évalue en interne le code utilisateur avec ces globals, le code injecté s'exécute.
La vulnérabilité est classée comme CWE-829 car l'application inclut des fonctionnalités (via exec_globals) provenant d'une source non fiable (la requête réseau) sans validation adéquate, conduisant à une exécution de code arbitraire.
Toutes les versions de Langflow antérieures au correctif mettant en œuvre un filtrage approprié de exec_globals dans le point de terminaison de validation sont concernées. Les versions spécifiques concernées incluent :
/api/v1/validate accepte exec_globals sans validation/api/v1/validate avec une charge utile exec_globals malveillanteUtilisez le script exploit.py inclus :
python exploit.py --target 192.168.1.100 --port 7860 --command "id > /tmp/pwned"
exec_globals.Avertissement : Ces informations sont fournies à des fins éducatives et uniquement pour des tests de sécurité autorisés. L'utilisation non autorisée contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite est illégale.