
Modèle Nuclei pour détecter CVE-2026-33017, une vulnérabilité d'exécution de code à distance non authentifiée dans Langflow ≤ 1.8.2. Effectue des pré-vérifications non destructives pour distinguer les versions vulnérables des versions corrigées via l'analyse des réponses HTTP.
Template Nuclei qui détecte CVE-2026-33017 — une vulnérabilité d'exécution de code à distance non authentifiée dans Langflow ≤ 1.8.2 accessible via le point de terminaison public flow-build :
POST /api/v1/build_public_tmp/{flow_id}/flow
Le gestionnaire vulnérable accepte un graphe de flux data contrôlé par l'attaquant et transmet data.nodes[].data.node.template.code.value directement dans Python exec() lors de la construction du graphe, sans sandboxing. Le correctif (≥ 1.9.0) supprime le paramètre data de la signature du gestionnaire, de sorte qu'une version corrigée rejette la même requête au niveau de la validation FastAPI avec HTTP 422.
Le template est non destructeur. Il envoie une charge utile inerte contre un ID de flux zéro-UUID, de sorte qu'il ne peut pas atteindre exec() même sur un hôte vulnérable. Il distingue le gestionnaire vulnérable du gestionnaire corrigé uniquement par la signature de la réponse HTTP.
| Étape | Requête | Ce qu'elle vous indique |
|---|---|---|
| 1 |
Routage pour l'étape 2 :
Une confirmation RCE réelle nécessite encore (a) un UUID de flux PUBLIC réel sur la cible et (b) un rappel hors bande (DNS/HTTP). Cette étape n'est pas incluse ici intentionnellement — ce template est la pré-vérification sécurisée qui décide s'il est pertinent d'exécuter un exploit actif.
Hôte unique :
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
Analyse en masse à partir d'une liste :
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
Avec sortie de débogage (voir les requêtes/réponses brutes) :
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
Validez le template localement avant de l'exécuter :
nuclei -validate -t CVE-2026-33017.yaml
Cible vulnérable :
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
Cible corrigée — aucun résultat émis (la réponse 422 ne correspond à aucune règle).
Requêtes de découverte courantes pour les hôtes Langflow (à utiliser uniquement sur des actifs que vous êtes autorisé à tester) :
http.title:"Langflow"app="Langflow"intitle:"Langflow" inurl:"/flows"AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HDans les versions vulnérables, le gestionnaire public est déclaré approximativement comme :
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value reaches exec() in the
# Component build path
data est contrôlé par l'attaquant. Le gestionnaire corrigé supprime complètement le paramètre et force data=None, c'est pourquoi une requête qui inclut un champ data dans le corps est rejetée avec 422 sur les versions corrigées.
/api/v1/build_public_tmp/ au niveau du proxy inverse.LANGFLOW_AUTO_LOGIN=False, configurez les identifiants superutilisateur et faites tourner LANGFLOW_SECRET_KEY.access_type=PUBLIC sont ceux qu'un attaquant ciblerait dans l'URL.Ce template est publié pour la sécurité défensive et les tests autorisés uniquement. L'exécuter contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de tester est illégal dans la plupart des juridictions et viole les conditions d'utilisation de la plateforme.
En utilisant ce template, vous acceptez que :
lopseg — https://github.com/lopseg
Les pull requests et les issues sont les bienvenues.
MIT
GET /api/v1/version| Confirme que la cible est Langflow et extrait la version de build. |
| 2 | POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow avec un corps contenant le champ data et une valeur template.code.value inerte | Décision de routage ci-dessous. |
| Statut | Corps contient | Verdict |
|---|
404 | flow / public | VULNÉRABLE — le gestionnaire a accepté data, la recherche a ensuite échoué car l'UUID est factice. |
200 | job_id / build / task | VULNÉRABLE — le gestionnaire a accepté data et est entré dans le chemin de build. |
5xx | exec / Component / traceback | VULNÉRABLE — le gestionnaire a atteint le chemin de code exec avant d'échouer. |
422 | Field required / extra / data | CORRIGÉ — la signature du gestionnaire n'accepte plus data. |