Ricevi DeafLetter
Una selezione settimanale di segnali, vulnerabilità e guide. Gli avvisi critici restano facoltativi.
Puoi cancellarti in ogni momento. Privacy policy.
Il 21 ottobre 2026 Node.js ha rilasciato tre patch di sicurezza d'urgenza. La causa non era un bug proprio del runtime JavaScript, ma una vulnerabilità nel decoder di compressione Brotli di Google, CVE-2026-111497, con punteggio CVSS 4.0 di 9.2. La novità più inquietante: il fix nel sorgente Brotli esisteva già dal 27 febbraio 2024, ma non fu mai identificato come correzione di sicurezza né incluso in alcuna release ufficiale. Quel silenzio ha lasciato otto mesi di esposizione su software che bundla la libreria C di Google.
- CVE-2026-111497 è un out-of-bounds write nel file c/dec/decode.c del decoder Brotli, con CVSS 4.0 9.2 (Critical) assegnato da Google come CNA; interessa le versioni 1.0.3-1.2.0.
- Il fix fu committato nel repository upstream il 27 febbraio 2024, ma nessuna release lo includeva fino al 21 ottobre 2026, lasciando vulnerabili Node.js, Bun, Python, Envoy, Istio e altri downstream.
- Imperva ha dimostrato RCE su Node.js 24.22.0 ufficiale per Linux ARM64, ma l'exploit non funziona sempre e non è stato replicato pubblicamente.
- CISA valuta exploitation come "none" e automazione come "no" al 23 ottobre 2026; non risultano attacchi in-the-wild documentati.
Il meccanismo: quando il decoder accetta input malformato
Secondo il record CVE ufficiale, la vulnerabilità consiste in un out-of-bounds write nel file c/dec/decode.c del decoder Brotli. Il decoder gestisce in modo improprio dati compressi specialmente predisposti durante le operazioni di block-processing, trattando una transizione di blocco impossibile come richiesta di ulteriore input. Questo comportamento consente a un attaccante remoto non autenticato di corrompere memoria adiacente, divulgare contenuti sensibili, causare denial of service o potenzialmente eseguire codice arbitrario tramite stream Brotli craftato.
L'attacco richiede che l'applicazione decodifichi dati Brotli controllati dall'avversario. Secondo The Hacker News, che cita OpenAI Codex Security, un server non patchato che accetta input compressi può essere compromesso da un client malevolo, e un client non patchato che accetta input compressi può essere compromesso da un server malevolo.
"an unpatched server that accepts compressed input could be taken over by a malicious client, and an unpatched client that accepts compressed input (such as 'curl --compressed') could be taken over by a malicious server" — OpenAI Codex Security, citato da The Hacker News
L'eco-sistema colpito: oltre Node.js
La natura bundlata di Brotli amplifica la superficie d'attacco. Secondo le fonti tecniche verificate, Bun è affetto nelle versioni fino a 1.4.3 con patch in 1.4.4. I pacchetti Python Brotli e brotlicffi su PyPI, fino alle versioni 1.2.0 e 1.2.0.x, incorporano il decoder vulnerabile; la patch è 1.2.1 per Brotli e 1.2.1.0 per brotlicffi.
Nei service mesh, Envoy Proxy è vulnerabile nelle versioni 1.36.11, 1.37.7, 1.38.5 e 1.39.2, ma solo quando il decompressore Brotli è esplicitamente configurato. Istio segue la stessa logica: le versioni 1.29.0-1.29.8, 1.30.0-1.30.5 e 1.31.0-1.31.1 sono a rischio, con fix in 1.29.9, 1.30.6 e 1.31.2. Anche cdxgen, tool di generazione SBOM, ha rilasciato aggiornamenti per binari standalone e immagini container nelle versioni 13.4.0 e 12.8.8.
La discrepanza tra la correzione sorgente del febbraio 2024 e l'assenza di release ufficiali fino all'ottobre 2026 rappresenta il cuore del problema sistemico. Il fix non fu riconosciuto come patch di sicurezza all'epoca, e nessun meccanismo propagò la correzione attraverso la supply chain come aggiornamento prioritario.
I limiti della dimostrazione RCE
Il team di sicurezza di Imperva, guidato da Ron Masas, ha validato l'exploitabilità concreta su un target specifico. Secondo The Hacker News e Cyber Kendra, entrambe citanti Imperva, la dimostrazione ha ottenuto esecuzione di codice su Node.js 24.22.0 build ufficiale per Linux ARM64, sfruttando sia il path di fetch() che quello di Express body-parser. L'exploit richiede più tentativi per allineare il layout di memoria e, secondo le fonti, non funziona sempre.
Il PoC non è stato rilasciato pubblicamente e non è stato replicato da altri team in modo indipendente. Non emerge alcuna dimostrazione equivalente su Bun, Python, Envoy o Istio: per questi software, il record CVE indica RCE come impatto potenziale, ma non esistono prove pubbliche di esecuzione remota.
CISA ha classificato lo stato di exploitation come "none" e l'automazione come "no" al 23 ottobre 2026. Non risultano attacchi in-the-wild documentati al momento della stesura. Lo stato patch di alcune distribuzioni Linux, inclusa Amazon Linux 2023, risultava ancora pending al 22 ottobre.
I numeri dell'esposizione: stime vendor su campioni specifici
I vendor di sicurezza cloud hanno fornito stime quantitative sulla superficie vulnerabile, da trattare come metriche proprietarie non verificabili indipendentemente. Qualys stima che circa 9 su 10 installazioni Node.js risultino non patchate o su linee di release non più supportate, basando il dato su telemetry anonimizzati. Wiz Research stima che il 91% degli ambienti cloud monitorati abbia risorse vulnerabili a CVE-2026-111497 e che l'82% presenti istanze Node.js pubblicamente esposte verso internet.
Qualys specifica inoltre che, tra le installazioni Node.js totali rilevate, 1.7 milioni sono su versioni End-of-Life e 1.3 milioni su linee supportate non ancora patchate. Questi numeri si riferiscono a installazioni, non a server esposti in senso stretto.
In Python, la vulnerabilità è particolarmente insidiosa perché non richiede import esplicito del modulo Brotli: secondo The Hacker News, la sola presenza dei pacchetti su PyPI attiva decodifica automatica in client HTTP come requests, urllib3, httpx e aiohttp quando il server risponde con Content-Encoding: br.
Cosa fare adesso
- Aggiornare i runtime Node.js alle versioni 22.23.4, 24.22.1 o 26.12.1, rilasciate il 21 ottobre 2026; l'upgrade del runtime è necessario, non sufficiente aggiornare dipendenze applicative npm.
- Per gli stack Python, verificare la presenza dei pacchetti PyPI Brotli ≤1.2.0 o brotlicffi ≤1.2.0.x e aggiornare rispettivamente a 1.2.1 e 1.2.1.0; i container e le immagini serverless richiedono rebuild e restart completo.
- Nei deployment Envoy e Istio, verificare se il decompressore Brotli è configurato e applicare le patch delle versioni indicate; dove non è attivo, la vulnerabilità non è esponibile.
- Per Bun, aggiornare alla versione 1.4.4 o successiva che include Brotli 1.2.1.
- I dependency scanner potrebbero non rilevare i pacchetti Python PyPI perché il CVE record nomina il repository Google, non PyPI; verifica manuale consigliata.
Perché è importante
Il caso CVE-2026-111497 illustra una falla nel processo di disclosure e distribuzione delle correzioni di sicurezza. Un fix tecnicamente corretto, committato nel febbraio 2024, è rimasto invisibile per otto mesi perché non fu etichettato come patch di sicurezza. Nessun downstream ha ricevuto allerta automatica; ogni progetto ha dovendo scoprire autonomamente la rilevanza del commit.
La separazione tra correzione sorgente e release ufficiale ha creato una finestra di esposizione massiccia su un componente che, per la sua funzione di compressione trasparente, viene incluso senza audit di sicurezza dedicato. Il risultato è che milioni di installazioni — secondo le stime vendor su campioni specifici — sono rimaste vulnerabili senza che amministratori o sviluppatori avessero modo di saperlo.
La lezione operativa è chiara: le librerie di compressione e parsing, proprio per la loro invisibilità operativa, richiedono tracciamento esplicito delle correzioni di sicurezza indipendentemente dall'etichettatura iniziale. Finché questo gap non sarà colmato, vulnerabilità simili continueranno a dormire nel codice per mesi, invisibili a scanner e procedure standard.
Fonti
Ricevi DeafLetter
Una selezione settimanale di segnali, vulnerabilità e guide. Gli avvisi critici restano facoltativi.
Puoi cancellarti in ogni momento. Privacy policy.