Threat Intelligence

CVE-2026-9198 : comment un endpoint de développement laissé ouvert donne un accès SUPERUSER à Langflow

Admin CyberAfrik 05 August 2026 18 lectures
CVE-2026-9198 : comment un endpoint de développement laissé ouvert donne un accès SUPERUSER à Langflow

Rapport CTI technique du 5 août 2026

Résumé exécutif

CISA a ajouté le 4 août 2026 la CVE-2026-9198 à son catalogue Known Exploited Vulnerabilities, aux côtés d'une faille N-able N-central et d'une faille Apache Tomcat. La vulnérabilité touche IBM Langflow OSS, un framework open source très utilisé pour construire des workflows d'agents LLM, dans les versions 1.0.0 à 1.10.0. Elle combine deux défauts déjà connus séparément dans l'écosystème Langflow : un endpoint d'auto-connexion qui délivre un jeton SUPERUSER à n'importe quel appelant réseau, et un endpoint de validation de code qui exécute ce code via exec() sans sandboxing. Chaînés, ces deux points donnent à un attaquant non authentifié une exécution de code arbitraire sur le serveur, avec les privilèges du process Langflow.

Le cas est intéressant au-delà du bug lui-même : Langflow accumule les CVE RCE depuis 2025 (CVE-2025-3248, CVE-2026-8476, CVE-2026-8481, CVE-2026-8505, CVE-2026-9135, CVE-2026-33017), presque toutes liées au même choix d'architecture consistant à évaluer du code utilisateur côté serveur pour construire des graphes de traitement. Pour un pentester, Langflow exposé sur Internet doit désormais être traité comme une surface d'attaque a priori compromise plutôt que comme un outil interne inoffensif, surtout quand AUTO_LOGIN tourne encore avec sa valeur par défaut.

Chronologie

DateÉvénement
2026-07-17Publication de CVE-2026-9198 dans la base NVD
2026-07-24Dernière mise à jour de la fiche NVD
2026-08-04CISA ajoute CVE-2026-9198 au catalogue KEV, sur preuve d'exploitation active, avec CVE-2026-18556 (N-able N-central) et CVE-2026-34486 (Apache Tomcat)
2026-08-05Publication de ce rapport

Fiche vulnérabilité

CVE-2026-9198 | CVSS 9.8 (Critical, vecteur 3.1 : AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) | IBM Langflow OSS, versions 1.0.0 à 1.10.0

La route /api/v1/auto_login a été conçue pour accélérer le développement local en délivrant automatiquement un jeton de session SUPERUSER. Dans le déploiement par défaut, ce comportement n'est conditionné ni par l'origine réseau, ni par un mode mono-utilisateur explicite, ni par un flag de configuration dédié : tout appelant capable d'atteindre le listener HTTP reçoit un jeton pleinement privilégié. L'attaquant présente ensuite ce jeton à /api/v1/validate/code, un endpoint qui accepte du code source Python et le passe à exec() pour "valider" la syntaxe d'un composant. exec() s'exécute dans le process serveur, donc valider revient à exécuter. La faille est classée CWE-94 (Improper Control of Generation of Code).

Conditions d'exploitation : accès réseau à l'API HTTP de Langflow, aucune authentification préalable, aucune interaction utilisateur. L'attaque se résume à deux requêtes HTTP successives : un GET ou POST sur /api/v1/auto_login pour obtenir le JWT, puis un POST sur /api/v1/validate/code avec le payload Python. PoC disponible : aucun PoC public confirmé spécifiquement pour CVE-2026-9198 au moment de la rédaction, contrairement à sa cousine CVE-2026-33017 (endpoint /api/v1/build_public_tmp, faille distincte du même projet) qui dispose de plusieurs PoC publiés sur GitHub. Patch/mitigation : mise à jour vers une version postérieure à 1.10.0 selon les indications de la page de support IBM ; en attendant, désactivation explicite de l'auto-login (LANGFLOW_AUTO_LOGIN=false avec des identifiants SUPERUSER définis manuellement) et retrait de toute exposition directe à Internet.

Diagramme de la chaîne d'attaque

Chaîne d'exploitation CVE-2026-9198
Chaîne reconstruite à partir des avis SentinelOne, IBM Support et de la fiche NVD.

Analyse technique

Étape 1 : reconnaissance de l'instance exposée

Un attaquant scanne les plages IP à la recherche du port par défaut de Langflow (7860) ou identifie l'instance via des bannières HTTP caractéristiques de l'API FastAPI de Langflow. Aucune authentification n'est requise pour cette phase, une simple requête GET sur la racine ou sur /api/v1/auto_login suffit à confirmer la présence du service et son mode de configuration.

Étape 2 : obtention d'un jeton SUPERUSER

L'attaquant envoie une requête vers /api/v1/auto_login. En configuration par défaut, la route ne vérifie ni l'origine de la requête ni un état mono-utilisateur, elle renvoie systématiquement un jeton JWT associé au rôle SUPERUSER. Ce comportement, hérité d'un choix de confort pour le développement local, devient une porte d'entrée directe dès que l'instance est joignable depuis un réseau non fiable.

Étape 3 : exécution de code via l'endpoint de validation

Muni du jeton, l'attaquant construit un payload JSON contenant du code Python et le soumet à /api/v1/validate/code. La fonction serveur qui traite cette route appelle exec() sur le contenu reçu pour vérifier sa syntaxe et son exécutabilité dans le cadre de la construction d'un composant Langflow. Il n'existe pas de sandboxing AST-only à cette étape, le code tourne directement dans l'interpréteur du process serveur.

Étape 4 : post-exploitation dans le contexte du service

Une fois le code exécuté, l'attaquant dispose des privilèges du compte de service Langflow. Cela permet la lecture de fichiers arbitraires, l'écriture sur le système de fichiers, l'exfiltration des secrets stockés dans les flows (clés API de fournisseurs de modèles, identifiants de bases de données, jetons cloud), et l'établissement d'un canal de sortie vers une infrastructure contrôlée par l'attaquant pour maintenir l'accès.

Indicateurs de compromission

TypeValeur
Endpoint ciblé/api/v1/auto_login suivi de /api/v1/validate/code depuis la même IP source
Motif réseauRequêtes séquentielles vers ces deux routes en moins de quelques secondes, hors plage d'adresses de développement connue
PayloadCorps JSON de /api/v1/validate/code contenant import os, import subprocess, import socket, ou du code Python encodé en base64
Processus enfantsh, bash, curl, wget, python -c lancés par le process Python de Langflow
Réseau sortantConnexions initiées par le process Langflow vers des hôtes non répertoriés, immédiatement après un appel à validate/code

Aucune liste d'infrastructures ou d'adresses IP attaquantes n'a été publiée par CISA ou par les éditeurs au moment de la rédaction. Les indicateurs ci-dessus sont comportementaux, à surveiller côté journalisation applicative et EDR.

MITRE ATT&CK

Aucune cartographie officielle CISA ou vendeur n'a été publiée pour cette CVE au moment de la rédaction. Le tableau suivant est une lecture technique construite à partir du déroulé de l'exploitation, pas une attribution vendeur.

TactiqueTechniqueIDJustification
Initial AccessExploit Public-Facing ApplicationT1190L'attaquant atteint directement l'API HTTP exposée de Langflow sans authentification préalable
Privilege EscalationValid AccountsT1078Le jeton SUPERUSER obtenu via auto_login donne d'emblée les privilèges les plus élevés de l'application
ExecutionCommand and Scripting Interpreter: PythonT1059.006Le payload soumis à validate/code s'exécute comme du Python natif via exec()
Credential AccessUnsecured Credentials: Credentials In FilesT1552.001Les clés API et identifiants stockés dans les définitions de flows deviennent accessibles une fois l'exécution de code obtenue
ExfiltrationExfiltration Over C2 ChannelT1041Les secrets récupérés peuvent être renvoyés vers l'infrastructure de l'attaquant via le canal établi lors de la post-exploitation

Remédiation : checklist opérationnelle

  1. Recenser toutes les instances Langflow exposées, en interne comme en externe, et vérifier leur version exacte via l'endpoint de version ou les métadonnées du conteneur.
  2. Mettre à jour vers une version postérieure à 1.10.0 en suivant la page de support IBM, puis redéployer les conteneurs avec l'image mise à jour plutôt que de patcher en place.
  3. Désactiver LANGFLOW_AUTO_LOGIN et configurer explicitement LANGFLOW_SUPERUSER avec un mot de passe fort et unique.
  4. Retirer toute exposition directe à Internet : placer Langflow derrière un reverse proxy authentifiant ou un VPN, et lier le listener à 127.0.0.1 quand l'accès distant n'est pas nécessaire.
  5. Faire tourner le service sous un compte non privilégié dans un conteneur avec filtrage de sortie, pour limiter l'impact d'une exécution de code malgré tout.
  6. Vérifier après mise à jour que /api/v1/auto_login ne délivre plus de jeton à un appelant non authentifié.
  7. Faire tourner toutes les clés API, identifiants de bases de données et jetons cloud stockés dans des flows sur les hôtes potentiellement exposés avant le correctif.
  8. Rechercher des signes d'exploitation antérieure : nouvelles entrées cron, clés SSH ajoutées, connexions sortantes inhabituelles dans les logs du process Langflow.
  9. Ajouter une règle de détection sur la séquence auto_login puis validate/code depuis une même source dans le SIEM ou l'outil de corrélation de logs.

Sources

Tags : CVE-2026-9198LangflowRCEIBMexecCWE-94CISA KEVSUPERUSER
Partager cet article