
Kit de exploração RCE para CVE-2025-55182 e CVE-2025-66478 em React Server Components. Inclui múltiplas variantes de exploração, scripts de detecção, um servidor de teste vulnerável e uma análise técnica aprofundada da vulnerabilidade de desserialização do protocolo Flight.
CVE-2025-55182 (React) e CVE-2025-66478 (Next.js)
Este repositório contém código de exploit apenas para testes de segurança autorizados e fins educacionais.
Veja também: Vários pesquisadores publicaram análises desta vulnerabilidade. Consulte a seção References para perspectivas adicionais, técnicas de exploit e métodos de detecção.
Na quarta-feira, 3 de dezembro de 2025, uma vulnerabilidade crítica de Execução Remota de Código nos React Server Components foi divulgada publicamente. O bug, apelidado de "React2Shell", permite que um atacante não autenticado execute código arbitrário em qualquer servidor que execute versões vulneráveis do React RSC ou do Next.js App Router enviando uma única requisição HTTP.
Dado o quanto o Next.js se tornou onipresente - ele alimenta uma parcela significativa da web moderna - o impacto desta vulnerabilidade é grave. Qualquer aplicação Next.js que use o App Router (o padrão para novos projetos desde o Next.js 13) com RSC habilitado está vulnerável. Nenhuma configuração especial. Nenhum endpoint específico. Apenas uma requisição POST para qualquer rota.
A vulnerabilidade reside no protocolo "Flight" do React, o formato de serialização usado para transmitir dados entre servidor e cliente nos React Server Components. A ausência de uma verificação hasOwnProperty durante a desserialização permite a travessia da cadeia de protótipos, alcançando em última instância o construtor Function do JavaScript para executar código controlado pelo atacante.
A falha existe nos pacotes react-server-dom-webpack, react-server-dom-turbopack e react-server-dom-parcel do React. O Next.js, como o principal consumidor de RSC, herda a vulnerabilidade por meio do seu App Router.
Muitos serviços são potencialmente vulneráveis. O Next.js é um dos frameworks React mais populares, usado por empresas de todos os tamanhos - de startups a grandes corporações. O App Router com React Server Components tem sido a arquitetura padrão para novos projetos Next.js desde a versão 13, o que significa que a maioria das implantações modernas de Next.js é afetada.
Qualquer aplicação que utilize:
react-server-dom-* vulneráveis (19.0.0 - 19.2.0)Isso inclui implantações em produção na Vercel, AWS, infraestrutura auto-hospedada e em qualquer outro lugar onde aplicações Next.js App Router sejam executadas.
Não afetados:
process.mainModule disponível)| Pacote | Vulnerável | Corrigida |
|---|---|---|
react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Linha de Versão | Vulnerável | Corrigida |
|---|---|---|
| 15.0.x | < 15.0.5 | 15.0.5+ |
| 15.1.x | < 15.1.9 | 15.1.9+ |
| 15.2.x | < 15.2.6 | 15.2.6+ |
| 15.3.x | < 15.3.6 | 15.3.6+ |
| 15.4.x | < 15.4.8 | 15.4.8+ |
| 15.5.x | < 15.5.7 | 15.5.7+ |
| 16.0.x | < 16.0.7 | 16.0.7+ |
Atualize imediatamente. Não há soluções alternativas.
Para aplicações Next.js:
npm install next@latest
# or
pnpm update next
Para uso direto de RSC do React:
npm install react-server-dom-webpack@latest
Verifique suas versões instaladas:
npm ls next react-server-dom-webpack react-server-dom-turbopack
Múltiplos vetores de ataque foram descobertos para esta vulnerabilidade. O mais comum - e o que funciona sem nenhum pré-requisito - usa poluição de protótipo por meio do sistema de referências do protocolo Flight do React.
O exploit envia uma requisição POST multipart especialmente elaborada com o cabeçalho Next-Action. O payload abusa do sistema de referências para:
$1:__proto__:thenFunction do JavaScriptPOST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x
------Boundary
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","value":"{...}","_response":{...}}
------Boundary
Content-Disposition: form-data; name="1"
"$@0"
------Boundary--
O código é executado durante a desserialização, antes de qualquer validação de ID de ação ocorrer. Isso significa que qualquer valor no cabeçalho Next-Action aciona o caminho de código vulnerável - nenhum ID de ação válido é necessário.
Outros vetores de ataque existem, incluindo referências de função
$Fe gadgets de módulo diretos. Eles normalmente exigem um ID de ação válido. Consulte Vetores de Ataque Alternativos para obter detalhes.
O protocolo Flight do React resolve referências como $1:path:to:value dividindo nos dois-pontos e percorrendo o objeto:
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // No hasOwnProperty check!
}
A Ironia: No topo deste mesmo arquivo, linha 35:
import hasOwnProperty from 'shared/hasOwnProperty';O guard foi importado. Estava disponível. Simplesmente não foi usado no único loop onde era mais importante.
Essa única verificação ausente permite que $1:__proto__:then atravesse de um objeto chunk, suba pela cadeia de protótipos, até Chunk.prototype.then - uma função que processa objetos semelhantes a Promise. Ao criar um chunk falso com as propriedades certas, controlamos qual código é executado.
Clone o servidor de teste vulnerável:
git clone https://github.com/freeqaz/react2shell
cd react2shell/vulnerable-next-server
pnpm install
pnpm dev
Em outro terminal:
./detect.sh http://localhost:3443
Um servidor vulnerável retorna HTTP 500 com E{"digest" no corpo da resposta. Para demonstrar a RCE:
./exploit-redirect.sh http://localhost:3443 "id"
A saída do comando aparece na resposta. Para exploração interativa:
./shell.sh http://localhost:3443
O diretório vulnerable-next-server/ contém uma aplicação pré-configurada Next.js 16.0.6 + React 19.2.0 para testes locais seguros. Ela executa na porta 3443 por padrão. Esta é uma configuração mínima de App Router que demonstra que configurações padrão são vulneráveis.
Desenvolvemos múltiplas variantes de exploit para lidar com diferentes cenários: