
Pesquisa avançada de segurança sobre o CVE-2025-55182 (React2Shell). Apresenta um framework de exploração com 6 cenários de impacto funcionais (de RCE a Exfiltração de Segredos), um shell reverso interativo e um laboratório completo. Peça de portfólio demonstrando análise aprofundada de Prototype Pollution e Insecure Deserialization em React Server Components.
Desserialização de Dados Não Confiáveis + Poluição de Protótipo em React Server Components
Execução Remota de Código Não Autenticada via Next.js Server Actions
Afetado: React 19.0.0 - 19.2.0 · Correção: React 19.0.1 / 19.1.2 / 19.2.1 (3 de dezembro de 2025)
Demonstração do exploit avançado — comandos básicos de RCE, shell interativo e múltiplos vetores de ataque contra uma aplicação Next.js vulnerável
Este repositório contém minha pesquisa de Dissertação de Mestrado sobre CVE-2025-55182, uma vulnerabilidade Crítica (CVSS v3.1: 10.0) de Execução Remota de Código em React Server Components.
A vulnerabilidade origina-se de um mecanismo inseguro de desserialização no protocolo React Flight. Ao processar Server Actions, o Next.js desserializa payloads multipart recebidos sem validação adequada. Um atacante pode criar um payload malicioso que polui a cadeia de protótipos e injeta JavaScript arbitrário, o qual é executado no servidor por meio do construtor Function (e subsequentemente via child_process.execSync()).
Nota sobre CVE-2025-66478: A Vercel emitiu um CVE paralelo para rastrear o impacto específico no Next.js desta mesma vulnerabilidade. Como o Next.js empacota o React de forma vendored, muitos scanners de dependências não a detectam automaticamente como vulnerável. O Banco de Dados Nacional de Vulnerabilidades dos EUA (NVD) rejeitou oficialmente o CVE-2025-66478 como duplicado do CVE-2025-55182, embora ele continue sendo referenciado no advisory de segurança da própria Vercel.
Vulnerabilidades subsequentes: A equipe do React divulgou posteriormente dois problemas adicionais presentes nas versões iniciais da correção (19.0.1, 19.1.2, 19.2.1): CVE-2025-55184 (Negação de Serviço, CVSS 7.5) e CVE-2025-55183 (Exposição de Código-Fonte, CVSS 5.3). Os usuários devem atualizar para 19.0.2, 19.1.3 ou 19.2.2 para resolver os três.
CVE-2025-55182/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ ├── exploit-explanation.md # Exploit usage documentation
│ └── react2shell.py # Main exploit — 4 attack modules + interactive shell
│
├── vulnerable-app/ # Vulnerable Next.js application
│ ├── README.md # Original vulnapp credits
│ ├── package.json # React 19.0.0 (vulnerable)
│ ├── app/ # Application source code
│ ├── curl_id.sh # Original exploit script (by zack0x01)
│ └── scripts/
│ └── restore.sh # Restoration script (my contribution)
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 01-app-initial.png
│ ├── 02-rce-basic.png
│ ├── 03-interactive-shell.png
│ ├── 04-no-payload.png
│ ├── 05-delete-result.png
│ ├── 06-deface.png
│ ├── 07-shutdown-servers.png
│ ├── 08-restore-from-script.png
│ └── 09-restore-from-interactive-shell.png
│
└── analysis/
├── 01-root-cause.md # Vulnerability root cause analysis
├── 02-payload-breakdown.md # Payload structure and execution flow
└── 03-timeline.md # CVE timeline
vulnerable-app/)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# App available at http://localhost:3000
cd ../exploit
# Check if target is vulnerable
python3 react2shell.py -u http://localhost:3000 --check
# Execute single command
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# Interactive shell mode
python3 react2shell.py -u http://localhost:3000 -i
React Server Components usam um mecanismo customizado de serialização/desserialização (o protocolo "Flight") para enviar dados de componentes do servidor para o cliente. Ao processar server actions, o servidor desserializa os payloads recebidos sem validação adequada.
A falha central é a confiança comportamental: o desserializador verifica typeof obj.then === 'function' para identificar Promises, sem verificar se a propriedade pertence diretamente ao objeto. Isso permite que um atacante envenene Object.prototype.then, fazendo com que todo objeto comum pareça um thenable.
Um atacante pode criar um payload malicioso que:
__proto__:thenFunction via $1:constructor:constructornew Function(_prefix)process.mainModule.require('child_process').execSync()X-Action-RedirectUser-mode (unauthenticated)
│
├─ POST / (Next.js Server Action endpoint)
│ ├─ Headers: Next-Action: x
│ └─ Multipart body with malicious JSON
│
└─ React Flight deserializer processes payload
└─ Prototype pollution via __proto__:then
└─ Function constructor reached via $1:constructor:constructor
└─ new Function(_prefix) executes attacker's JavaScript
└─ execSync() runs system command
└─ Output embedded in NEXT_REDIRECT error
└─ Next.js converts to X-Action-Redirect header
A vulnerabilidade afeta qualquer aplicação Next.js que use o App Router com React Server Components — a configuração padrão desde o Next.js 14. Server Actions definidas explicitamente não são necessárias; a mera presença dos pacotes RSC afetados é suficiente.
Esta vulnerabilidade permite que um atacante não autenticado:
1. [ANY] Send crafted multipart POST to any Server Action endpoint
2. [SERVER] React deserializer processes malicious JSON
3. [SERVER] Prototype pollution poisons Object.prototype.then
4. [SERVER] Plain object treated as thenable; Function constructor reached
5. [SERVER] new Function(_prefix) executes attacker's arbitrary JavaScript
6. [SERVER] execSync() runs system command; output captured
7. [SERVER] Output embedded in NEXT_REDIRECT error digest
8. [SERVER] Next.js returns X-Action-Redirect header with URL-encoded output
9. [ATTACKER] Extract and URL-decode command result from header
Todos os testes foram conduzidos em uma VM isolada do VirtualBox executando Kali Linux 2026.1 com Next.js 15.0.0 e React 19.0.0, sem exposição à rede.
Determinismo: Diferente de exploits probabilísticos (ex.: heap spray), o CVE-2025-55182 é completamente determinístico — qualquer requisição HTTP POST formatada corretamente produz RCE com probabilidade 1 em qualquer sistema não corrigido executando React 19.0.0–19.2.0 com React Server Components habilitados.
| Documento | Descrição |
|---|---|
| Análise da Causa Raiz | Falha de desserialização e poluição de protótipo no React Flight |
Esta pesquisa faz parte da minha Dissertação de Mestrado em Cibersegurança (UCAM — Campus Internacional de Ciberseguridad), analisando vulnerabilidades N-Day em múltiplos ambientes.
Este CVE representa o vetor de framework JavaScript moderno dentro da dissertação, demonstrando:
Palavras-chave: RCE · Prototype Pollution · Deserialization · React · Next.js · Server Actions · CVE-2025-55182
Annais Molina (devianntsec) — Pesquisador de Segurança | Mestrado em Cibersegurança (UCAM)
Licença MIT — consulte LICENSE
Este repositório é fornecido apenas para fins educacionais e de pesquisa em segurança, como parte de uma Dissertação de Mestrado acadêmica. Todos os testes foram realizados em máquinas virtuais isoladas, sem exposição à rede. Use apenas em sistemas que você possua ou para os quais tenha autorização escrita explícita para testar. O uso não autorizado contra sistemas é ilegal e pode resultar em processo criminal.
| Aspecto | Descrição |
|---|
| Quatro módulos de ataque | Excluir projetos, desfigurar site, roubar variáveis de ambiente, desligar servidores |
| Shell interativo | Shell persistente com comandos especiais e capacidades de restauração |
| Exfiltração estável | Leitura linha por linha para contornar as limitações de tamanho do cabeçalho HTTP |
| Script de restauração | Restauração segura do laboratório após ataques |
| Documentação acadêmica | Causa raiz, detalhamento do payload e cronologia da vulnerabilidade |
| Módulo | Comando | Descrição | Impacto |
|---|
| Excluir Projetos | --delete-projects | Exclui todos os projetos do painel | Destruição de dados |
| Deface | --deface "message" | Substitui a página principal | Desfiguração |
| Roubar Ambiente | --steal-env | Rouba variáveis de ambiente | Exfiltração |
| Desligar Servidores | --shutdown-servers | Desliga todos os servidores | Negação de Serviço |
| Módulo de Ataque | Resultado | Observações |
|---|
| Execução de comandos | ✅ RCE confirmado | whoami, id, uname -a funcionam de forma confiável |
| Excluir projetos | ✅ Painel modificado | Projetos removidos, estrutura do React preservada |
| Deface | ✅ Site desfigurado | Mensagem personalizada exibida |
| Roubar ambiente | ✅ Variáveis de ambiente extraídas | Salvas em stolen_env.txt |
| Desligar servidores | ✅ Todos os servidores exibidos como parados | UI atualizada, React funcional |
| Shell interativo | ✅ Shell persistente | Comandos especiais disponíveis |
| Restauração | ✅ Estado original restaurado | Via script restore.sh |
| Detalhamento do Payload |
| Análise linha por linha da estrutura JSON maliciosa |
| Cronologia do CVE | Cronologia de descoberta, divulgação e correção |