Overzicht
CVE-2026-111497 is een kritieke out-of-bounds write kwetsbaarheid in de Google Brotli-decoder (versies 1.0.3 tot en met 1.2.0). De fout maakt het voor aanvallers mogelijk om via speciaal vervaardigde Brotli-streams het geheugen te corrumperen, gevoelige data te lekken of willekeurige code uit te voeren (RCE). De kwetsbaarheid heeft een CVSS v4.0-score van 9.2 (Kritiek).
Getroffen Software
De kwetsbaarheid is breed aanwezig omdat Brotli veelvuldig wordt gebruikt voor HTTP-compressie. Getroffen systemen zijn onder andere:
- Node.js (bekend als "Node2Shell")
- Python (via de pakketten
Brotli en brotlicffi)
- Andere runtime/tools: Bun, Envoy, Istio en diverse HTTP-clients zoals
requests, httpx en aiohttp.
Oplossingen en Mitigatie
Patches:
- Upgraden naar Brotli 1.2.1 of hoger.
- Upgraden van runtimes naar de specifiek genoemde veilige versies (bijv. Node.js 22.23.4+, Bun 1.4.4+).
Tijdelijke maatregelen (workarounds):
- Verwijderen van de
Brotli en brotlicffi pakketten in Python-omgevingen.
- Het weigeren van HTTP-verzoeken met
Content-Encoding: br in de reverse proxy of load balancer.
- Het verwijderen van
br uit de Accept-Encoding header voor uitgaande verzoeken.
Achtergrond
De bug werd al in februari door OpenAI ontdekt en in de broncode hersteld, maar werd destijds niet als beveiligingslek geclassificeerd, waardoor er geen directe security-release volgde tot nu.
Node2Shell evolueert naar HTTP2Shell: Brotli-kwetsbaarheid (CVE-2026-111497) treft diverse bibliotheken en applicaties
Samenvatting (TL;DR)
⚠️ Brotli is een veelgebruikte compressiebibliotheek van Google. Op woensdag 21 oktober maakte NodeJS CVE-2026-111497 bekend, bijgenaamd "node2shell". Hierbij kan een Node.js-proces dat door een aanvaller gecontroleerde Brotli-data decomprimeert, geheugen lekken of willekeurige code uitvoeren. Op donderdag meldde Python dat ook Python-pakketten kwetsbaar zijn voor CVE-2026-111497.
Op vrijdag 23 oktober werd bekend dat deze CVE ook andere grote talen en service-applicaties beïnvloedt die HTTP gebruiken, waarbij patches nog niet volledig beschikbaar zijn.
Controleer of u Brotli decodeert als een dependency binnen uw bibliotheken. Blijf alert voor verdere aankondigingen en wees voorbereid om zo snel mogelijk te upgraden. Als er geen patch beschikbaar is voor een mogelijk getroffen bibliotheek of applicatie, raden we aan om Brotli-decodering uit te schakelen totdat patches beschikbaar zijn.
Updates:
- 16:12 PT: Patches zijn beschikbaar voor libbrotli, Python, C++, NodeJS, bun, Envoy en meer volgen. Apache en Nginx decoderen Brotli standaard niet.
- 16:15 PT: OpenAI meldt dat zij deze kwetsbaarheid al in februari hebben ontdekt. Hoewel de bronoorzaak destijds in de Brotli-broncode was hersteld, was niet bekend dat dit leidde tot een beveiligingslek. Zie de adviezen van OpenAI.
Wat is Brotli?
Brotli is een verliesvrij compressie-algoritme en dataformaat ontwikkeld door Google. Het is een methode om data kleiner te maken voor opslag of verzending over het internet. Software pakt deze data vervolgens uit om de oorspronkelijke informatie te herstellen. Het wordt op grote schaal gebruikt voor HTTP-compressie van webinhoud zoals HTML, CSS en JavaScript.
Wat is CVE-2026-111497?
CVE-2026-111497 is een out-of-bounds write in de Google Brotli-decoder die versies 1.0.3 tot en met 1.2.0 op alle platforms treft. Dit is dezelfde fout in de Brotli-decoder die ten grondslag ligt aan Node2Shell. Een ongeauthenticeerde aanval op afstand kan een speciaal vervaardigde Brotli-gecomprimeerde stream verzenden om het geheugen te corrumperen, gevoelige gegevens te lekken, het proces te laten crashen of potentieel willekeurige code uit te voeren.
De kwetsbaarheid heeft een CVSS v4.0-score van 9.2 (Kritiek). Node.js is getroffen via de meegeleverde Brotli-bibliotheek.
Een bug zorgt ervoor dat de Brotli-decoder meer bytes blijft accepteren terwijl deze de data zou moeten weigeren. Deze bytes kunnen een kleine werkbuffer overstromen en het geheugen van het programma beschadigen. Een aanvaller kan deze schade gebruiken om controle te krijgen over wat er wordt uitgevoerd, zoals hun eigen code.
OpenAI ontdekte dit in februari en rapporteerde het als unauthenticated remote code execution die in beide richtingen werkt: een kwaadaardige client kan een niet-gepatchte server overnemen, en een kwaadaardige server kan een niet-gepatchte client overnemen die gecomprimeerde responses accepteert.
De bronoorzaak werd in februari in de Brotli-broncode hersteld, maar het werd destijds niet herkend als een beveiligingsprobleem en er werd geen release met de fix uitgebracht tot nu. Dit betekent dat elk project dat Brotli bundelt, een eigen update moet uitbrengen.
U bent blootgesteld als er in uw omgeving Brotli 1.2.0 of eerder, of brotlicffi 1.2.0.x is geïnstalleerd, aangezien HTTP-clients zoals requests, httpx en aiohttp deze pakketten automatisch laden als ze aanwezig zijn. Upgrade naar Brotli 1.2.1 of brotlicffi 1.2.1.0 en bouw alle container-images die deze bundelen opnieuw. Per 23 oktober mappen advisory-databases de CVE nog niet naar de PyPI-pakketten, waardoor pip-audit, Dependabot en Safety kwetsbare versies nog niet signaleren.
Niet getroffen software: De standaard mod_brotli van Apache decodeert geen Brotli.
Hoe HTTP2Shell (CVE-2026-111497) te patchen
Update de getroffen runtime of Brotli-bibliotheek:
- Node.js: Upgrade naar 22.23.4, 24.22.1, 26.12.1 of een nieuwere ondersteunde release in de betreffende lijn.
- Native Brotli / libbrotli: Upgrade naar 1.2.1 of later. Voor oudere release-lijnen: gebruik de gepatchte versies 1.0.10 of 1.1.1.
- Python-pakketten: Upgrade Brotli naar 1.2.1 of later en brotlicffi naar 1.2.1.0 of later.
- curl / libcurl: Update de Brotli-dependency naar 1.2.1, een gepatchte oudere release, of het beveiligde pakket van de leverancier. Gebundelde of statisch gelinkte kopieën vereisen een nieuwe build van de applicatie.
- Bun: Upgrade naar 1.4.4 of later. Bouw gecompileerde executables die Bun bundelen opnieuw.
- Envoy: Upgrade naar 1.40.0, 1.39.3, 1.38.6, 1.37.8 of een nieuwere release in een ondersteunde branch. 1.36.12 bevat ook de fix, maar de 1.36-branch wordt niet meer ondersteund.
- Istio: De fix is opgenomen in 1.29.9, 1.30.6 en 1.31.2. Gebruik een nieuwere ondersteunde release; de 1.29-branch is end of life.
- Besturingssysteem-pakketten: Installeer de beveiligingsupdate van de leverancier. Leveranciers kunnen de fix backporten zonder het versienummer van de upstream-bron te wijzigen.
- Overige HTTP-servers, reverse proxies, API-gateways en HTTP-clients: Update de gebruikte runtime of Brotli-bibliotheek. Als Brotli in het product is gebundeld, installeer dan de release van de leverancier die expliciet deze CVE aanpakt. Voor managed services dient de herstelactie te worden bevestigd bij de provider.
Werk daarnaast dependency locks bij, bouw getroffen applicaties en container-images opnieuw, implementeer deze opnieuw en start services opnieuw op. Verifieer dat draaiende workloads de gepatchte componenten gebruiken.
Overzicht gefixte releases (beoordeeld op 23 oktober 2026)
| Project | Patch status | Gefixte versies | Opmerkingen |
| Node.js | Beschikbaar | 22.23.4 · 24.22.1 · 26.12.1 | Gebruik een ondersteunde release-lijn. |
| Bun | Beschikbaar | 1.4.4 | Bevat Brotli 1.2.1. |
| Envoy | Beschikbaar | 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 | 1.36.12 bevat de fix, maar is onondersteund. |
| Istio | Beschikbaar | 1.29.9 · 1.30.6 · 1.31.2 | 1.29 is end of life; stap over naar ondersteunde lijn. |
| Google Brotli (upstream) | Beschikbaar | 1.0.10 · 1.1.1 · 1.2.1 | Kies de gefixte release voor uw bibliotheek-branch. |
Wat te doen als u nog niet kunt upgraden
Deze tijdelijke oplossingen verminderen de blootstelling terwijl u de upgrade voorbereidt:
- Python-applicaties: Indien Brotli-ondersteuning optioneel is, verwijder dan zowel
Brotli als brotlicffi uit de getroffen omgevingen. Verwijder dependency extras zoals httpx[brotli] en andere vereisten die deze opnieuw zouden installeren. Genereer vervolgens nieuwe dependency locks en herstart de workloads. HTTPX, Requests en urllib3 behouden ondersteuning voor gzip en deflate zonder deze optionele pakketten. Let op: een server die toch Brotli verzendt, kan een onleesbare respons of applicatiefout veroorzaken; automatische fallback is niet gegarandeerd.
- Inkomende HTTP-verzoeken: Weiger verzoeken waarvan de
Content-Encoding de waarde br bevat in de reverse proxy, load balancer of applicatie-middleware, voordat een kwetsbare decoder de body verwerkt. Match br ongevoelig voor hoofdlettergebruik.
- Uitgaande HTTP-verzoeken: Verwijder
br uit Accept-Encoding. Schakel daarnaast Brotli-responsdecodering uit of weiger responsen waarvan de Content-Encoding br bevat voordat de decodering begint. Controleer dit vóór de automatische verwerking van de body.
Het alleen wijzigen van Accept-Encoding is onvoldoende: een kwaadaardige server kan een Brotli-respons verzenden ongeacht wat de client aangeeft, en urllib3 selecteert zijn decoder op basis van de Content-Encoding-header in de respons.
Hoe Aikido helpt bij CVE-2026-111497
Aikido signaleert kwetsbare versies van Brotli en brotlicffi in uw repositories, container-images en dependencies, inclusief transitieve dependencies. Uw dashboard toont welke services nog een kwetsbare versie draaien, zodat u prioriteit kunt geven aan het upgraden van services die externe servers aanroepen of gecomprimeerde request-bodies accepteren. Zodra u heeft geüpgraded, controleert Aikido of de bevinding is verdwenen.
Tijdlijn
- Woensdag 22 oktober: NodeJS meldde CVE-2026-111497 ("node2shell"). Een Node.js-proces dat door een aanvaller gecontroleerde Brotli-data decomprimeert, kan geheugen lekken of willekeurige code uitvoeren. Gebruikers zijn blootgesteld als hun app of bibliotheek slechte Brotli-data decomprimeert (bijv. via de ingebouwde
fetch() of body-parser).
- Donderdag 23 oktober: Python bracht een beveiligingsupdate uit voor dezelfde fout. Het bleek dat de fout meer talen en applicaties treft vanwege de brede integratie van de bibliotheek. Tevens kwam naar voren dat OpenAI dit al in februari had ontdekt.
Technische details van CVE-2026-111497
De fout bevindt zich in DecodeBlockTypeAndLength(), die blokwisselingen afhandelt (de punten waar een Brotli-stream verandert welke Huffman-boom hij gebruikt). In kwetsbare versies geeft de functie een simpele boolean terug, waarbij BROTLI_FALSE zowel "deze stream is malformed" als "ik heb meer input nodig" kan betekenen. Oproepende functies kunnen geen onderscheid maken tussen deze twee, en op het fast path negeert de decoder de retourwaarde volledig.
Een speciaal vervaardigde stream kan één bloktype declareren en vervolgens de lengte van dat blok uitputten, wat een wisseling forceert die niet kan slagen. De decoder meldt dan ofwel dat er meer input nodig is voor een stream die al compleet is, of hij gaat verder met decoderen met de blokstatus die hij al had. Die tweede route leidt tot de out-of-bounds write.
De upstream-fix (google/brotli commit 0ed4268) zorgt ervoor dat de functie een foutcode teruggeeft en voegt een nieuwe fout toe: BROTLIDECODERERRORFORMATBLOCK_SWITCH (-17). Decodering stopt nu bij een formaatfout op zowel het veilige als het snelle pad.
Brotli-kwetsbaarheden in Python-bibliotheken (CVE-2026-111497)
De Brotli-fout achter Node2Shell treft ook Python. Twee PyPI-pakketten, Brotli en brotlicffi, compileren dezelfde kwetsbare Brotli-decoder die Node.js bundelt. Brotli heeft 82,8 miljoen downloads per maand.
U bent getroffen als er in uw Python-omgeving Brotli 1.2.0 of eerder, of brotlicffi 1.2.0.x is geïnstalleerd. Populaire HTTP-clients zoals requests en httpx laden deze pakketten automatisch. Sommige pakketten, zoals Scrapy, installeren Brotli automatisch als dependency. Een aanvaller kan de kwetsbare decoder bereiken door een kwaadaardige Brotli-respons te sturen naar een request dat uw app maakt, of door een request-body te sturen die met Brotli is gecomprimeerd. Dit betekent dat een app blootgesteld kan zijn zonder dat Brotli expliciet in de eigen code is geïmporteerd.
Wie is getroffen in Python?
U bent getroffen als een van uw Python-omgevingen een van deze pakketten heeft geïnstalleerd:
| Pakket (PyPI) | Getroffen versies | Gefixte versie |
| Brotli | 1.2.0 en eerder | 1.2.1 |
| brotlicffi | 1.2.0.x | 1.2.1.0 |
Uw code hoeft deze pakketten niet te importeren. De volgende HTTP-clients adverteren Accept-Encoding: br en decoderen Brotli-responsen automatisch:
urllib3 (en dus requests) wanneer Brotli of brotlicffi is geïnstalleerd.
httpx met de brotli extra.
aiohttp wanneer Brotli is geïnstalleerd.
Scrapy en alles wat gebouwd is op de bovenstaande clients.
Aanvalsroutes:
- Uitgaande requests: Uw app haalt een Brotli-respons op van een server die door een aanvaller wordt gecontroleerd (bijv. via een webhook, URL-preview of crawler).
- Inkomende requests: Uw framework of middleware decodeert een request-body verzonden met
Content-Encoding: br.
Hoe CVE-2026-111497 in Python te fixen
- Upgrade het pakket: Gebruik
pip install -U "Brotli>=1.2.1" of pip install -U "brotlicffi>=1.2.1.0". Gebruikers van lockfiles (Poetry, uv, pip-tools) moeten de constraint bijwerken en de lockfile regenereren.
- Rebuild: Bouw container-images en wheels die deze pakketten bundelen opnieuw.
- Controleer omgevingen: Controleer laptops, CI-runners, servers en containers. Kijk naar de volledige opgeloste dependency-tree.
- Handmatige controle: Vertrouw voorlopig op handmatige controles, aangezien
pip-audit, Dependabot en Safety dit mogelijk nog niet rapporteren.
Indien de Python Brotli-bindings afkomstig zijn van een Linux-distributiepakket in plaats van PyPI, komt de fix via uw distributie.
Ernst en Exploitatie in Python
De CVE heeft een CVSS 4.0-score van 9.2. Onderzoek met AddressSanitizer toonde aan dat versie 1.2.0 een speciaal vervaardigde stream bleef accepteren zonder foutmelding, terwijl versie 1.2.1 de stream direct weigerde met fout -17.
Hoewel er tot 22 oktober geen meldingen waren van exploitatie in het wild voor Node.js, moet dit als urgent worden behandeld. Het is een memory-safety fout in een component die onbetrouwbare netwerkinput verwerkt.
Controleren of uw Python-app blootgesteld is
- Controleer versies met
pip show Brotli brotlicffi in elke omgeving en met docker run --rm <image> pip show Brotli brotlicffi voor container-images.
- Zoek uit wat de pakketten importeert via
pipdeptree -r -p Brotli of door lockfiles te doorzoeken op "brotli".
- Inventariseer uitgaande HTTP-calls naar servers die u niet beheert, en endpoints die
Content-Encoding: br request-bodies decoderen.
- Upgrade eerst de services die aan stap 3 voldoen.
FAQ
Welke versies fixen CVE-2026-111497 in Python? Brotli 1.2.1 en brotlicffi 1.2.1.0, inclusief nieuwere releases.
Moet ik Brotli in mijn code importeren om getroffen te zijn? Nee, een geïnstalleerd pakket is voldoende. Clients zoals urllib3, requests, httpx en aiohttp gebruiken Brotli of brotlicffi automatisch als deze aanwezig zijn.
Zullen pip-audit of Dependabot dit signaleren? Nog niet. Per 23 oktober staan de PyPI-pakketten nog niet in de CVE-records of de GitHub Advisory Database.
Is er een workaround? Het verwijderen van Brotli en brotlicffi verwijdert de kwetsbare decoder; HTTP-clients vallen dan terug op gzip en deflate. Het weigeren van Brotli-encoded requests bij de edge vermindert inkomende risico's, maar beschermt niet tegen Brotli-responsen die uw app zelf ophaalt.
Node2Shell evolueert naar HTTP2Shell: Brotli-kwetsbaarheid (CVE-2026-111497) treft diverse bibliotheken en applicaties
Samenvatting (TL;DR)
⚠️ Brotli is een veelgebruikte compressiebibliotheek van Google. Op woensdag 21 oktober maakte NodeJS CVE-2026-111497 bekend, bijgenaamd "node2shell". Hierbij kan een Node.js-proces dat door een aanvaller gecontroleerde Brotli-data decomprimeert, geheugen lekken of willekeurige code uitvoeren. Op donderdag meldde Python dat ook Python-pakketten kwetsbaar zijn voor CVE-2026-111497.
Op vrijdag 23 oktober werd bekend dat deze CVE ook andere grote talen en service-applicaties beïnvloedt die HTTP gebruiken, waarbij patches nog niet volledig beschikbaar zijn.
Controleer of u Brotli decodeert als een dependency binnen uw bibliotheken. Blijf alert voor verdere aankondigingen en wees voorbereid om zo snel mogelijk te upgraden. Als er geen patch beschikbaar is voor een mogelijk getroffen bibliotheek of applicatie, raden we aan om Brotli-decodering uit te schakelen totdat patches beschikbaar zijn.
Updates:
- 16:12 PT: Patches zijn beschikbaar voor libbrotli, Python, C++, NodeJS, bun, Envoy en meer volgen. Apache en Nginx decoderen Brotli standaard niet.
- 16:15 PT: OpenAI meldt dat zij deze kwetsbaarheid al in februari hebben ontdekt. Hoewel de bronoorzaak destijds in de Brotli-broncode was hersteld, was niet bekend dat dit leidde tot een beveiligingslek. Zie de adviezen van OpenAI.
Wat is Brotli?
Brotli is een verliesvrij compressie-algoritme en dataformaat ontwikkeld door Google. Het is een methode om data kleiner te maken voor opslag of verzending over het internet. Software pakt deze data vervolgens uit om de oorspronkelijke informatie te herstellen. Het wordt op grote schaal gebruikt voor HTTP-compressie van webinhoud zoals HTML, CSS en JavaScript.
Wat is CVE-2026-111497?
CVE-2026-111497 is een out-of-bounds write in de Google Brotli-decoder die versies 1.0.3 tot en met 1.2.0 op alle platforms treft. Dit is dezelfde fout in de Brotli-decoder die ten grondslag ligt aan Node2Shell. Een ongeauthenticeerde aanval op afstand kan een speciaal vervaardigde Brotli-gecomprimeerde stream verzenden om het geheugen te corrumperen, gevoelige gegevens te lekken, het proces te laten crashen of potentieel willekeurige code uit te voeren.
De kwetsbaarheid heeft een CVSS v4.0-score van 9.2 (Kritiek). Node.js is getroffen via de meegeleverde Brotli-bibliotheek.
Een bug zorgt ervoor dat de Brotli-decoder meer bytes blijft accepteren terwijl deze de data zou moeten weigeren. Deze bytes kunnen een kleine werkbuffer overstromen en het geheugen van het programma beschadigen. Een aanvaller kan deze schade gebruiken om controle te krijgen over wat er wordt uitgevoerd, zoals hun eigen code.
OpenAI ontdekte dit in februari en rapporteerde het als unauthenticated remote code execution die in beide richtingen werkt: een kwaadaardige client kan een niet-gepatchte server overnemen, en een kwaadaardige server kan een niet-gepatchte client overnemen die gecomprimeerde responses accepteert.
De bronoorzaak werd in februari in de Brotli-broncode hersteld, maar het werd destijds niet herkend als een beveiligingsprobleem en er werd geen release met de fix uitgebracht tot nu. Dit betekent dat elk project dat Brotli bundelt, een eigen update moet uitbrengen.
U bent blootgesteld als er in uw omgeving Brotli 1.2.0 of eerder, of brotlicffi 1.2.0.x is geïnstalleerd, aangezien HTTP-clients zoals requests, httpx en aiohttp deze pakketten automatisch laden als ze aanwezig zijn. Upgrade naar Brotli 1.2.1 of brotlicffi 1.2.1.0 en bouw alle container-images die deze bundelen opnieuw. Per 23 oktober mappen advisory-databases de CVE nog niet naar de PyPI-pakketten, waardoor pip-audit, Dependabot en Safety kwetsbare versies nog niet signaleren.
Niet getroffen software: De standaard mod_brotli van Apache decodeert geen Brotli.
Hoe HTTP2Shell (CVE-2026-111497) te patchen
Update de getroffen runtime of Brotli-bibliotheek:
- Node.js: Upgrade naar 22.23.4, 24.22.1, 26.12.1 of een nieuwere ondersteunde release in de betreffende lijn.
- Native Brotli / libbrotli: Upgrade naar 1.2.1 of later. Voor oudere release-lijnen: gebruik de gepatchte versies 1.0.10 of 1.1.1.
- Python-pakketten: Upgrade Brotli naar 1.2.1 of later en brotlicffi naar 1.2.1.0 of later.
- curl / libcurl: Update de Brotli-dependency naar 1.2.1, een gepatchte oudere release, of het beveiligde pakket van de leverancier. Gebundelde of statisch gelinkte kopieën vereisen een nieuwe build van de applicatie.
- Bun: Upgrade naar 1.4.4 of later. Bouw gecompileerde executables die Bun bundelen opnieuw.
- Envoy: Upgrade naar 1.40.0, 1.39.3, 1.38.6, 1.37.8 of een nieuwere release in een ondersteunde branch. 1.36.12 bevat ook de fix, maar de 1.36-branch wordt niet meer ondersteund.
- Istio: De fix is opgenomen in 1.29.9, 1.30.6 en 1.31.2. Gebruik een nieuwere ondersteunde release; de 1.29-branch is end of life.
- Besturingssysteem-pakketten: Installeer de beveiligingsupdate van de leverancier. Leveranciers kunnen de fix backporten zonder het versienummer van de upstream-bron te wijzigen.
- Overige HTTP-servers, reverse proxies, API-gateways en HTTP-clients: Update de gebruikte runtime of Brotli-bibliotheek. Als Brotli in het product is gebundeld, installeer dan de release van de leverancier die expliciet deze CVE aanpakt. Voor managed services dient de herstelactie te worden bevestigd bij de provider.
Werk daarnaast dependency locks bij, bouw getroffen applicaties en container-images opnieuw, implementeer deze opnieuw en start services opnieuw op. Verifieer dat draaiende workloads de gepatchte componenten gebruiken.
Overzicht gefixte releases (beoordeeld op 23 oktober 2026)
| Project | Patch status | Gefixte versies | Opmerkingen |
| Node.js | Beschikbaar | 22.23.4 · 24.22.1 · 26.12.1 | Gebruik een ondersteunde release-lijn. |
| Bun | Beschikbaar | 1.4.4 | Bevat Brotli 1.2.1. |
| Envoy | Beschikbaar | 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 | 1.36.12 bevat de fix, maar is onondersteund. |
| Istio | Beschikbaar | 1.29.9 · 1.30.6 · 1.31.2 | 1.29 is end of life; stap over naar ondersteunde lijn. |
| Google Brotli (upstream) | Beschikbaar | 1.0.10 · 1.1.1 · 1.2.1 | Kies de gefixte release voor uw bibliotheek-branch. |
Wat te doen als u nog niet kunt upgraden
Deze tijdelijke oplossingen verminderen de blootstelling terwijl u de upgrade voorbereidt:
- Python-applicaties: Indien Brotli-ondersteuning optioneel is, verwijder dan zowel
Brotli als brotlicffi uit de getroffen omgevingen. Verwijder dependency extras zoals httpx[brotli] en andere vereisten die deze opnieuw zouden installeren. Genereer vervolgens nieuwe dependency locks en herstart de workloads. HTTPX, Requests en urllib3 behouden ondersteuning voor gzip en deflate zonder deze optionele pakketten. Let op: een server die toch Brotli verzendt, kan een onleesbare respons of applicatiefout veroorzaken; automatische fallback is niet gegarandeerd.
- Inkomende HTTP-verzoeken: Weiger verzoeken waarvan de
Content-Encoding de waarde br bevat in de reverse proxy, load balancer of applicatie-middleware, voordat een kwetsbare decoder de body verwerkt. Match br ongevoelig voor hoofdlettergebruik.
- Uitgaande HTTP-verzoeken: Verwijder
br uit Accept-Encoding. Schakel daarnaast Brotli-responsdecodering uit of weiger responsen waarvan de Content-Encoding br bevat voordat de decodering begint. Controleer dit vóór de automatische verwerking van de body.
Het alleen wijzigen van Accept-Encoding is onvoldoende: een kwaadaardige server kan een Brotli-respons verzenden ongeacht wat de client aangeeft, en urllib3 selecteert zijn decoder op basis van de Content-Encoding-header in de respons.
Hoe Aikido helpt bij CVE-2026-111497
Aikido signaleert kwetsbare versies van Brotli en brotlicffi in uw repositories, container-images en dependencies, inclusief transitieve dependencies. Uw dashboard toont welke services nog een kwetsbare versie draaien, zodat u prioriteit kunt geven aan het upgraden van services die externe servers aanroepen of gecomprimeerde request-bodies accepteren. Zodra u heeft geüpgraded, controleert Aikido of de bevinding is verdwenen.
Tijdlijn
- Woensdag 22 oktober: NodeJS meldde CVE-2026-111497 ("node2shell"). Een Node.js-proces dat door een aanvaller gecontroleerde Brotli-data decomprimeert, kan geheugen lekken of willekeurige code uitvoeren. Gebruikers zijn blootgesteld als hun app of bibliotheek slechte Brotli-data decomprimeert (bijv. via de ingebouwde
fetch() of body-parser).
- Donderdag 23 oktober: Python bracht een beveiligingsupdate uit voor dezelfde fout. Het bleek dat de fout meer talen en applicaties treft vanwege de brede integratie van de bibliotheek. Tevens kwam naar voren dat OpenAI dit al in februari had ontdekt.
Technische details van CVE-2026-111497
De fout bevindt zich in DecodeBlockTypeAndLength(), die blokwisselingen afhandelt (de punten waar een Brotli-stream verandert welke Huffman-boom hij gebruikt). In kwetsbare versies geeft de functie een simpele boolean terug, waarbij BROTLI_FALSE zowel "deze stream is malformed" als "ik heb meer input nodig" kan betekenen. Oproepende functies kunnen geen onderscheid maken tussen deze twee, en op het fast path negeert de decoder de retourwaarde volledig.
Een speciaal vervaardigde stream kan één bloktype declareren en vervolgens de lengte van dat blok uitputten, wat een wisseling forceert die niet kan slagen. De decoder meldt dan ofwel dat er meer input nodig is voor een stream die al compleet is, of hij gaat verder met decoderen met de blokstatus die hij al had. Die tweede route leidt tot de out-of-bounds write.
De upstream-fix (google/brotli commit 0ed4268) zorgt ervoor dat de functie een foutcode teruggeeft en voegt een nieuwe fout toe: BROTLIDECODERERRORFORMATBLOCK_SWITCH (-17). Decodering stopt nu bij een formaatfout op zowel het veilige als het snelle pad.
Brotli-kwetsbaarheden in Python-bibliotheken (CVE-2026-111497)
De Brotli-fout achter Node2Shell treft ook Python. Twee PyPI-pakketten, Brotli en brotlicffi, compileren dezelfde kwetsbare Brotli-decoder die Node.js bundelt. Brotli heeft 82,8 miljoen downloads per maand.
U bent getroffen als er in uw Python-omgeving Brotli 1.2.0 of eerder, of brotlicffi 1.2.0.x is geïnstalleerd. Populaire HTTP-clients zoals requests en httpx laden deze pakketten automatisch. Sommige pakketten, zoals Scrapy, installeren Brotli automatisch als dependency. Een aanvaller kan de kwetsbare decoder bereiken door een kwaadaardige Brotli-respons te sturen naar een request dat uw app maakt, of door een request-body te sturen die met Brotli is gecomprimeerd. Dit betekent dat een app blootgesteld kan zijn zonder dat Brotli expliciet in de eigen code is geïmporteerd.
Wie is getroffen in Python?
U bent getroffen als een van uw Python-omgevingen een van deze pakketten heeft geïnstalleerd:
| Pakket (PyPI) | Getroffen versies | Gefixte versie |
| Brotli | 1.2.0 en eerder | 1.2.1 |
| brotlicffi | 1.2.0.x | 1.2.1.0 |
Uw code hoeft deze pakketten niet te importeren. De volgende HTTP-clients adverteren Accept-Encoding: br en decoderen Brotli-responsen automatisch:
urllib3 (en dus requests) wanneer Brotli of brotlicffi is geïnstalleerd.
httpx met de brotli extra.
aiohttp wanneer Brotli is geïnstalleerd.
Scrapy en alles wat gebouwd is op de bovenstaande clients.
Aanvalsroutes:
- Uitgaande requests: Uw app haalt een Brotli-respons op van een server die door een aanvaller wordt gecontroleerd (bijv. via een webhook, URL-preview of crawler).
- Inkomende requests: Uw framework of middleware decodeert een request-body verzonden met
Content-Encoding: br.
Hoe CVE-2026-111497 in Python te fixen
- Upgrade het pakket: Gebruik
pip install -U "Brotli>=1.2.1" of pip install -U "brotlicffi>=1.2.1.0". Gebruikers van lockfiles (Poetry, uv, pip-tools) moeten de constraint bijwerken en de lockfile regenereren.
- Rebuild: Bouw container-images en wheels die deze pakketten bundelen opnieuw.
- Controleer omgevingen: Controleer laptops, CI-runners, servers en containers. Kijk naar de volledige opgeloste dependency-tree.
- Handmatige controle: Vertrouw voorlopig op handmatige controles, aangezien
pip-audit, Dependabot en Safety dit mogelijk nog niet rapporteren.
Indien de Python Brotli-bindings afkomstig zijn van een Linux-distributiepakket in plaats van PyPI, komt de fix via uw distributie.
Ernst en Exploitatie in Python
De CVE heeft een CVSS 4.0-score van 9.2. Onderzoek met AddressSanitizer toonde aan dat versie 1.2.0 een speciaal vervaardigde stream bleef accepteren zonder foutmelding, terwijl versie 1.2.1 de stream direct weigerde met fout -17.
Hoewel er tot 22 oktober geen meldingen waren van exploitatie in het wild voor Node.js, moet dit als urgent worden behandeld. Het is een memory-safety fout in een component die onbetrouwbare netwerkinput verwerkt.
Controleren of uw Python-app blootgesteld is
- Controleer versies met
pip show Brotli brotlicffi in elke omgeving en met docker run --rm <image> pip show Brotli brotlicffi voor container-images.
- Zoek uit wat de pakketten importeert via
pipdeptree -r -p Brotli of door lockfiles te doorzoeken op "brotli".
- Inventariseer uitgaande HTTP-calls naar servers die u niet beheert, en endpoints die
Content-Encoding: br request-bodies decoderen.
- Upgrade eerst de services die aan stap 3 voldoen.
FAQ
Welke versies fixen CVE-2026-111497 in Python? Brotli 1.2.1 en brotlicffi 1.2.1.0, inclusief nieuwere releases.
Moet ik Brotli in mijn code importeren om getroffen te zijn? Nee, een geïnstalleerd pakket is voldoende. Clients zoals urllib3, requests, httpx en aiohttp gebruiken Brotli of brotlicffi automatisch als deze aanwezig zijn.
Zullen pip-audit of Dependabot dit signaleren? Nog niet. Per 23 oktober staan de PyPI-pakketten nog niet in de CVE-records of de GitHub Advisory Database.
Is er een workaround? Het verwijderen van Brotli en brotlicffi verwijdert de kwetsbare decoder; HTTP-clients vallen dan terug op gzip en deflate. Het weigeren van Brotli-encoded requests bij de edge vermindert inkomende risico's, maar beschermt niet tegen Brotli-responsen die uw app zelf ophaalt.