
Prova de conceito de exploit para CVE-2025-55182, uma vulnerabilidade crítica de RCE no Next.js Server Actions. Explora desserialização insegura no protocolo React Flight para executar comandos arbitrários via poluição de protótipo e bypass de sandbox.
Um script de Prova de Conceito (PoC) para React2Shell (CVE-2025-55182), uma vulnerabilidade crítica de execução remota de código (RCE) que afeta aplicações Next.js que usam Server Actions.
[!WARNING] Aviso Legal: Esta ferramenta é apenas para fins educacionais e de testes autorizados. Não sou responsável por qualquer uso indevido.
Este script explora uma vulnerabilidade de desserialização insegura no protocolo "Flight" do React Server Components. Ele permite que invasores não autenticados executem código JavaScript arbitrário no servidor, levando a uma Execução Remota de Código (RCE) parcial.
require (global.require ou via construtor do módulo), garantindo que funcione em versões modernas do Node.js (v14+).pip install -r requirements.txt
python3 react2shell.py -u <TARGET_URL> [-c <COMMAND>]
| Argumento | Descrição | Padrão |
|---|---|---|
-u, --url | Obrigatório. A URL alvo (ex.: http://localhost:3000/). | N/A |
-c, --cmd | Opcional. O comando a ser executado no servidor. | id |
Verificar identidade do usuário:
python3 react2shell.py -u http://127.0.0.1:3000/
Listar o conteúdo do diretório:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "ls -la"
Ler um arquivo sensível:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "cat /etc/passwd"
O exploit aproveita uma cadeia de Prototype Pollution e Desserialização Insegura no tratamento de Server Actions do Next.js para React Server Components (RSC).
Next-Action sinaliza ao servidor para processar uma Server Action.then maliciosa ("$1:__proto__:then"). Isso engana o manipulador de requisições assíncronas do servidor, fazendo-o tratar o payload como um "Thenable" (objeto semelhante a Promise)._response. O campo _prefix é normalmente usado para buffer interno do stream, mas ao manipulá-lo, podemos injetar JavaScript puro.require geralmente é removida do escopo global para prevenir RCE. O script contorna isso percorrendo a cadeia de protótipos do process.mainModule:
var require = global.require || global.process.mainModule.constructor._load;
child_process e executar comandos do sistema.execSync), e a saída é lançada como um objeto Error. Esse erro é serializado e retornado ao cliente no corpo da resposta HTTP, permitindo visualizar a saída do comando.Esta ferramenta foi desenvolvida com a ajuda do Gemini 3 Pro.