
Kit de herramientas Go ligero más un laboratorio Next.js dockerizado para explorar y hacer triaje de CVE-2025-55182.
Toolkit ligero en Go y un laboratorio Next.js dockerizado para explorar y clasificar CVE-2025-55182. Solo para fines educativos y pruebas autorizadas.
React2Shell_Deconstructing_a_Perfect_10_RCE.pdf y el diagrama de la ruta de ataque
checker: escaneo de inventario rápido y concurrente (objetivo único, archivo o stdin), heurística para exposición RSC, salida JSON por objetivo, resumen final, opcional -only-vuln, -no-progress, -ua personalizado.poc: envía la solicitud multipart RSC de estilo exploit e imprime el resumen devuelto; admite comando personalizado mediante -c (por defecto id).-c), tiempos de espera y estadísticas de progreso.-target, -list, or -stdin; antepone automáticamente https:// cuando falta el esquema.vulnlab/) con Next.js 15.5.6/React 19, Dockerfile y docker-compose.yml fijados a localhost:3000 para una reproducción segura.cd checker
GOCACHE=/tmp/go-cache go build -o CVE-2025-55182 ./cmd/CVE-2025-55182
Establece GOCACHE si tu entorno tiene problemas de permisos de caché.
# Escáner
./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 (solicitud de estilo exploit)
./CVE-2025-55182 poc -target http://localhost:3000
./CVE-2025-55182 poc -target http://localhost:3000 -c "whoami"
CVE-2025-55182 es un fallo de deserialización insegura en la forma en que los React Server Components cargan módulos desde los payloads Flight. En react-server-dom-webpack, la función auxiliar requireModule(metadata) obtiene un módulo y luego devuelve moduleExports[metadata[2]]. El acceso por corchetes recorre la cadena de prototipos, por lo que una referencia controlada por el atacante como $1:constructor:constructor asciende desde una función exportada hasta su constructor (el constructor global Function) y puede ejecutar JS arbitrario. El protocolo Flight permite a los atacantes proporcionar esas rutas de propiedades separadas por dos puntos, convirtiendo el cargador de módulos en un gadget para la ejecución remota de código.
cd vulnlab
docker compose build
docker compose up
# La aplicación escucha en 127.0.0.1:3000 dentro del contenedor; se ejecuta como usuario no root.
Dockerfile crea una aplicación Next.js (Node 20 Alpine), instala dependencias, compila y se ejecuta como un usuario no root nextjs.docker-compose.yml vincula 127.0.0.1:3000:3000 para pruebas solo locales de forma predeterminada.Snort / Suricata (HTTP al 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 (paquetes RSC de React vulnerables)
{
"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"
}
}
}