
Kit de ferramentas Go leve, além de um laboratório Next.js em Docker para explorar e fazer triagem da CVE-2025-55182.
Toolkit Go leve, mais um laboratório Next.js em contêiner Docker, para explorar e fazer triagem da CVE-2025-55182. Somente para fins educacionais e testes autorizados.
React2Shell_Deconstructing_a_Perfect_10_RCE.pdf e o diagrama do caminho de ataque
checker: verificação rápida e concorrente de inventário (alvo único, arquivo ou stdin), heurística para exposição de RSC, saída JSON por alvo, resumo final, opcionais -only-vuln, -no-progress, -ua personalizado.poc: envia a requisição multipart estilo exploit do RSC e imprime o digest retornado; suporta comando personalizado via -c (padrão id).-c), timeouts e estatísticas de progresso.-target, -list ou -stdin; adiciona automaticamente https:// quando o esquema está ausente.vulnlab/) com Next.js 15.5.6/React 19, Dockerfile e docker-compose.yml fixados em localhost:3000 para reprodução segura.cd checker
GOCACHE=/tmp/go-cache go build -o CVE-2025-55182 ./cmd/CVE-2025-55182
Defina GOCACHE se o seu ambiente tiver problemas de permissão de cache.
# Scanner
./CVE-2025-55182 checker -target https://example.com
./CVE-2025-55182 checker -list ../targets.txt -c 50 -only-vuln
cat ../targets.txt | ./CVE-2025-55182 checker -stdin -no-progress
# PoC (requisição estilo exploit)
./CVE-2025-55182 poc -target http://localhost:3000
./CVE-2025-55182 poc -target http://localhost:3000 -c "whoami"
A CVE-2025-55182 é uma falha de desserialização insegura na forma como os React Server Components carregam módulos a partir de payloads Flight. Em react-server-dom-webpack, o helper requireModule(metadata) busca um módulo e então retorna moduleExports[metadata[2]]. O acesso por colchetes percorre a cadeia de protótipos, então uma referência controlada pelo atacante, como $1:constructor:constructor, sobe de uma função exportada para o seu constructor (o construtor global Function) e pode executar JS arbitrário. O protocolo Flight permite que atacantes forneçam esses caminhos de propriedade separados por dois-pontos, transformando o carregador de módulos em um gadget para execução remota de código.
cd vulnlab
docker compose build
docker compose up
# O app escuta em 127.0.0.1:3000 dentro do contêiner; roda como usuário não-root.
Dockerfile cria um app Next.js (Node 20 Alpine), instala as dependências, compila e executa como usuário não-root nextjs.docker-compose.yml vincula 127.0.0.1:3000:3000 para testes somente locais por padrão.Snort / Suricata (HTTP para o servidor)
alert http any any -> $LAN_NETWORK any (
msg:"Potential Next.js React2Shell / CVE-2025-66478 attempt";
flow:to_server,established;
content:"Next-Action"; http_header; nocase;
content:"multipart/form-data"; http_header; nocase;
pcre:"/Content-Disposition:\s*form-data;\s*name=\"0\"/s";
pcre:"/\"status\"\s*:\s*\"resolved_model\"/s";
pcre:"/\"then\"\s*:\s*\"\$1:__proto__:then\"/s";
classtype:web-application-attack;
sid:6655001;
rev:1;
)
Consulta (pacotes React RSC vulneráveis)
{
"queries": {
"detect_rev2shell_react_server_components": {
"query": "SELECT name, version, path FROM npm_packages WHERE (name='react-server-dom-parcel' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-turbopack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-webpack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0'));",
"interval": 3600,
"description": "Detects vulnerable versions of React Server Components packages (react-server-dom-*) affected by CVE-2025-55182 / CVE-2025-66478 / React2Shell.",
"platform": "linux,windows,macos",
"version": "1.0"
}
}
}