Aller au contenu

CVE-2026-33017 : RCE non authentifiée dans Langflow via l'endpoint build_public_tmp

Langflow, un framework populaire pour l’orchestration d’agents IA et de workflows, a subi une rupture critique de son modèle de sécurité. La vulnérabilité, suivie sous la référence CVE-2026-33017, permet à un attaquant externe non authentifié d’exécuter du code Python arbitraire sur le serveur hôte. En manipulant le paramètre data d’un endpoint spécifique exposé publiquement, les attaquants peuvent contourner la logique de chargement des flux et forcer l’application à évaluer des payloads malveillants.

Ce défaut relève du CWE-94 (Improper Control of Generation of Code) et du CWE-306 (Missing Authentication), avec un score CVSS v3.1 de 9.8. La simplicité de l’exploitation et les privilèges élevés de l’environnement d’exécution en font une menace majeure pour les organisations utilisant Langflow pour l’automatisation de l’IA.

La vulnérabilité réside dans l’implémentation de l’endpoint POST /api/v1/build_public_tmp/{flow_id}/flow. Cet endpoint est conçu pour permettre la construction de flux “publics”, ce qui nécessite intrinsèquement un état non authentifié pour remplir sa fonction.

La faille principale survient lors du traitement des données du flux. L’application s’attend à charger les définitions de flux depuis sa base de données interne en se basant sur le {flow_id}. Cependant, l’endpoint propose un paramètre data optionnel. Lorsque ce paramètre est présent, Langflow priorise cette entrée contrôlée par l’attaquant au détriment de l’enregistrement en base de données.

En interne, Langflow traite ces “noeuds” (nodes) en évaluant le code Python contenu dans les définitions de noeuds pour construire le graphe. Comme l’application utilise exec() sans aucun sandboxing ni validation des données d’entrée, tout code Python imbriqué dans le paramètre data est exécuté avec les permissions du processus Langflow.

Le vecteur d’attaque est direct et ne nécessite aucun identifiant :

  1. Identification de la cible : L’attaquant identifie une instance Langflow exécutant une version antérieure à 1.9.0.
  2. Construction du Payload : Un payload JSON est élaboré pour le paramètre data. Ce payload contient des définitions de noeuds où la logique est remplacée par un script Python malveillant (ex: un reverse shell ou un script d’exfiltration de credentials).
  3. Envoi de la requête : L’attaquant envoie une requête POST vers /api/v1/build_public_tmp/[id_aleatoire]/flow contenant l’objet data malveillant.
  4. Exécution : Le serveur reçoit la requête, ignore le flow_id (puisque data est fourni), et passe le snippet Python malveillant directement dans exec().
  5. RCE : Le code s’exécute sur le serveur, donnant à l’attaquant le contrôle total de l’environnement.

D’un point de vue DFIR (Digital Forensics and Incident Response), cette vulnérabilité laisse des traces spécifiques :

Analyser les logs du serveur HTTP (Nginx, Apache, ou logs internes Langflow) pour détecter :

  • Des requêtes POST vers /api/v1/build_public_tmp/.
  • Des corps de requêtes anormalement volumineux pour l’endpoint flow.
  • Des réponses 200 OK à ces requêtes provenant d’IP externes inconnues.

Vérifier la présence de processus enfants anormaux spawnés par le processus Langflow :

  • Présence inattendue de subprocesses /bin/sh, /bin/bash ou python.
  • Connexions réseau initiées par l’utilisateur Langflow vers des adresses IP externes suspectes (communication C2).

Rechercher les artefacts classiques d’une RCE :

  • Fichiers inattendus dans /tmp ou /var/tmp.
  • Modification du fichier .bashrc ou ajout de nouvelles clés SSH dans ~/.ssh/authorized_keys.

Déployer des signatures pour détecter l’utilisation de l’endpoint spécifique combinée à des mots-clés d’exécution Python courants.

Suggestion de règle Snort/Suricata : alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"Possible Langflow RCE attempt (CVE-2026-33017)"; content:"POST"; http_method; content:"/api/v1/build_public_tmp/"; http_uri; content:"__import__"; http_client_body; sid:1000001; rev:1;)

Rechercher toute activité POST sur l’endpoint vulnérable : index=web_logs method=POST uri_path="*/api/v1/build_public_tmp/*/flow"

  1. Mise à jour immédiate : Mettre à jour Langflow vers la version 1.9.0 ou ultérieure. Cette version implémente une authentification stricte et supprime la confiance aveugle dans le paramètre data pour cet endpoint.
  2. Segmentation Réseau : Restreindre l’accès à l’API Langflow aux seules adresses IP internes connues ou via un VPN.
  3. Protection Runtime : Employer un moniteur de syscalls (comme Falco) pour détecter et bloquer l’exécution de processus inattendus depuis le conteneur Langflow.
  4. Moindre Privilège : S’assurer que Langflow s’exécute avec un utilisateur non privilégié dans un environnement conteneurisé avec un système de fichiers racine en lecture seule lorsque possible.
  • Burp Suite : Pour l’interception et la manipulation du paramètre data.
  • Sysdig : Pour analyser l’impact runtime et les tentatives d’évasion de conteneur.
  • Grep/Ripgrep : Pour rechercher le pattern /api/v1/build_public_tmp/ dans les logs.