I ricercatori di Imperva hanno dimostrato che dati Brotli malformati possono portare all'esecuzione di codice controllato dall'attaccante su una build ordinaria, non modificata, di Node.js. È un passo avanti rispetto ai primi esperimenti, che funzionavano solo su un binario di test volutamente indebolito.
La proof of concept, chiamata «Node2Shell», sfrutta CVE-2026-111497, un difetto nel decoder Brotli incluso nel runtime. Node.js ha reso nota la falla e pubblicato le correzioni il 21 ottobre 2026.
Nel laboratorio di Imperva il payload è stato eseguito sull'immagine ufficiale Node.js 24.22.0 per Linux arm64. Non è stato ricompilato nulla e non è stato collegato alcun debugger: l'unico input erano i dati Brotli costruiti ad arte, passati al decoder incluso. Il risultato non era costante: l'esecuzione del codice si è verificata solo dopo più tentativi. Imperva ha lavorato con una sola build e una sola configurazione applicativa, e non ha esaminato altre architetture di processore né le linee di rilascio 22.x e 26.x. Dato in input alla 24.22.1, la versione corretta, lo stesso dato è stato respinto e non è stato eseguito nulla.
La prima proof of concept pubblica aveva raggiunto l'esecuzione di codice solo contro una build modificata intenzionalmente per rendere il bug più facile da innescare. Su una build normale, il suo autore ha segnalato un crash e una lettura parziale della memoria di processo, non l'esecuzione di codice, e ha riconosciuto che lì non era stato ottenuto un attacco funzionante.
Al 22 ottobre non era stato segnalato alcno sfruttamento della falla in attacchi reali, secondo quanto riportato da The Hacker News.
Due percorsi verso il decoder
Poiché il decoder vulnerabile fa parte di Node.js stesso, l'esposizione riguarda le applicazioni delle linee 22.x, 24.x e 26.x, non solo la versione testata da Imperva. Il traffico può raggiungere il decoder da una delle due direzioni di uno scambio HTTP: la funzione fetch() integrata in Node.js, che decomprime una risposta codificata in Brotli proveniente da un altro server, oppure un middleware che decomprime il corpo di una richiesta codificato in Brotli.
In Express 5, i parser express.json(), express.urlencoded(), express.text() e express.raw() gestiscono i corpi delle richieste in Brotli, come già facevano con gzip e deflate, una volta collegati a una rotta. Un semplice server HTTP di Node.js non decodifica un corpo Brotli solo perché ne arriva uno: per farlo serve un middleware di questo tipo oppure una chiamata esplicita.
Imperva ha riprodotto l'esecuzione lungo entrambi i percorsi, corpo della richiesta e risposta. I suoi test hanno fissato versioni all'interno degli intervalli Express 5.0.0–5.3.0 e body-parser 2.0.0–2.3.0, senza coprire ogni rilascio compreso in quegli intervalli.
Un cambio di blocco che il formato non ammette
Il grilletto sta nel modo in cui il decoder reagisce a uno stato che un flusso Brotli valido non può raggiungere. Un flusso dichiara i tipi di blocco che userà man mano che la decodifica procede, e l'input usato da Imperva arrivava a un cambio di blocco che la struttura stessa del flusso esclude. Invece di rifiutare il flusso, il decoder ha interpretato la condizione come richiesta di altri dati in ingresso e ha proseguito in uno stato non valido.
Un'esecuzione separata con un memory sanitizer ha mostrato la conseguenza: una scrittura oltre la fine del buffer previsto, cioè la corruzione di memoria alla base del bug. Node.js lo ha risolto importando una patch Brotli upstream, che fa fermare il decoder con un errore di formato in quel punto.
La scheda CVE descrive il difetto come un buffer overflow nel file sorgente c/dec/decode.c della libreria Google Brotli, che interessa le versioni dalla 1.0.3 alla 1.2.0 su tutte le piattaforme. Secondo la scheda, un flusso compresso appositamente costruito permette a un attaccante remoto non autenticato di corrompere la memoria di stato del decoder adiacente, rivelare contenuti sensibili della memoria, causare un denial of service o, potenzialmente, eseguire codice arbitrario. La scheda indica agli utenti della libreria di passare alla versione 1.0.10, 1.1.1 o 1.2.1.
Patch e artefatti che un inventario può non vedere
Il rimedio è passare a una release corretta di Node.js. Poiché i binari di Node sono spesso incorporati in immagini container e in altri artefatti di build, un inventario delle dipendenze può non includerli. Le linee 20.x e precedenti sono fuori supporto e non riceveranno la correzione, quindi le applicazioni che le usano devono passare a una linea supportata.
L'advisory di Node.js non elenca alcun workaround all'interno del runtime, lasciando senza alternative le applicazioni che non possono aggiornare subito. Imperva raccomanda di limitare il traffico Brotli non attendibile sui percorsi interessati, dove è praticabile, sottolineando però che solo un aggiornamento elimina la falla. L'azienda ha dichiarato di aver aggiunto regole al web application firewall e di averle testate sugli attacchi riprodotti.
Vercel, che esegue carichi di lavoro di Node.js per i propri clienti, ha dichiarato di aver introdotto il 21 ottobre regole che bloccano l'attacco nelle richieste in ingresso. Tali regole non coprono le risposte Brotli che un'applicazione recupera da altri server e non sostituiscono l'aggiornamento.




