26. oktober 2026 7 min lesetid

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 innebygde fetch() 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.js body-parser 2.0.0 til 2.3.0 og Express 5.0.0 til 5.3.0 med konfigurerte parsere json() eller raw(). En ren http-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

KomponentPatchede versjonerMerknad
libbrotli (Google Brotli)1.2.1, 1.1.1, 1.0.101.0.3 til 1.2.0 er berørt
Node.js26.12.1, 24.22.1, 22.23.4Utgivelse fra 21.10.2026, inneholder flere rettelser (DNS, TLS-navnekontroll)
Bun1.4.4bygg executables opprettet med bun build --compile på nytt
Python Brotli1.2.1brukes automatisk av urllib3, requests og aiohttp når den er installert
Python brotlicffi1.2.1.0det samme; også som ekstra httpx[brotli]
.NET8.0.33, 9.0.22, 10.0.14, 11 RC3Out-of-band-oppdatering fra 25.10.2026; .NET Framework er ikke berørt, .NET 7 har ingen rettelse
Envoy1.40.0, 1.39.3, 1.38.6, 1.37.8bare med Brotli-decompressor-filter
Istio1.31.2, 1.30.6, 1.29.9bare med Brotli-decompressor i et EnvoyFilter
Java brotli4j1.24.0JNI-wrapperen inkluderer sin egen Brotli-kopi
curl/libcurlBygg mot Brotli 1.2.1bare 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
Forklaring av alternativer
AlternativVirkning
node -vviser versjonen av den aktive Node.js-installasjonen
pip show Brotli brotlicffiviser versjon og avhengige pakker for de to Python-pakkene, dersom de er installert
pipdeptreelister avhengighetstreet for de installerte Python-pakkene (må installeres separat)
-rsnur treet: viser hvilke pakker som inkluderer den angitte pakken
-p Brotlibegrenser utdataene til pakken Brotli

På Debian/Ubuntu og Alpine viser pakkebehandlingen versjonen av systembiblioteket:

dpkg -l 'libbrotli*'
apk info -v brotli-libs
Forklaring av alternativer
AlternativVirkning
dpkg -l 'libbrotli*'lister alle installerte pakker med navn som begynner med libbrotli, inkludert versjon
apk info -v brotli-libsviser Alpine-pakken brotli-libs med versjonsnummer

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
Forklaring av alternativer
AlternativVirkning
node-version: 22velger den nyeste tilgjengelige versjonen i 22.x-linjen
check-latest: truespør Node.js-versjonskatalogen ved hver kjøring og laster ned en nyere versjon i stedet for å bruke versjonen fra verktøycachen

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-Encoding som inneholder br, i reverse proxyen eller i middleware. Sammenligningen må ignorere store og små bokstaver og også fange opp lister som gzip, br.
  • Utgående: Fjern br fra Accept-Encoding og forkast svar med Content-Encoding: br før dekoding. Det holder ikke å fjerne det fra Accept-Encoding, fordi en manipulert server likevel kan sende kodingen. Dette er ikke mulig med den innebygde fetch() i Node.js og Bun; der hjelper bare oppdatering.
  • curl: Utelat --compressed; behold CURLOPT_ACCEPT_ENCODING på NULL i libcurl.
  • Python: Avinstaller Brotli og brotlicffi, og fjern ekstraer som httpx[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

DatoHendelse
Februar 2026OpenAI Codex Security rapporterer feilen, og rettelsen kommer inn i Brotli-kildekoden uten utgivelse
21.10.2026Node.js publiserer 26.12.1, 24.22.1 og 22.23.4
22.10.2026Brotli 1.2.1 og brotlicffi 1.2.1.0 på PyPI; analyse fra Imperva med kodekjøring
23.10.2026Rettelser for libbrotli, Bun, Envoy og Istio
24.10.2026brotli4j 1.24.0, pakker for Amazon Linux 2023
25.10.2026Out-of-band-oppdateringer for .NET
26.10.2026Debian og Alpine patchet, Fedora og Red Hat delvis

Kilder

  1. Node.js: October 2026 Security Releases

    offisiell rådgivning med årsak, berørte linjer og rettede versjoner samt ni andre CVE-er i samme utgivelse.

    https://nodejs.org/en/blog/vulnerability/october-2026-security-releases
  2. NVD: CVE-2026-111497

    CVE-oppføring med CVSS-4.0-vurdering på 9.2.

    https://nvd.nist.gov/vuln/detail/cve-2026-111497
  3. Imperva: Node2Shell, from Brotli data to remote code execution

    teknisk analyse med påvist kodekjøring, klient- og serverbane i Node.js, berørte versjoner av Express og body-parser.

    https://www.imperva.com/blog/node2shell-from-brotli-data-to-remote-code-execution/
  4. Aikido: Python packages vulnerable to Node2Shell

    årsak i DecodeBlockTypeAndLength(), rettede versjoner på tvers av alle økosystemer, tidslinje og tiltak; oppdateres løpende.

    https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497
  5. Microsoft .NET Blog: .NET October 2026 out-of-band security updates

    out-of-band-utgivelser for de støttede .NET-versjonene.

    https://devblogs.microsoft.com/dotnet/dotnet-october-2026-oob-security-updates/
  6. Broccoli2Shell

    informasjonsside om sårbarheten under dens andre navn.

    https://broccoli2shell.com/
  7. heise online: Brotli-Decoder-Lücke nicht nur in Node.js, sondern auch in Bun, Python und mehr
  8. actions/setup-node: check-latest

    dokumentasjon av alternativet som kontrollerer verktøycachen mot versjonskatalogen ved hver kjøring.

    https://github.com/actions/setup-node#check-latest-version

Kommentarer

Kommentarene lastes inn fra GitHub / Giscus.