React2Shell: come una deserializzazione ha reso RCE metà del web moderno

CVSS 10.0, RCE pre-auth in React Server Components. Vulnerabile di default, in CISA KEV dopo due giorni. Intermedia Tema tecnico CVE-2025-55182 (React Server Components) + CVE-2025-66478 (Next.js) Severità CVSS 3.1 10.0 CRITICAL (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) — CWE-502 Deserialization of Untrusted Data Stato di sfruttamento RCE pre-autenticazione — CISA KEV dal 05/12/2025, scadenza 12/12/2025 — sfruttata in the wild — vulnerabile nella configurazione di default Difficoltà Intermedia Lettura 5-6 minuti Il 3 dicembre 2025 il team React ha pubblicato una patch che ha tenuto svegli i security engineer di mezzo mondo. CVSS 10.0, esecuzione di codice remoto senza autenticazione, in React Server Components. Non in un plugin, non in una configurazione esotica: nel comportamento di default. Due giorni dopo era nel catalogo KEV della CISA, e Wiz stimava che circa quattro ambienti cloud su dieci avessero almeno un’istanza vulnerabile. La radice è una delle classi di bug più vecchie del mestiere — la deserializzazione di dati non fidati — che in questa serie ritroveremo dentro SharePoint e dentro LangChain. Perché conta — i numeri in sintesi Colpisce React Server Components 19.0.0-19.2.0 (più react-server-dom-parcel / -turbopack / -webpack) e Next.js 15.0.0-16.0.7. RCE pre-autenticazione deserializzando payload HTTP diretti agli endpoint Server Function. Wiz riporta ~40% degli ambienti cloud analizzati con almeno un’istanza vulnerabile e un success rate prossimo al 100% nei test. Google Cloud la classifica fra i principali vettori d’accesso iniziale cloud del 2026. Cos’è una Server Function, e perché è un endpoint Nell’App Router di Next.js una funzione marcata “use server” si chiama dal browser come se fosse una funzione locale. Non lo è. È una route HTTP: React genera un identificatore per quella funzione, il client invia una POST con un header Next-Action e un payload nel formato interno di React — il protocollo Flight — e il server deserializza quel payload per ricostruire gli argomenti della chiamata. Il punto è tutto qui. «Chiamare una funzione sul server» è un’astrazione comodissima e, come tutte le astrazioni comode, nasconde dove passa il confine fra ciò che è tuo e ciò che arriva da fuori. Quel confine è il deserializzatore. CWE-502 in cinque righe Serializzare significa trasformare un oggetto in una sequenza di byte; deserializzare è il contrario. Il problema è che per ricostruire un oggetto il deserializzatore deve fare delle cose: risolvere riferimenti, invocare costruttori, chiamare metodi. Se la sequenza di byte arriva da un attaccante, è l’attaccante a scegliere quali cose. La CWE-502 non è «l’input non è validato»: è «l’input decide cosa esegue il parser». È la stessa classe di ObjectInputStream in Java, di pickle in Python e del ViewState in .NET — quest’ultimo lo incontreremo alla pillola 8, dentro SharePoint. Cambia il linguaggio, non cambia la lezione. La catena, per quel che se ne sa Gli advisory ufficiali sono volutamente reticenti: React e Vercel hanno scritto nero su bianco di aver limitato i dettagli tecnici «per proteggere gli sviluppatori che non hanno ancora aggiornato». Da fonte primaria sappiamo che il difetto sta nel modo in cui React decodifica i payload diretti agli endpoint delle Server Function. La ricerca di Akamai aggiunge il pezzo mancante: deserializzazione insicura combinata con prototype pollution per arrivare all’esecuzione di codice. I proof of concept pubblici raccontano il resto, e vanno letti per quello che sono — ricostruzioni della community, non parola del vendor. Il formato Flight usa marcatori testuali per i riferimenti: una stringa può significare «risolvi il chunk numero 1» invece di «questa è la stringa $1». Costruendo un oggetto che il decoder tratta come una Promise già risolta si arriva a controllare il metodo .then, da lì un riferimento interno, e da lì il costruttore Function con una stringa scelta dall’attaccante. Fine della catena. Il dettaglio che conta più di tutto il resto è un altro: non serve un identificatore di action valido. Il codice gira durante la deserializzazione, cioè prima che qualcuno controlli se quella action esista davvero. Un header Next-Action con un valore qualsiasi è sufficiente. È il motivo per cui questa vulnerabilità non si difende «non esponendo funzioni sensibili»: non c’è nessuna funzione da esporre. Perché «vulnerabile di default» cambia tutto Wiz lo mette in una frase: un’app Next.js standard, buildata per la produzione, è sfruttabile senza modifiche al codice. Non serve nemmeno aver scritto una Server Action. Se usi l’App Router in produzione con una versione affetta, ci sei dentro — e non c’è una scelta architetturale che ti abbia protetto. È questa la differenza fra un bug grave e un evento di ecosistema. Il conto è arrivato in fretta: CISA ha aggiunto la CVE al catalogo KEV il 5 dicembre, due giorni dopo la disclosure, con scadenza di rimedio al 12 dicembre per le agenzie federali; Censys ha stimato circa 2,15 milioni di servizi esposti su Internet potenzialmente affetti; Wiz aggiunge che il 12% degli ambienti espone direttamente su Internet un’applicazione React o Next.js vulnerabile; fra gli attori: UNC5174 (oltre trenta organizzazioni colpite), Earth Lamia e Jackpot Panda, più un gruppo nordcoreano; poi il consueto corredo di post-exploitation — Sliver, Cobalt Strike, il miner XMRig — e infine la botnet RondoDox, che l’ha aggiunta al proprio arsenale di n-day. Da APT mirato a botnet opportunistica in pochi giorni: è la parabola tipica di ogni vulnerabilità con exploit affidabile e superficie enorme. Google Threat Intelligence Group ha osservato il deploy di miner XMRig entro circa 48 ore dalla disclosure pubblica. Il conto complessivo lo fa il Cloud Threat Horizons H1 2026 di Google Cloud, che cita React2Shell come esempio principale di un ribaltamento: nella seconda metà del 2025 le vulnerabilità in software di terze parti sono passate dal 2,9% al 44,5% dei vettori di accesso iniziale sul cloud, mentre le credenziali deboli o assenti scendevano dal 47,1% al 27,2%. È lo stesso spostamento che abbiamo visto nella prima pillola con i dati DBIR e Mandiant, misurato però dentro un singolo cloud provider. Chi non è vulnerabile (e perché saperlo è metà del lavoro) In un incidente, sapere cosa NON devi toccare vale quanto sapere cosa devi aggiornare. Il perimetro esatto: Affetti: Next.js 15.x e 16.x che usano React Server Components con l’App Router, più le canary da 14.3.0-canary.77 in poi. Non affetti: Next.js 13.x, Next.js 14.x stabile, le applicazioni Pages Router e l’Edge Runtime. Non solo Next.js: il difetto è nel protocollo RSC, quindi toccano anche React Router (RSC), Waku, @parcel/rsc, @vitejs/plugin-rsc e Redwood SDK. Il fix, il cerotto e la parte che tutti saltano Non esiste workaround: l’unica soluzione è aggiornare. Lato React le versioni corrette sono 19.0.1, 19.1.2 e 19.2.1; lato Next.js sono 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 e 16.0.7, più le canary 15.6.0-canary.58 e 16.1.0-canary.12. Vercel ha pubblicato anche uno strumento che fa il controllo e il bump al posto tuo: npx fix-react2shell-next Sui WAF: Akamai, Cloudflare, Fastly e Azure hanno rilasciato regole gestite, e servono — come ponte. Ma il payload è JSON strutturato dentro un protocollo che accetta sia text/plain sia multipart/form-data, cioè terreno fertile per i bypass. React e Vercel sono stati espliciti: gli utenti «non dovrebbero dipendere» da quelle mitigazioni. E poi c’è la parte che moltissimi hanno saltato: ruotare i segreti. Vercel l’ha scritto senza giri di parole — se la tua applicazione era online e non patchata alla data del 4 dicembre 2025, ruota tutte le credenziali che usa, partendo dalle più critiche. Torna il tema che incontreremo alla pillola 12 con Ivanti: applicare la patch non è rimediare all’incidente. Una nota sui due identificatori Il titolo di questa pillola cita due CVE, ma non sono pari grado. CVE-2025-55182 è il difetto upstream in React. CVE-2025-66478 è stato aperto per tracciare l’impatto downstream sulle applicazioni Next.js ed è l’identificatore usato dall’advisory di Vercel — ma il record su NVD risulta rifiutato come duplicato di 55182. Se lo cerchi su NVD non trovi né CVSS né stato KEV, e non è un errore tuo: è una conseguenza di come vengono assegnati i CVE quando la stessa falla attraversa più progetti. Nel tuo inventario e nelle tue query, cerca 55182. Dieci minuti, adesso Se hai anche solo un progetto Next.js in giro, in produzione o nel homelab: Lancia npx fix-react2shell-next nella cartella del progetto: ti dice se sei affetto e a quale versione salire. Verifica a mano le due condizioni che contano: stai usando l’App Router? sei su 15.x o 16.x? Se l’app è stata online e non patchata a dicembre 2025, ruota i segreti. Tutti. Cerca nei log le POST con header Next-Action verso route dell’App Router, e nel runtime i processi figli anomali generati da next-server (una shell che nasce da un processo Node è quasi sempre una brutta notizia). Cosa portarsi via Un ultimo numero, che è anche l’unica buona notizia della pillola. Shadowserver contava 77.664 indirizzi IP vulnerabili il 5 dicembre e 28.964 il 7 dicembre: due terzi in meno in due giorni. Confrontalo con i 43 giorni di mediana per rimediare una KEV che abbiamo visto nella prima pillola. La differenza non sta nella gravità, e nemmeno nella bravura di chi difende. Sta nel fatto che qui esistevano un gestore di pacchetti, release line ordinate e uno strumento ufficiale di aggiornamento. Nelle prossime pillole vedremo cosa succede quando quelle tre cose mancano — perché è lì, non sul CVSS, che si decide quanto dura un’esposizione. Detto questo, non finisce con la curva che scende. Ad aprile 2026 — quattro mesi dopo la patch — Cisco Talos ha documentato un cluster tracciato come UAT-10608 che aveva compromesso almeno 766 host Next.js individuati con Shodan, Censys e scanner propri, portando via credenziali di database, chiavi SSH private, segreti AWS, chiavi API Stripe, token GitHub e perfino chiavi di piattaforme AI. Nessun bersaglio scelto: solo tutto quello che era ancora raggiungibile. È la coda lunga, ed è la parte che nelle statistiche non si vede. I due terzi che patchano in due giorni fanno il grafico; il terzo che non lo fa diventa, mesi dopo, la mappa dettagliata di un’infrastruttura in vendita. Prossima pillola: WP2Shell — due bug WordPress che insieme fanno RCE senza login (CVE-2026-60137 + CVE-2026-63030). Fonti React, «Critical Security Vulnerability in React Server Components», 3 dicembre 2025 — react.dev Next.js, «Security Advisory: CVE-2025-66478», 3 dicembre 2025 — nextjs.org NVD, CVE-2025-55182 — nvd.nist.gov NVD, CVE-2025-66478 (record rifiutato come duplicato) — nvd.nist.gov CISA, Known Exploited Vulnerabilities Catalog — cisa.gov Wiz, «Critical vulnerability in React (CVE-2025-55182)» — wiz.io Akamai, «CVE-2025-55182: React and Next.js Server Functions Deserialization RCE» — akamai.com Unit 42 (Palo Alto Networks), analisi CVE-2025-55182 / CVE-2025-66478 — unit42.paloaltonetworks.com AWS Security Blog, «China-nexus cyber threat groups rapidly exploit React2Shell» — aws.amazon.com The Hacker News, «Critical React2Shell flaw added to CISA KEV» — thehackernews.com Google Cloud, Cloud Threat Horizons Report H1 2026 — cloud.google.com Cisco Talos via The Hacker News, «Hackers exploit CVE-2025-55182 to breach 766 Next.js hosts» (UAT-10608), 2 aprile 2026 — thehackernews.com Cloudflare, «React2Shell and related RSC vulnerabilities threat brief» — blog.cloudflare.com Le pillole di vulnerabilità escono una a settimana, il giovedì. Iscriviti per non perdere le prossime. Apri la pillola 02 in pagina singola →
Condividi:

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *