La falla di Brotli colpisce Node.js, Bun, Python e i proxy
La falla di Brotli identificata come CVE-2026-111497 interessa il software che utilizza il decoder di Google per decomprimere il traffico web compresso con Brotli. Dati compressi appositamente predisposti possono scrivere oltre la fine di un memory buffer, causando memory corruption, il che significa che i dati all'interno di un programma in esecuzione possono essere danneggiati o alterati. Il risultato potrebbe essere un arresto anomalo, un memory leak o remote code execution (RCE), situazione in cui un attaccante induce il programma interessato a eseguire il proprio codice.
Brotli è un formato di compressione utilizzato per ridurre le dimensioni delle pagine web e di altro traffico di rete. Il componente vulnerabile è il codice C che decodifica uno stream Brotli. Poiché runtime, proxy e package software includono le proprie copie di quel codice, ogni progetto deve pubblicare il proprio aggiornamento. La falla è stata divulgata il 21 ottobre, quando Google e Node.js hanno distribuito le correzioni, mentre gli aggiornamenti per gli altri prodotti sono arrivati separatamente.
Le versioni dalla 1.0.3 alla 1.2.0 della libreria C Google Brotli sono interessate, mentre le release corrette disponibili sono la 1.0.10, la 1.1.1 e la 1.2.1. Per Node.js, i branch vulnerabili sono 22.x, 24.x e 26.x nelle versioni precedenti alle rispettive correzioni. Le versioni con patch sono 22.23.4, 24.22.1 e 26.12.1. Anche Node.js 20.x e le release precedenti sono interessate, ma hanno raggiunto la fine del ciclo di vita. L'esposizione può verificarsi quando fetch() elabora una risposta contrassegnata con Content-Encoding: br oppure quando Express 5 o body-parser 2 decomprime il body di una richiesta Brotli. Un server HTTP Node.js di base non decomprime autonomamente i body delle richieste in arrivo.
Bun 1.4.3 e le versioni precedenti sono vulnerabili tramite le risposte fetch() e node:zlib; la correzione è inclusa in Bun 1.4.4. Le versioni di Envoy 1.39.2, 1.38.5, 1.37.7 e 1.36.11 sono interessate quando è configurato il relativo decompressor Brotli; le release corrette sono 1.40.0, 1.39.3, 1.38.6, 1.37.8 e 1.36.12. Istio è interessato nelle versioni dalla 1.31.0 alla 1.31.1, dalla 1.30.0 alla 1.30.5 e dalla 1.29.0 alla 1.29.8 quando la decompressione Brotli è abilitata. Le relative correzioni sono le versioni 1.31.2, 1.30.6 e 1.29.9. Se la decompressione è disabilitata in Envoy o Istio, il codice vulnerabile non è raggiungibile.
Python Brotli 1.2.0 e le versioni precedenti sono corretti nella 1.2.1, mentre brotlicffi 1.2.0.x e le versioni precedenti sono corretti nella 1.2.1.0. Le applicazioni possono essere esposte anche senza importare direttamente uno dei due package. Quando è installato un package vulnerabile, gli HTTP client, tra cui requests, urllib3, httpx e aiohttp, possono decodificare automaticamente le risposte Brotli ricevute da un altro server. Anche i binari standalone e le immagini di cdxgen sono interessati nelle versioni 13.4.0 e 12.8.8 e precedenti durante la scansione di input non attendibile; le release corrette sono 13.5.0 e 12.8.9.
Un programma è a rischio solo quando decodifica dati Brotli controllati da altri. Ciò può avvenire quando un client malevolo invia input compresso a un server oppure quando un server malevolo restituisce contenuti compressi a un client. Il team Codex Security di OpenAI, che ha segnalato la falla, ha inoltre indicato i client che utilizzano curl --compressed come esempio della seconda direzione. Un web application firewall (WAF), ossia un filtro che esamina le richieste web, non può necessariamente bloccare questo percorso in uscita. Vercel ha introdotto regole del firewall nella data della divulgazione, ma ha affermato che non proteggono le risposte recuperate dalle funzioni presso altri server.
Il Red Team di Imperva ha dimostrato l'esecuzione di codice controllato da un attaccante su una build non modificata di Node.js 24.22.0 per Linux su ARM64. Il suo lavoro Node2Shell ha trasmesso i dati malevoli sia tramite una risposta recuperata sia tramite il body di una richiesta Express. L'exploit ha richiesto diversi tentativi, non è stato pubblicato e non è stato testato su altre build. L'esecuzione di codice non è stata dimostrata sugli altri prodotti interessati e non sono stati segnalati attacchi in circolazione. Nella sua valutazione del 23 ottobre, la Cybersecurity and Infrastructure Security Agency (CISA) non ha registrato né sfruttamento né automazione, mentre Red Hat ha dichiarato che non era disponibile alcun proof of concept pubblico e affidabile per l'esecuzione di codice.
Le valutazioni della gravità variano. Google ha assegnato un punteggio critico di 9,2 secondo il Common Vulnerability Scoring System (CVSS) 4.0. Node.js ha classificato il problema come di gravità elevata, mentre Red Hat gli ha attribuito un punteggio di 8,1 e lo ha definito importante. La modifica correttiva al codice sorgente era stata aggiunta a Brotli il 27 febbraio, ma all'epoca non era stata riconosciuta come una correzione di sicurezza e non è comparsa in una nuova release di Brotli fino al 21 ottobre.
Gli amministratori devono installare la release corretta appropriata, riavviare i servizi interessati e ricostruire le container images, ovvero copie preconfezionate di un'applicazione e delle relative dipendenze. Un processo che rimane in esecuzione continua a utilizzare il vecchio decoder. Quando non è possibile applicare immediatamente un aggiornamento, OpenAI e Aikido consigliano di rifiutare le richieste contrassegnate con Content-Encoding: br prima che un proxy o un body parser le decomprima, di disabilitare la decodifica Brotli automatica negli HTTP client e di rifiutare le risposte Brotli prima della decodifica. Gli operatori Python possono rimuovere i package Brotli e brotlicffi vulnerabili, in modo che i client ripieghino su gzip o deflate. Rimuovere br da Accept-Encoding non è sufficiente, perché un server può restituire contenuti Brotli indipendentemente dalla richiesta. Non è stato pubblicato alcun workaround per Node.js, quindi la soluzione indicata è un aggiornamento del runtime.
I package dei sistemi operativi possono seguire tempistiche diverse. Debian ha corretto Brotli per Debian 13 (trixie) il 23 ottobre con la versione 1.1.0-2+deb13u1. Al 22 ottobre, Amazon Linux 2023 indicava ancora come in sospeso le correzioni per Brotli e Node.js 24. Anche gli strumenti per le dipendenze potrebbero non rilevare i package Python vulnerabili, perché il record CVE rimanda al repository di Google e l'advisory di GitHub non elenca alcun package interessato, informazione sulla quale si basa Dependabot. PYSEC-2026-4322 e PYSEC-2026-4323 sono stati aggiunti il 23 ottobre per i due package Python, quindi anche le versioni installate devono essere controllate manualmente. Per le organizzazioni che necessitano di assistenza nella verifica di runtime, package e infrastrutture interessati, AEU-I offre servizi IT, infrastrutturali e di consulenza orientati prima di tutto alla sicurezza.