Illustrazione: Node2Shell: un dato compresso può prendersi il tuo server Node.js

Una falla nel decoder Brotli permette di eseguire codice in Node.js. Colpisce anche Bun, Envoy, Istio e alcune librerie Python. Le patch ci sono già: Node 22.23.4, 24.22.1 e 26.12.1.

Può bastare una risposta HTTP compressa per mettere le mani su un server? Con Node2Shell la risposta è sì, almeno in teoria. E la teoria si sta avvicinando parecchio alla pratica.

Cosa è successo

La vulnerabilità si chiama ufficialmente CVE-2026-111497. In giro la trovate anche come HTTPS2Shell o Brotlipocalypse. Sta nel decoder Brotli, cioè nel pezzo di codice che decomprime i dati in formato Brotli: un algoritmo di compressione molto usato sul web per alleggerire pagine e risposte delle API. Se riceve dati malformati costruiti apposta, il decoder scrive fuori dallo spazio di memoria che gli è stato assegnato. Il nome tecnico è out-of-bounds write. Nel caso peggiore questo errore porta all'esecuzione di codice da remoto.

Il punto delicato è che non serve usare Brotli di proposito. In Node.js la funzione fetch() decomprime da sola le risposte Brotli. Quindi un'applicazione che contatta un server esterno compromesso, o malevolo, può ricevere il pacchetto avvelenato senza che nessuno abbia scritto una riga di codice dedicata alla compressione. Lo stesso vale per i dati in arrivo nelle richieste, se l'app li decomprime con il modulo node:zlib.

Quanto è concreto il rischio

La prima prova di concetto funzionava solo su una build di test indebolita apposta. Poi Imperva ha pubblicato un exploit che esegue codice su Node.js 24.22.0 per Linux arm64, senza debugger e senza modifiche. Possono servire più tentativi, ma il passaggio da "vulnerabilità teorica" ad "attacco dimostrato" è già avvenuto. Di solito, da qui in avanti, i tempi si accorciano.

Chi è coinvolto e cosa aggiornare

Le versioni corrette di Node.js sono la 22.23.4, la 24.22.1 e la 26.12.1. Lo stesso aggiornamento chiude altre nove falle, tra cui due che permettevano di aggirare il controllo del nome host nei certificati TLS usando indirizzi IP scritti in formati insoliti. Chi è ancora sulla 20.x o su versioni precedenti non riceverà nessuna patch: deve migrare. Il problema tocca anche Bun, le librerie Python Brotli e brotlicffi (usate in automatico da client come Requests, urllib3, httpx e aiohttp), Envoy e Istio. Questi ultimi due sono vulnerabili solo se il decompressore Brotli è attivo. La libreria Brotli originale è stata corretta nelle versioni 1.2.1, 1.1.1 e 1.0.10.

Il mio commento

Il dettaglio che mi colpisce di più non è il bug in sé: i decoder di formati compressi hanno una lunga storia di errori di memoria, non è la prima volta e non sarà l'ultima. Mi colpisce fetch(). Una funzione che usano tutti, che fa una cosa comoda in automatico, e che proprio per questo porta il problema dentro applicazioni dove nessuno ha mai deciso di usare Brotli. Quando faccio un assessment e chiedo "usate Brotli?", la risposta onesta quasi sempre è "non lo sappiamo". E ha senso, perché non dovrebbe essere una domanda da porsi.

L'altra cosa che trovo spesso nelle aziende che seguo è la Node 20, o anche più vecchia, ancora in produzione dentro container costruiti anni fa da un fornitore che non c'è più, o dentro gestionali e appliance di cui nessuno conosce l'interno. Lì aggiornare non è un comando, è un piccolo progetto, e ammetto che non sempre si riesce a farlo in fretta. Casi come questo hanno tutti la stessa radice: la falla sta in un componente che nessuno ha scelto davvero, arrivato insieme a qualcos'altro. Ed è proprio per questo che la sapete gestire solo se sapete che c'è.

Fonte: Red Hot Cyber

La tua azienda è pronta ad affrontare una minaccia come questa?

Richiedi una valutazione gratuita →