CVE-2026-111497: Sårbarhet i Brotli-dekoderen påvirker Node.js, Bun, Python, .NET og Envoy – dette må du oppdatere nå
En feil i Googles Brotli-dekoder (versjonene 1.0.3 til 1.2.0) gjør det mulig å skrive utenfor buffergrensen med manipulerte data, helt til kodekjøring (CVE-2026-111497, CVSS 9.2). All programvare som dekomprimerer Brotli-data fra eksterne kilder, er berørt: Node.js, Bun, Python med Brotli/brotlicffi, .NET, Envoy og curl. Oppdateringer er tilgjengelige.
Googles Brotli-dekoder inneholder i versjonene 1.0.3 til 1.2.0 en feil som gjør at manipulerte Brotli-data kan overskrive minne utenfor en buffer. Sårbarheten har identifikatoren CVE-2026-111497 og en vurdering på 9.2 etter CVSS 4.0; offentlig er den kjent under navnene Node2Shell og Broccoli2Shell. Mulige konsekvenser er krasj, uthenting av prosessminne eller kjøring av kode. Imperva har påvist kodekjøring på en uendret Node.js 24.22.0. Proof-of-concept-kode er delvis offentlig, men angrep i det fri er foreløpig ikke kjent. Node.js publiserte rettelsene 21. oktober 2026, og de øvrige økosystemene fulgte innen 26. oktober.
Etter meldingen kontrollerte jeg mine egne systemer: Byggerunneren til dette nettstedet kjørte fortsatt Node.js 22.23.1, selv om 22.23.4 hadde vært tilgjengelig i flere dager. Årsaken står i avsnittet om GitHub Actions lenger ned; den gjelder alle selvhostede runnere med actions/setup-node.
Hjelp med inventar og oppdatering
Hvis du trenger hjelp til å finne berørte komponenter i applikasjoner, containerbilder eller CI-pipelines, kan du bruke kontaktskjemaet på adeptio.ch. Jeg tar også kontakt på kort varsel.
Årsak
Feilen ligger i funksjonen DecodeBlockTypeAndLength(). Den håndterer blokkbytter i den komprimerte datastrømmen, altså punktene der dekoderen bytter til en annen Huffman-kode. I de sårbare versjonene returnerer funksjonen bare en sannhetsverdi; BROTLI_FALSE betyr både «datastrøm feil» og «mer inndata nødvendig». En manipulert datastrøm deklarerer én enkelt blokktype og tømmer lengden, slik at et bytte blir tvunget frem, men ikke kan lykkes. Dekoderen behandler dette som manglende inndata, legger flere byte til en intern buffer på 8 byte og skriver dermed forbi slutten av den.
Oppstrømsrettelsen (commit 0ed4268 i repositoryet google/brotli) innfører en egen feilkode BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH og avbryter dekodingen. OpenAI Codex Security rapporterte feilen allerede i februar 2026. Rettelsen kom den gang inn i kildekoden, men ble ikke vurdert som en sikkerhetsrettelse og kom ikke med i noen utgivelse. Først med Brotli 1.2.1 og Node.js-utgivelsene fra 21. oktober 2026 ble den levert.
Når et system er sårbart
Det er ufarlig å komprimere med Brotli; bare den som dekomprimerer Brotli-data fra en ekstern kilde, er sårbar. Det finnes to retninger:
- Klient: Applikasjonen henter en URL og dekoder et svar med
Content-Encoding: br. Den innebygdefetch()i Node.js og Bun gjør dette automatisk og kan ikke slås av. Dermed er crawlere, webhook-mottakere med tilbakekall, lenkeforhåndsvisninger, overvåkingsskript og all automatisering som laster innhold fra tredjepartsservere, berørt. For dette trenger en angriper bare kontroll over én av serverne som hentes. - Server: Et rammeverk eller en middleware pakker ut request-bodies med
Content-Encoding: br. Imperva nevner for Node.jsbody-parser2.0.0 til 2.3.0 og Express 5.0.0 til 5.3.0 med konfigurerte parserejson()ellerraw(). En renhttp-server i Node.js dekoder ikke innkommende bodies selv.
Apache mod_brotli og de utbredte Brotli-modulene for nginx komprimerer bare og er derfor ikke berørt. Envoy og Istio er bare sårbare når Brotli-decompressor-filteret er konfigurert; Istio aktiverer det ikke som standard.
Berørte komponenter og rettede versjoner
| Komponent | Patchede versjoner | Merknad |
|---|---|---|
| libbrotli (Google Brotli) | 1.2.1, 1.1.1, 1.0.10 | 1.0.3 til 1.2.0 er berørt |
| Node.js | 26.12.1, 24.22.1, 22.23.4 | Utgivelse fra 21.10.2026, inneholder flere rettelser (DNS, TLS-navnekontroll) |
| Bun | 1.4.4 | bygg executables opprettet med bun build --compile på nytt |
Python Brotli | 1.2.1 | brukes automatisk av urllib3, requests og aiohttp når den er installert |
Python brotlicffi | 1.2.1.0 | det samme; også som ekstra httpx[brotli] |
| .NET | 8.0.33, 9.0.22, 10.0.14, 11 RC3 | Out-of-band-oppdatering fra 25.10.2026; .NET Framework er ikke berørt, .NET 7 har ingen rettelse |
| Envoy | 1.40.0, 1.39.3, 1.38.6, 1.37.8 | bare med Brotli-decompressor-filter |
| Istio | 1.31.2, 1.30.6, 1.29.9 | bare med Brotli-decompressor i et EnvoyFilter |
| Java brotli4j | 1.24.0 | JNI-wrapperen inkluderer sin egen Brotli-kopi |
| curl/libcurl | Bygg mot Brotli 1.2.1 | bare med --compressed eller CURLOPT_ACCEPT_ENCODING |
Andre bindinger for PHP, Ruby og Go (cgo) avhenger av systemets eller medfølgende libbrotli. Blant Linux-distribusjonene hadde Debian 12 og 13, Alpine og Amazon Linux 2023 patchede pakker 26. oktober; Fedora og Red Hat var delvis patchet, mens rettelsen fortsatt manglet for Ubuntu og SUSE.
Finn berørte versjoner
For Node.js, Python og systembiblioteket holder det med tre spørringer. På Windows gir node -v det samme som på Linux.
node -v
pip show Brotli brotlicffi
pipdeptree -r -p Brotli
På Debian/Ubuntu og Alpine viser pakkebehandlingen versjonen av systembiblioteket:
dpkg -l 'libbrotli*'
apk info -v brotli-libs
Containerbilder må kontrolleres separat: En oppdatert vert hjelper ikke hvis bildet inneholder en gammel Node.js-versjon eller en medfølgende libbrotli. Etter oppdateringen må bilder bygges på nytt og kjørende arbeidslaster startes på nytt; for Bun og brotli4j gjelder dette også applikasjoner som lenker Brotli statisk.
Selvhostede GitHub-runnere: setup-node henter versjonen fra cachen
actions/setup-node med node-version: 22 kontrollerer som standard ikke om det finnes en nyere 22-versjon. Hvis en passende versjon allerede ligger i runnerens verktøycache, brukes den. På GitHub-hostede runnere rulles imaget regelmessig ut på nytt; en selvhostet runner beholder derimot cachen til noen tømmer den. I loggen står det da for eksempel Found in cache @ .../_tool/node/22.23.1/x64.
En ekstra linje i hvert setup-node-trinn løser dette:
- uses: actions/setup-node@v4
with:
node-version: 22
check-latest: true
Alternativt kan minimumsversjonen angis fast (node-version: 22.23.4); da må den oppdateres ved hver sikkerhetsutgivelse. Dette er spesielt relevant for pipelines som henter innhold fra eksterne servere, for eksempel skannere, lenkekontrollere eller feeds: Der kjører fetch() mot servere du ikke kontrollerer, og runneren har vanligvis tilgang til deploy-hemmeligheter.
Når oppdatering ikke er mulig umiddelbart
Tiltakene retter seg mot dekodingen:
- Innkommende: Avvis forespørsler med
Content-Encodingsom inneholderbr, i reverse proxyen eller i middleware. Sammenligningen må ignorere store og små bokstaver og også fange opp lister somgzip, br. - Utgående: Fjern
brfraAccept-Encodingog forkast svar medContent-Encoding: brfør dekoding. Det holder ikke å fjerne det fraAccept-Encoding, fordi en manipulert server likevel kan sende kodingen. Dette er ikke mulig med den innebygdefetch()i Node.js og Bun; der hjelper bare oppdatering. - curl: Utelat
--compressed; beholdCURLOPT_ACCEPT_ENCODINGpåNULLi libcurl. - Python: Avinstaller
Brotliogbrotlicffi, og fjern ekstraer somhttpx[brotli]fra avhengighetene. urllib3, requests og aiohttp faller da tilbake til gzip og deflate. - Envoy/Istio: Fjern Brotli-decompressoren fra konfigurasjonen eller EnvoyFiltrene, og kontroller den aktive konfigurasjonen.
Cloudflare Workers og nettlesere
De som driver applikasjoner som Cloudflare Worker, kjører ingen egen Node.js-prosess; runtime-miljøet workerd driftes og oppdateres av Cloudflare. Cloudflare hadde ikke publisert en uttalelse om CVE-2026-111497 per 26. oktober, og kundene kan ikke endre noe i runtime-miljøet selv. Verktøyene rundt Workeren er imidlertid fortsatt berørt: Byggeskript, wrangler og lokale utviklingsmiljøer kjører på Node.js og bør bruke en patchet versjon. Nettlesere bruker egne Brotli-implementasjoner; produsentenes og sikkerhetsforskernes meldinger nevner dem ikke som berørt.
Tidslinje
| Dato | Hendelse |
|---|---|
| Februar 2026 | OpenAI Codex Security rapporterer feilen, og rettelsen kommer inn i Brotli-kildekoden uten utgivelse |
| 21.10.2026 | Node.js publiserer 26.12.1, 24.22.1 og 22.23.4 |
| 22.10.2026 | Brotli 1.2.1 og brotlicffi 1.2.1.0 på PyPI; analyse fra Imperva med kodekjøring |
| 23.10.2026 | Rettelser for libbrotli, Bun, Envoy og Istio |
| 24.10.2026 | brotli4j 1.24.0, pakker for Amazon Linux 2023 |
| 25.10.2026 | Out-of-band-oppdateringer for .NET |
| 26.10.2026 | Debian og Alpine patchet, Fedora og Red Hat delvis |
Kommentarer
Kommentarene lastes inn fra GitHub / Giscus.