
Laboratoire reproductible pour CVE-2026-33017, une RCE non authentifiée dans Langflow. Inclut un service vulnérable conteneurisé avec Docker et un PoC à impact minimal qui démontre l'exécution de code via le point de terminaison public de build.
CVE-2026-33017 est une vulnérabilité d'Exécution de Code à Distance (RCE) non authentifiée dans Langflow où un endpoint de build public accepte des données de flux contrôlées par l'attaquant, permettant l'exécution de code de composant personnalisé sur le serveur.
Dans ce laboratoire, le flux de validation est :
PUBLICjob_idLa preuve est récupérée directement via le mécanisme d'événements de l'API Langflow, rendant le résultat observable via l'interface système elle-même.
Ce document présente un laboratoire vuln uniquement.
Actuellement, docker compose ne contient qu'un seul service : vuln, car ce projet suit une approche et évite les environnements corrigés qui ne sont pas basés sur un artefact corrigé officiel.
Le comportement suivant a été vérifié dans ce laboratoire :
http://localhost:78611.8.1build_public_tmp retourne un job_idExemple d'objet de preuve :
{
"canary": "lf33017-c14fc1c9",
"id_output": "uid=1000(user) gid=0(root) groups=0(root)",
"whoami": "user",
"hostname": "155aa3fd5e2a",
"cwd": "/app",
"python_version": "3.12.12"
}
Les preuves clés sont :
id_outputwhoamihostnamecwdpython_versionLes informations ci-dessus montrent que le code contrôlé par l'attaquant a réellement été exécuté côté serveur.
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── poc/
│ └── poc.py
├── README.md
└── .gitignore
7861 -> 7860Cette vulnérabilité existe car l'endpoint de build public de Langflow accepte des définitions de flux fournies par l'utilisateur, même si l'endpoint est déjà conçu pour les flux publics. Lorsqu'un attaquant soumet une définition de nœud contenant du code de composant personnalisé, le système transmet ce code dans le chemin de build du flux, ce qui aboutit finalement à une exécution de code sur le serveur.
Le PoC de ce projet utilise un composant personnalisé qui retourne un objet de preuve dans sa sortie pour démontrer que le code contrôlé par l'attaquant est réellement exécuté.
Le PoC de ce projet est conçu pour être à impact minimal et se concentre sur une preuve clairement observable via l'API. Son flux de travail est le suivant :
PUBLICjob_idCe PoC ne couvre pas :
docker compose up -d --build
curl -i http://localhost:7861/api/v1/version
python3 poc/poc.py --base-url http://localhost:7861 --artifact-dir ./artifacts/vuln
Lorsque le PoC réussit, la sortie ressemblera à ceci :
[+] http://localhost:7861 ready (version=1.8.1)
=== TARGET: vuln ===
Base URL : http://localhost:7861
Version : 1.8.1
Flow ID : <uuid>
HTTP : 200
Job ID : <uuid>
Canary : lf33017-xxxxxxxx
Events : artifacts/vuln/events-<job_id>.ndjson
Polls : 2
[+] Proof observed through the Langflow API events endpoint:
{
"canary": "lf33017-xxxxxxxx",
"id_output": "uid=1000(user) gid=0(root) groups=0(root)",
"whoami": "user",
"hostname": "<container-hostname>",
"cwd": "/app",
"python_version": "3.12.x"
}
[+] Vulnerable behavior observed
Le fichier artifacts/vuln/events-<job_id>.ndjson stocke les données brutes des événements pour un débogage supplémentaire.
Ce PoC démontre que :
Ce PoC n'est pas destiné à démontrer une persistance ou une post-exploitation avancée et maintient l'impact au niveau minimal nécessaire pour valider la vulnérabilité.
Sur la base de ce laboratoire, l'impact démontré est :
Ce dépôt n'inclut pas de service corrigé par conception.
Sa portée est limitée à la reproduction du comportement vulnérable sur un artefact amont réel. Un côté corrigé n'est ajouté que lorsqu'un artefact corrigé officiel clairement vérifiable est disponible auprès du fournisseur ou du projet amont.
Pour cette raison, ce dépôt évite délibérément :
Cela maintient le laboratoire étroitement ciblé et techniquement honnête. Plutôt que de présenter une configuration côte à côte artificielle, le dépôt se concentre sur trois choses :
En pratique, cela rend ce dépôt particulièrement adapté pour :
docker compose down -v
Ce laboratoire est conçu pour des tests sur localhost uniquement.
Exigences d'utilisation :