Flowise CVE-2026-41264 : du code pandas écrit par le LLM jusqu'au RCE
Une prompt injection dans l'agent CSV de Flowise pousse le modèle à produire du Python qui échappe à une liste noire d'expressions régulières et exécute des commandes OS. Divulguée le 15 avril 2026, corrigée en 3.1.0.
De quoi s’agit-il ?
CVE-2026-41264 est une faille d’exécution de code à distance (RCE) dans le nœud CSV Agent de Flowise, le populaire constructeur open source low-code d’applications et d’agents LLM. Elle a été signalée par Dre Cura et Nicholas Zubrisky de la Zero Day Initiative de Trend Micro (ZDI-CAN-29411), publiée dans l’avis éditeur le 15 avril 2026, puis intégrée aux bases d’avis GitHub et GitLab le 21 avril. Elle affecte flowise et flowise-components jusqu’à la version 3.0.13 incluse et est corrigée en 3.1.0. La ZDI la note 9,8 (CVSS v3.1) ; GitHub la note 9,2 (CVSS v4). Par la voie de la prompt injection, aucune authentification n’est requise.
Le point intéressant n’est pas qu’un agent exécute du code — c’est précisément la fonction du nœud — mais la manière dont la faille survit à un contrôle de sécurité écrit spécifiquement pour la bloquer. CVE-2026-41264 est un contournement du correctif livré pour la précédente CVE-2026-41137.
Comment ça marche
Le CSV Agent répond aux questions portant sur un fichier CSV en demandant au modèle d’écrire du code pandas, puis en exécutant ce code dans un runtime Pyodide (Python WebAssembly intégré au processus). Le prompt système enjoint poliment au modèle de ne produire que des opérations pandas/numpy et d’éviter import, os, subprocess, eval et autres. Cette consigne n’est pas une frontière de sécurité : ce n’est que du texte dont on peut détourner le modèle.
Le vrai contrôle est une fonction, validatePythonCodeForDataFrame(), qui passe la sortie du modèle dans une liste d’expressions régulières interdites (FORBIDDEN_PATTERNS) avant exécution. C’est une liste noire, et la classification de l’avis dit tout : CWE-184, Liste incomplète d’entrées interdites. L’un des motifs, /\bimport\s+(?!pandas|numpy\b)/g, tente d’interdire l’import de tout ce qui n’est pas pandas ou numpy, et un autre (/\bos\./g) tente de bloquer le module os. Les deux tombent face à une simple astuce d’alias documentée dans l’avis :
# Contournement conceptuel issu de l'avis public ZDI — corrigé en 3.1.0
import pandas as np, os as pandas # 'os' est importé sous l'alias 'pandas'
pandas.system("[REDACTED]") # 'pandas.system(...)' est en réalité os.system(...)
Comme la ligne commence par import pandas, le motif d’import est satisfait ; comme l’appel dangereux s’écrit pandas.system(...), le motif \bos\. ne correspond jamais. Le modèle est amené à produire cela par une formulation de prompt injection ordinaire glissée dans la question de l’utilisateur (le champ {question} du prompt système). L’environnement Pyodide n’est pas isolé au niveau de l’OS ; l’appel s’exécute donc dans le contexte de l’utilisateur qui fait tourner le serveur Flowise.
La ZDI documente trois voies d’exploitation dans sa preuve de concept : une prompt injection non authentifiée envoyée à l’endpoint de prédiction d’un chatflow ; un attaquant authentifié qui relie le CSV Agent à un serveur de modèle malveillant renvoyant simplement du « code » hostile ; et la primitive du serveur malveillant seule. La PoC note une réserve réaliste pour les bugs liés aux LLM : la sortie étant probabiliste, « plusieurs tentatives peuvent être nécessaires, ou une technique de prompt injection différente selon le modèle utilisé » — leurs tests portaient sur Llama 3.2 via Ollama.
Pourquoi c’est important
C’est le motif du triangle mortel dans sa forme la plus tranchée : une entrée non fiable (la question, et le CSV lui-même), une capacité puissante (l’exécution de code) et un modèle qui décide quoi exécuter. Flowise est largement déployé et souvent exposé sur Internet : un nœud censé « répondre à des questions sur un tableur » devient une voie vers la compromission totale de l’hôte — y compris les clés d’API de fournisseurs et les identifiants cloud que le serveur détient. La leçon de fond dépasse largement Flowise : une consigne en langage naturel dans un prompt système n’est pas un contrôle d’accès, et une liste noire d’expressions régulières sur un langage Turing-complet est un combat perdu d’avance. Python offre d’innombrables chemins vers une capacité (alias, traversée d’attributs, réflexion via __class__/__subclasses__), et le validateur ne peut bloquer que les écritures que ses auteurs ont imaginées.
Défenses
Ne mettez pas le code en liste noire — isolez le runtime. Le correctif durable est l’isolation au niveau de l’OS : exécutez le code généré par le modèle, non fiable, dans un processus ou un conteneur séparé, sans réseau, avec un système de fichiers en lecture seule, des capabilities supprimées et des limites seccomp. Pyodide intégré au processus partage la portée de l’hôte et n’est pas, à lui seul, une frontière de sécurité.
Préférez les listes blanches et l’exécution sans code. Quand c’est possible, n’autorisez pas le modèle à produire du code libre. Restreignez-le à un ensemble validé d’opérations DataFrame, ou faites-lui produire une requête structurée que votre code valide et exécute — une liste blanche de ce qui est permis plutôt qu’une liste noire de ce qui est interdit.
Traitez les fichiers de données comme des vecteurs d’injection. Le contenu du CSV (et les noms de colonnes) alimentent le prompt : un tableur non fiable peut donc porter des instructions au même titre qu’un message utilisateur. Validez-les, échappez-les, isolez-les.
Corrigez et inventoriez. Passez Flowise en 3.1.0 ou ultérieur, qui comble la faille en interdisant tout import dans le CSV Agent. Puis recensez vos instances exposées : Flowise ne devrait pas être sur l’Internet public sans authentification ni contrôles de trafic réseau.
Moindre privilège pour l’hôte de l’agent. Faites tourner Flowise sous un utilisateur non privilégié, limitez étroitement la portée de ses clés d’API, et segmentez-le des endpoints de métadonnées cloud afin qu’un seul RCE ne se transforme pas en vol d’identifiants.
Statut
| Élément | Détail |
|---|---|
| CVE | CVE-2026-41264 (GHSA-3hjv-c53m-58jj) |
| Affectés | flowise, flowise-components ≤ 3.0.13 |
| Corrigé | 3.1.0 (tout import interdit dans le CSV Agent) |
| Sévérité | 9,8 CVSS v3.1 (ZDI) / 9,2 CVSS v4 (GitHub) ; CWE-184 |
| Authentification requise | Non (voie prompt injection) |
| Signalé par | Dre Cura & Nicholas Zubrisky, Trend Micro ZDI |
| Avis éditeur | 15 avril 2026 |
| Relation | Contournement du correctif de CVE-2026-41137 |