
Toolkit Go leggero più un laboratorio Next.js Dockerizzato per esplorare e fare triage di CVE-2025-55182.
Toolkit Go leggero più un laboratorio Next.js in Docker per esplorare e fare triage di CVE-2025-55182. Solo per test educativi e autorizzati.
React2Shell_Deconstructing_a_Perfect_10_RCE.pdf e il diagramma del percorso di attacco
checker: scansione rapida e concorrente dell'inventario (singolo target, file o stdin), euristica per esposizione RSC, output JSON per target, riepilogo finale, -only-vuln opzionale, -no-progress, -ua personalizzato.poc: invia la richiesta multipart RSC in stile exploit e stampa il digest restituito; supporta comando personalizzato tramite -c (default id).-c), timeout e statistiche di avanzamento.-target, -list o -stdin; prepende automaticamente https:// quando manca lo schema.vulnlab/) con Next.js 15.5.6/React 19, Dockerfile e docker-compose.yml fissato su localhost:3000 per riproduzione sicura.cd checker
GOCACHE=/tmp/go-cache go build -o CVE-2025-55182 ./cmd/CVE-2025-55182
Imposta GOCACHE se il tuo ambiente ha problemi di permessi per la 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 (richiesta in stile exploit)
./CVE-2025-55182 poc -target http://localhost:3000
./CVE-2025-55182 poc -target http://localhost:3000 -c "whoami"
CVE-2025-55182 è un bug di deserializzazione non sicura nel modo in cui i React Server Components caricano moduli dai payload Flight. In react-server-dom-webpack, l'helper requireModule(metadata) recupera un modulo e poi restituisce moduleExports[metadata[2]]. L'accesso con parentesi percorre la catena dei prototipi, quindi un riferimento controllato dall'attaccante come $1:constructor:constructor sale da una funzione esportata al suo constructor (il costruttore globale Function) e può eseguire JS arbitrario. Il protocollo Flight consente agli attaccanti di fornire questi percorsi di proprietà separati da due punti, trasformando il caricatore di moduli in un gadget per l'esecuzione remota di codice.
cd vulnlab
docker compose build
docker compose up
# App listens on 127.0.0.1:3000 inside the container; runs as non-root user.
Dockerfile costruisce un'app Next.js (Node 20 Alpine), installa le dipendenze, compila e viene eseguita come utente non-root nextjs.docker-compose.yml associa 127.0.0.1:3000:3000 per test solo locali per impostazione predefinita.Snort / Suricata (HTTP al server)
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;
)
Query (pacchetti React RSC vulnerabili)
{
"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"
}
}
}