Contournement du superutilisateur par auto-login Langflow et RCE via MCP (CVE-2026-93680)
Langflow OSS 1.0.0 à 1.12.8 donne à n’importe quel appelant une session superutilisateur qui mène à une RCE via ses outils MCP ; corrigé dans 1.13.0.
En bref
- Les versions 1.0.0 à 1.12.8 de Langflow OSS livrent la connexion automatique activée par défaut, et un simple
GET /api/v1/auto_loginnon authentifié renvoie une session superutilisateur complète. IBM note la faille, CVE-2026-93680, 9,8 Critique. - Depuis cette session, le même attaquant non authentifié atteint le endpoint MCP de Langflow, énumère ses outils de création et d’exécution de flux, et exécute du code de composant personnalisé sur le serveur : CVE-2026-110186, également 9,8 Critique. Une faille liée, CVE-2026-110193, permet à un compte peu privilégié d’atteindre l’exécution de commandes système via l’assistant agentique.
- Langflow 1.13.0, publié le 22 octobre 2026, corrige le tout en désactivant la connexion automatique par défaut ; le bulletin IBM du 28 octobre ne fournit aucune solution de contournement. La seule version corrigée est la 1.13.0.
- Aucune exploitation de ces CVE n’a été rapportée, et aucune n’est au catalogue CISA des vulnérabilités exploitées au 30 octobre 2026. La précédente faille d’authentification manquante de Langflow, CVE-2025-3248, a été exploitée et figure au catalogue avec un usage connu par des campagnes de rançongiciel : les instances exposées doivent migrer maintenant.
Suis-je concerné ?
Toutes ces conditions doivent être réunies pour la chaîne non authentifiée :
- Vous exécutez Langflow OSS, installé depuis PyPI, Docker ou une archive de version, dans toute version de 1.0.0 à 1.12.8.
- L’instance est accessible à quiconque vous ne contrôlez pas totalement : exposée sur Internet, sur un réseau interne partagé, ou joignable depuis un réseau de conteneurs.
- Vous n’avez pas explicitement réglé
LANGFLOW_AUTO_LOGIN=falseet créé un vrai superutilisateur. Le défaut de chaque version concernée est activé, ce qui est la configuration vulnérable.
Le chemin peu privilégié, CVE-2026-110193, ne demande qu’un compte authentifié sur l’instance, n’importe quel rôle, plus l’assistant agentique générant du code de composant. CVE-2026-110192 demande un compte authentifié et expose des clés API injectées par l’opérateur.
| Branche | Versions concernées | Version corrigée |
|---|---|---|
| Langflow OSS 1.0.0 à 1.12.8 | 1.0.0 à 1.12.8 | 1.13.0 |
Vérifiez ce que vous exécutez. Pour une installation pip :
pip show langflow | head -2
Pour le déploiement Docker courant, vérifiez le conteneur en cours d’exécution, pas une image fraîchement tirée :
docker exec langflow python -c "import langflow; print(langflow.__version__)"
Vérifiez si la connexion automatique est active sur l’instance. Interrogez le endpoint depuis une machine que vous contrôlez :
curl -s -o /dev/null -w "%{http_code}\n" http://your-langflow-host:7860/api/v1/auto_login
Un 403 signifie que la connexion automatique est désactivée et le chemin non authentifié fermé. Un 200 signifie que le endpoint vient de remettre une session superutilisateur à votre requête, ce qui est la vulnérabilité ; vous contrôlez déjà l’instance, la vérification n’a rien coûté. Un réglage explicite apparaît dans l’environnement, mais une variable non définie signifie que le défaut de la version s’applique, qui est activé de 1.0.0 à 1.12.8 :
docker exec langflow printenv | grep -i AUTO_LOGIN || echo "not set: the release default (on) applies"
Comment corriger ?
Passez à 1.13.0, la seule version corrigée, avant que quoi que ce soit d’autre n’atteigne l’instance.
- Sauvegardez la base de données, la clé secrète et les fichiers téléversés, comme le demande le bulletin IBM.
- Si le déploiement utilise la connexion automatique, préparez d’abord le compte existant pour une connexion par mot de passe, selon les instructions d’installation et de mise à jour Docker liées par le bulletin. Omettre cette étape vous enferme dehors après la mise à jour, car 1.13.0 ne connecte plus personne automatiquement.
- Mettez à jour le paquet :
pip install --upgrade "langflow==1.13.0"
- Pour les déploiements Docker, tirez l’image corrigée et recréez le conteneur, en conservant les données persistantes :
docker pull langflowai/langflow:1.13.0
Le bulletin IBM ne fournit aucune solution de repli pour l’une ou l’autre des CVE. L’étape qui réduit l’exposition pendant que vous planifiez la mise à jour est de retirer l’accessibilité réseau non fiable à l’instance, par règles de pare-feu ou segmentation. Cela ferme la chaîne non authentifiée, mais pas CVE-2026-110193, qui opère depuis un compte authentifié.
Quelle est la cause racine ?
Un endpoint non authentifié distribue des sessions superutilisateur chaque fois qu’un indicateur activé par défaut reste tranquille. L’indicateur et le endpoint viennent de couches différentes du code, et une correction antérieure n’a fermé qu’une partie du chemin.
Le réglage vit dans la configuration de version, src/lfx/src/lfx/services/settings/auth.py en v1.12.8, et chaque version concernée l’active par défaut :
AUTO_LOGIN: bool = Field(
default=True, # TODO: Set to False in v2.0
description=(
"Enable automatic login with a configured or generated bootstrap account. "
"SECURITY WARNING: This bypasses authentication and should only be used in development environments. "
"Set to False in production. This will default to False in v2.0."
),
)
"""If True, the application will attempt to log in automatically as a super user."""
Le endpoint est GET /api/v1/auto_login, dans src/backend/base/langflow/api/v1/login.py. Avec l’indicateur activé, il résout un superutilisateur et renvoie les jetons de connexion sous forme de cookies, sans identifiant nulle part dans la requête :
@router.get("/auto_login", include_in_schema=False)
async def auto_login(request: Request, response: Response, db: DbSession):
auth_settings = get_settings_service().auth_settings
if auth_settings.AUTO_LOGIN:
auth = get_auth_service()
user_id, tokens = await auth.create_user_longterm_token(db)
...
response.set_cookie(
auth_cookie_name("access_token_lf", request),
tokens["access_token"],
...
La fonction derrière, create_user_longterm_token dans src/backend/base/langflow/services/auth/service.py, cherche le superutilisateur configuré, ou le premier superutilisateur de la base, et émet ses jetons.
Un commentaire dans cette fonction enregistre la correction antérieure, référencée comme GHSA-fjgc-vj2f-77hm : avant elle, le endpoint fabriquait un jeton porteur superutilisateur de 365 jours ; après, un jeton d’accès de courte durée plus un jeton de rafraîchissement. Cette remédiation bornait la durée de vie du jeton, mais laissait le endpoint distribuer des sessions superutilisateur à des appelants anonymes, ce que le bulletin IBM appelle une remédiation incomplète du contrôle de connexion automatique.
Un fichier de constantes du même service confirme l’écart côté clés API : depuis la v1.5, LANGFLOW_AUTO_LOGIN exige une clé API valide sur les chemins authentifiés par clé, alors que la route /auto_login continuait d’émettre des sessions. Une chaîne d’avertissement énonce que /auto_login distribue une session superutilisateur sans identifiants.
La seconde faille, CVE-2026-110186, est la moitié exécution de code de la chaîne. Le endpoint MCP de Langflow à /api/v1/agentic/mcp expose les outils de création et d’exécution de flux, et les flux peuvent contenir des composants personnalisés, du code Python que Langflow exécute sur le serveur. Les routes authentifient l’appelant via le même mécanisme de session que le endpoint d’auto-login satisfait, donc la chaîne non authentifiée est : requête anonyme, session superutilisateur, outils MCP, code de composant, exécution côté serveur.
Comment la faille est-elle exploitée ?
Aucune preuve de concept publique n’existe pour l’une ou l’autre des CVE d’octobre 2026. Les étapes ci-dessous reconstruisent le chemin depuis le bulletin IBM, les descriptions CVE et le code source v1.12.8, pas depuis un exploit publié.
- L’attaquant envoie
GET /api/v1/auto_loginà une instance joignable encore en configuration par défaut. La réponse pose les cookies de jeton d’accès, de rafraîchissement et de clé API du superutilisateur par défaut. - Avec cette session, l’attaquant se connecte au endpoint MCP
/api/v1/agentic/mcpvia son transport Streamable HTTP et énumère les outils exposés : création de flux, exécution de flux et, si activé, l’assistant. - L’attaquant crée un flux contenant un composant personnalisé, du code Python, et l’exécute. Langflow exécute le code du composant sur le serveur en tant que processus Langflow, ce qui est l’exécution de commandes arbitraires.
- Sur une instance sans accès non authentifié possible, CVE-2026-110193 offre la variante peu privilégiée : un utilisateur authentifié demande à l’assistant agentique de générer ou soumettre du code de composant avec des motifs que l’analyse de code de l’assistant ne bloquait pas avant 1.13.0, atteignant l’exécution de commandes système.
L’ensemble de corrections 1.13.0 pour l’assistant, qui bloque les imports pydoc et l’attribut ctypeslib de NumPy, alias et imports génériques compris, nomme deux des motifs non bloqués.
Quel est le flux de l’attaque ?
En une phrase : une requête anonyme récolte une session superutilisateur depuis le endpoint d’auto-login, et cette session conduit la boîte à outils MCP jusqu’à ce que le Python d’un composant personnalisé s’exécute sur le serveur.
/api/v1/auto_login"] --> B{"AUTO_LOGIN activé ?
(défaut de version)"} B -->|oui| C["Cookies de session
superutilisateur renvoyés"] B -->|non| D["403 : chaîne bloquée
ici"] C --> E["Endpoint MCP
/api/v1/agentic/mcp"] E --> F["Énumérer les outils de création
et d’exécution de flux"] F --> G["Créer un flux avec un
composant personnalisé"] G --> H["Exécuter : le Python du
composant tourne côté serveur"]
Que peut faire un attaquant ?
Avec la chaîne non authentifiée, l’attaquant opère comme le superutilisateur Langflow d’une instance exposée :
- Exécuter du code arbitraire sur le serveur via des composants personnalisés, avec les permissions du processus Langflow. Les vecteurs CVSS d’IBM pour les deux CVE 9,8 notent la confidentialité, l’intégrité et la disponibilité hautes.
- Lire et modifier chaque flux, et avec eux les identifiants stockés dans les composants de flux et les connexions vers les fournisseurs de modèles et les API.
- Utiliser la position de superutilisateur pour tout ce que le produit permet d’autre, y compris créer des comptes et des clés API.
Les conditions : l’instance doit être joignable par l’attaquant, et la connexion automatique activée, ce qui est le défaut de version jusqu’à 1.12.8. L’étape d’exécution de code ne demande aucune condition supplémentaire, car les composants personnalisés sont une fonctionnalité normale qu’un superutilisateur peut toujours créer.
À part, CVE-2026-110193 donne à un compte authentifié peu privilégié l’exécution de commandes système via l’assistant agentique, et CVE-2026-110192 permet à un attaquant authentifié d’obtenir des informations sensibles via des identifiants insuffisamment protégés. IBM les note 8,8 et 6,5.
Pourquoi le correctif fonctionne-t-il ?
Le correctif supprime la source de session anonyme en changeant le défaut de version. En v1.13.0, src/lfx/src/lfx/services/settings/auth.py se lit :
AUTO_LOGIN: bool = Field(
- default=True, # TODO: Set to False in v2.0
+ default=False, # TODO: Set the development default to False in v2.0.
description=(
- "Set to False in production. This will default to False in v2.0."
+ "Enabled by default on development branches; official release packages and tags default to False. "
+ "Set LANGFLOW_AUTO_LOGIN=false to require authentication. "
),
)
Le changement a fusionné dans la préparation de version de 1.13.0 : les roues officielles, archives sources étiquetées et images conteneur livrent la connexion automatique désactivée et exigent un mot de passe superutilisateur configuré. Indicateur éteint, /api/v1/auto_login renvoie 403 et les chemins à clé API exigeaient déjà une clé depuis la v1.5, donc la chaîne non authentifiée de ce billet n’a plus de point d’entrée. Des correctifs d’accompagnement dans la même version ferment les chemins des autres CVE :
- L’analyse de code de l’assistant bloque les motifs de réexportation
pydocetctypeslib. - Le client en boucle MCP agentique n’hérite plus du
LANGFLOW_API_KEYinjecté par l’opérateur depuis le processus serveur, et ne fait plus tourner les outils sous l’identité d’un autre utilisateur. - L’émission de clés API consulte la politique de connexion du déploiement à chaque point d’émission.
Le correctif restreint au lieu d’éliminer : la connexion automatique existe toujours, et un opérateur qui règle explicitement LANGFLOW_AUTO_LOGIN=true après la mise à jour rouvre le endpoint de session non authentifié sur son instance.
Comment vérifier si j’ai été compromis ?
IBM n’a publié aucun indicateur pour ces CVE, et une prise de contrôle réussie laisse les traces ordinaires d’un usage superutilisateur normal, ce qui fait de la revue de journaux le contrôle principal.
- Cherchez dans les journaux d’accès les requêtes vers le endpoint. Sur une instance concernée le chemin apparaît comme
GET /api/v1/auto_login; vos propres requêtes de vérification y figureront aussi, comparez adresses sources et horaires.
grep "GET /api/v1/auto_login" /var/log/nginx/access.log | grep -v "127.0.0.1"
- Passez en revue les flux créés ou modifiés pendant toute fenêtre où l’instance était joignable et non corrigée, en particulier les flux contenant des composants personnalisés que vous ne pouvez attribuer à aucun membre de l’équipe.
- Vérifiez dans la base de données les comptes, clés API ou enregistrements clients créés à la même période.
- Une tentative qui a échoué, sur une instance à connexion automatique désactivée, ne laisse que les réponses 403 dans le journal d’accès.
Si votre instance était exposée sur Internet dans une version antérieure à 1.13.0 avec la configuration par défaut, considérez qu’une revue s’impose quoi qu’il arrive, car le chemin de prise de contrôle ne demande qu’une requête.
Chronologie
- 2025-04-07 : GitHub publie l’avis de CVE-2025-3248, injection de code non authentifiée via
/api/v1/validate/codedans Langflow avant 1.3.0, la faille d’authentification manquante que la chaîne de ce billet fait écho. - 2025-05-05 : le CISA ajoute CVE-2025-3248 à son catalogue des vulnérabilités exploitées, avec un usage connu par des campagnes de rançongiciel.
- 2026-03-17 : GitHub publie CVE-2026-33017, exécution de code à distance non authentifiée dans Langflow via le endpoint public de construction de flux, corrigée dans 1.9.0.
- 2026-09-29 : le dépôt Langflow fusionne le changement de préparation de version qui met
AUTO_LOGINà false par défaut dans les artefacts officiels. - 2026-10-22 : Langflow 1.13.0 est publiée, avec le changement de défaut et les correctifs d’accompagnement.
- 2026-10-28 : IBM publie son bulletin de sécurité pour Langflow OSS 1.0.0 à 1.12.8, nommant la version corrigée 1.13.0 et aucune solution de repli.
- 2026-10-29 : IBM met à jour le bulletin avec une remédiation clarifiée, et les enregistrements CVE pour CVE-2026-93680, CVE-2026-110186, CVE-2026-110193 et CVE-2026-110192 sont publiés.
FAQ
Mon instance est-elle en sécurité si elle n’est que sur un réseau interne ?
Non, sauf si chaque pair de ce réseau est totalement fiable. Les vecteurs CVSS d’IBM donnent un vecteur d’attaque réseau (AV:N) : l’attaquant n’a besoin que d’une route vers le port HTTP, pas d’une exposition Internet. N’importe quel conteneur, ordinateur portable ou processus qui peut atteindre le port peut récolter la session superutilisateur en une requête.
Le endpoint MCP est-il lui-même non authentifié ?
Non. Les routes sous /api/v1/agentic/mcp authentifient l’appelant avec un jeton de session ou une clé API. La partie non authentifiée de la chaîne est le endpoint d’auto-login qui satisfait cette exigence sans identifiants. C’est pourquoi le correctif supprime la source de session anonyme au lieu de modifier le transport MCP.
Quelqu’un a-t-il exploité ces failles ?
Aucune exploitation n’a été rapportée pour l’une ou l’autre des CVE d’octobre 2026, et aucune n’est au catalogue CISA au 30 octobre 2026. La prédécesseure de 2025, CVE-2025-3248, a été exploitée dans la nature, figure au catalogue, et porte le marqueur d’usage connu par des campagnes de rançongiciel du catalogue : la raison historique de traiter l’exposition de ce produit comme urgente plutôt que théorique.
Qu’en est-il des vulnérabilités Hono du même bulletin ?
Le bulletin intègre aussi trois corrections de dépendances dans Hono, le framework web livré avec Langflow, toutes corrigées dans Hono 4.13.5 : un problème d’empoisonnement de cache par fragment de requête, un déni de service dans l’analyse optionnelle des corps en notation pointée, et une traversée de chemin dans la génération de sites statiques. Elles arrivent avec la mise à jour 1.13.0 ; aucune action séparée n’est nécessaire au-delà de la mise à jour.
J’ai mis à jour vers 1.13.0 ; ai-je fini ?
Seulement si vous n’avez pas réactivé la connexion automatique. La mise à jour met le défaut à désactivé et les étapes d’installation vous guident vers un vrai mot de passe superutilisateur. Si votre déploiement règle explicitement LANGFLOW_AUTO_LOGIN=true pour garder l’ancien comportement, le endpoint de session non authentifié revient et reste exposé jusqu’à ce vous désactiviez l’indicateur à nouveau.
Pourquoi la correction antérieure n’a-t-elle pas fermé cela ?
La remédiation antérieure, référencée dans le code source comme GHSA-fjgc-vj2f-77hm, a changé ce que /api/v1/auto_login émet : un jeton superutilisateur de 365 jours est devenu un jeton d’accès de courte durée avec un jeton de rafraîchissement. Elle bornait la durée de vie du jeton reçu par un appelant anonyme, mais le recevoir était la vulnérabilité, et le endpoint a continué d’émettre des sessions jusqu’à ce que 1.13.0 change le défaut.
Trouvez la version Langflow que vous exécutez avec Ostorlab
Les analyses de dépendances d’Ostorlab construisent l’inventaire complet des paquets Python installés par vos services et images de conteneurs : vous pouvez repérer chaque déploiement sous Langflow 1.0.0 à 1.12.8 et confirmer la mise à jour 1.13.0 partout où elle compte. Lancez une analyse avec Ostorlab pour dresser les versions avant que la fenêtre d’exposition ne s’agrandisse.
Références
- Bulletin de sécurité IBM, « Security Bulletin: Langflow OSS is affected by multiple vulnerabilities », publié le 28 octobre 2026 et mis à jour le 29 octobre 2026, avec la plage concernée, les quatre CVE, les vecteurs CVSS, la remédiation 1.13.0 et l’absence de solution de repli : https://www.ibm.com/support/pages/node/7294467 (consulté le 30 octobre 2026)
- Enregistrement CVE-2026-93680, entrée du CNA IBM, publiée le 29 octobre 2026, CVSS v3.1 9.8, CWE-287 : https://www.cve.org/cverecord?id=CVE-2026-93680 (consulté le 30 octobre 2026)
- Enregistrement CVE-2026-110186, publié le 29 octobre 2026, CVSS v3.1 9.8, CWE-94 : https://www.cve.org/cverecord?id=CVE-2026-110186 (consulté le 30 octobre 2026)
- Enregistrement CVE-2026-110193, publié le 29 octobre 2026, CVSS v3.1 8.8, CWE-94 : https://www.cve.org/cverecord?id=CVE-2026-110193 (consulté le 30 octobre 2026)
- Notes de version Langflow 1.13.0, publiées le 22 octobre 2026, listant le changement de défaut de connexion automatique et les correctifs de sécurité d’accompagnement : https://github.com/langflow-ai/langflow/releases/tag/v1.13.0 (consulté le 30 octobre 2026)
- La demande de fusion qui désactive la connexion automatique par défaut dans les artefacts de version, fusionnée le 29 septembre 2026 : https://github.com/langflow-ai/langflow/pull/14993 (consulté le 30 octobre 2026)
- Source Langflow v1.12.8 : le défaut
AUTO_LOGINdanssrc/lfx/src/lfx/services/settings/auth.py, la route/auto_logindanssrc/backend/base/langflow/api/v1/login.py, etcreate_user_longterm_tokenavec le commentaire de la correction antérieure danssrc/backend/base/langflow/services/auth/service.py, lus à l’étiquette v1.12.8 : https://github.com/langflow-ai/langflow/tree/v1.12.8 (consulté le 30 octobre 2026) - Source Langflow v1.13.0, montrant le défaut inversé : https://github.com/langflow-ai/langflow/blob/v1.13.0/src/lfx/src/lfx/services/settings/auth.py (consulté le 30 octobre 2026)
- La route MCP agentique et son authentification,
src/backend/base/langflow/api/v1/agentic_mcp.pyen v1.12.8 : https://github.com/langflow-ai/langflow/blob/v1.12.8/src/backend/base/langflow/api/v1/agentic_mcp.py (consulté le 30 octobre 2026) - Avis GitHub pour CVE-2025-3248, la précédente faille d’authentification manquante de Langflow, publié le 7 avril 2025, corrigée dans 1.3.0 : https://github.com/advisories/GHSA-c995-4fw3-j39m (consulté le 30 octobre 2026)
- Avis GitHub pour CVE-2026-33017, RCE non authentifiée via le endpoint public de construction de flux, publié le 17 mars 2026, corrigée dans 1.9.0 : https://github.com/advisories/GHSA-vwmf-pq79-vjvx (consulté le 30 octobre 2026)
- Catalogue CISA des vulnérabilités exploitées, où CVE-2025-3248 a été ajoutée le 5 mai 2025 avec un usage connu par des campagnes de rançongiciel, et où aucune des CVE Langflow d’octobre 2026 n’est listée au 30 octobre 2026 : https://www.cisa.gov/known-exploited-vulnerabilities-catalog (consulté le 30 octobre 2026)
- Dépôt Langflow, 156 160 étoiles au 30 octobre 2026, pour l’échelle du projet : https://github.com/langflow-ai/langflow (consulté le 30 octobre 2026)
- Dépôt Docker Hub Langflow, 4 482 343 extractions au 30 octobre 2026 : https://hub.docker.com/r/langflowai/langflow (consulté le 30 octobre 2026)
- Statistiques de téléchargement PyPI pour langflow, 37 742 téléchargements dans les 30 jours précédant le 30 octobre 2026 : https://pypistats.org/packages/langflow (consulté le 30 octobre 2026)