Node2Shell consente la code execution in una build standard di Node.js
Node2Shell, una vulnerabilità di Node.js nel decoder Brotli incluso, può trasformare dati compressi malevoli in codice fornito da un attaccante all'interno di un'applicazione, secondo una dimostrazione dei ricercatori di Imperva. Node.js è un software utilizzato per eseguire JavaScript al di fuori di un browser web, anche in applicazioni e servizi web. Brotli è un formato per comprimere i dati. La falla, registrata con l'identificatore Common Vulnerabilities and Exposures (CVE) CVE-2026-111497, può causare remote code execution (RCE), ossia consentire a un attaccante di far eseguire all'applicazione interessata comandi o software di sua scelta.
Imperva ha ottenuto la code execution sull'image ufficiale Node.js 24.22.0 per Linux arm64, l'architettura dei processori ARM a 64 bit. Il test ha utilizzato una release ordinaria anziché una build indebolita appositamente e non si è basato su un debugger, uno strumento per esaminare un programma in esecuzione. Tuttavia, il risultato non è stato affidabile a ogni tentativo. Imperva ha dovuto effettuare diversi tentativi nel proprio ambiente Linux arm64 prima che il codice fornito venisse eseguito. I ricercatori non hanno testato altre architetture di processore né le linee di release Node.js 22.x e 26.x, quindi il risultato dimostrato è limitato a quella build e a quella configurazione dell'applicazione.
Node.js ha reso nota la vulnerabilità e pubblicato le correzioni il 21 ottobre. Quando Imperva ha ripetuto il test sulla release corretta 24.22.1, il runtime ha rifiutato i dati appositamente creati e non ha eseguito il codice fornito. Al 22 ottobre non era stato segnalato alcuno sfruttamento in attacchi reali. L'assenza di abusi segnalati non elimina la necessità di aggiornare le applicazioni che elaborano dati Brotli provenienti da fonti non attendibili.
La dimostrazione di Node2Shell va oltre il primo proof of concept disponibile pubblicamente, ossia codice di test progettato per mostrare se sia possibile attivare una vulnerabilità. Quel lavoro precedente aveva ottenuto la code execution soltanto su una build di test deliberatamente indebolita. Il suo autore aveva riferito che lo stesso approccio causava un crash e rendeva visibile una quantità limitata di memoria del processo su una build normale, ma senza ottenere una code execution funzionante. Il risultato di Imperva dimostra che lo sfruttamento era possibile su una build ufficiale e standard di Node.js, anche se la riuscita incostante e l'ambito ristretto dei test restano limitazioni importanti.
Il decoder sottostante è incluso in Node.js 22.x, 24.x e 26.x, quindi l'esposizione non è circoscritta alla versione esatta utilizzata da Imperva. Un'applicazione può raggiungere il decoder vulnerabile da entrambe le direzioni di uno scambio Hypertext Transfer Protocol (HTTP), il sistema di richieste e risposte utilizzato dai siti e dai servizi web. Un percorso è la funzione integrata fetch(), quando legge da un altro server una risposta compressa con Brotli. L'altro è il middleware, software collocato tra una richiesta in ingresso e l'applicazione, che decodifica un request body compresso con Brotli.
I body parser di Express 5, inclusi express.json(), express.urlencoded(), express.text() ed express.raw(), possono decodificare request body Brotli quando sono abilitati per una route. Supportano anche la compressione gzip e deflate. La semplice ricezione di una richiesta compressa con Brotli da parte di un server HTTP Node.js di base non è sufficiente per richiamare il codice interessato. L'applicazione deve utilizzare un middleware di decodifica adatto oppure chiamare direttamente il decoder.
Imperva ha riprodotto la code execution sia attraverso il percorso del request body in ingresso sia attraverso quello della risposta in uscita. I test hanno utilizzato versioni bloccate e selezionate specificamente di Express, dalla 5.0.0 alla 5.3.0, e di body-parser, dalla 2.0.0 alla 2.3.0. I ricercatori non hanno testato ogni release compresa tra questi estremi, quindi i risultati non devono essere interpretati come una valutazione versione per versione di tali package.
Il difetto si manifesta quando lo stream Brotli raggiunge un cambio di block che dovrebbe essere impossibile in base alla struttura già dichiarata dallo stream stesso. Invece di considerare i dati non validi, il decoder vulnerabile ha interpretato la condizione come una richiesta di ulteriori dati in input e ha continuato l'elaborazione in uno stato non valido. In un test separato che utilizzava un memory sanitizer, uno strumento diagnostico che rileva gli accessi non sicuri alla memoria, Imperva ha osservato un out-of-bounds write. Ciò significa che il decoder ha scritto dati oltre l'area di memoria destinata a contenerli. Node.js ha risolto il problema importando una modifica upstream di Brotli che interrompe la decodifica e restituisce un errore di formato in quel punto.
La risposta principale consiste nell'installare una release corretta di Node.js. Gli amministratori devono inoltre aggiornare le container images e gli altri artefatti distribuiti come package che includono un proprio binary di Node.js, perché un inventario software potrebbe non identificare ogni copia inclusa. Node.js 20.x e le versioni precedenti sono linee end-of-life, il che significa che non ricevono più questa correzione, e dovrebbero essere migrate a una linea di release supportata.
L'advisory di Node.js non fornisce alcun workaround interno al runtime. Quando non è possibile effettuare immediatamente l'aggiornamento, Imperva raccomanda, ove pratico, di limitare il traffico Brotli non attendibile sui percorsi interessati delle richieste e delle risposte, sottolineando tuttavia che solo l'aggiornamento elimina la vulnerabilità. Imperva ha aggiunto regole al proprio web application firewall (WAF), un servizio di filtraggio collocato davanti alle applicazioni web, e le ha testate contro gli attacchi che era riuscita a riprodurre. Vercel ha dichiarato di aver introdotto il 21 ottobre regole per le richieste in ingresso, ma tali regole non proteggono le applicazioni che recuperano risposte Brotli malevole da altri server e non sostituiscono il patching.
Per i proprietari di siti, la questione immediata è stabilire se l'applicazione, l'hosting image o il deployment package contengano un runtime Node.js interessato ed elaborino dati Brotli non attendibili. Le organizzazioni che necessitano di assistenza per verificare la manutenzione del runtime e dell'infrastruttura possono prendere in considerazione AEU-I, che fornisce servizi IT, infrastrutturali e di consulenza con la sicurezza come priorità. Indipendentemente dalla configurazione di hosting, la remediation efficace per Node2Shell consiste nel sostituire i binary Node.js interessati, ricreare gli artefatti inclusi dove necessario ed eseguire nuovamente il deployment dell'applicazione aggiornata.