26. Oktober 2026 7 Min. Lesezeit

CVE-2026-111497: Lücke im Brotli-Decoder betrifft Node.js, Bun, Python, .NET und Envoy - was Sie jetzt aktualisieren müssen

Ein Fehler im Brotli-Decoder von Google (Versionen 1.0.3 bis 1.2.0) erlaubt mit präparierten Daten einen Out-of-Bounds Write bis hin zur Codeausführung (CVE-2026-111497, CVSS 9.2). Betroffen ist jede Software, die Brotli-Daten aus fremden Quellen dekomprimiert: Node.js, Bun, Python mit Brotli/brotlicffi, .NET, Envoy, curl. Updates sind verfügbar.

Der Brotli-Decoder von Google enthält in den Versionen 1.0.3 bis 1.2.0 einen Fehler, über den präparierte Brotli-Daten Speicher ausserhalb eines Puffers überschreiben. Die Lücke trägt die Kennung CVE-2026-111497 und eine Bewertung von 9.2 nach CVSS 4.0; in der Öffentlichkeit läuft sie unter den Namen Node2Shell und Broccoli2Shell. Mögliche Folgen sind ein Absturz, das Auslesen von Prozessspeicher oder die Ausführung von Code. Imperva hat Codeausführung auf einem unveränderten Node.js 24.22.0 nachgewiesen. Proof-of-Concept-Code ist teilweise öffentlich, Angriffe in freier Wildbahn sind bisher nicht bekannt. Node.js hat die Fixes am 21. Oktober 2026 veröffentlicht, die übrigen Ökosysteme folgten bis zum 26. Oktober.

Ich habe nach der Meldung die eigenen Systeme geprüft: Der Build-Runner dieser Website lief noch mit Node.js 22.23.1, obwohl 22.23.4 seit Tagen verfügbar war. Der Grund steht im Abschnitt zu GitHub Actions weiter unten; er betrifft jeden selbst gehosteten Runner mit actions/setup-node.

Unterstützung bei Inventar und Update

Wenn Sie Hilfe bei der Suche nach betroffenen Komponenten in Anwendungen, Container-Images oder CI-Pipelines brauchen, nutzen Sie bitte das Kontaktformular auf adeptio.ch. Ich melde mich auch kurzfristig.

Ursache

Der Fehler liegt in der Funktion DecodeBlockTypeAndLength(). Sie verarbeitet Block-Wechsel im komprimierten Datenstrom, also die Stellen, an denen der Decoder auf einen anderen Huffman-Code umschaltet. In den verwundbaren Versionen gibt die Funktion nur einen Wahrheitswert zurück; BROTLI_FALSE bedeutet dabei sowohl “Datenstrom fehlerhaft” als auch “weitere Eingabe nötig”. Ein präparierter Datenstrom deklariert einen einzigen Blocktyp und erschöpft dessen Länge, sodass ein Wechsel erzwungen wird, der nicht gelingen kann. Der Decoder behandelt das als fehlende Eingabe, hängt weitere Bytes an einen internen Puffer von 8 Byte an und schreibt so über dessen Ende hinaus.

Der Upstream-Fix (Commit 0ed4268 im Repository google/brotli) führt einen eigenen Fehlercode BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH ein und bricht die Dekodierung ab. OpenAI Codex Security hat den Fehler bereits im Februar 2026 gemeldet. Der Fix landete damals im Quellcode, wurde aber nicht als Sicherheitskorrektur eingestuft und erschien in keinem Release. Erst mit Brotli 1.2.1 und den Node.js-Releases vom 21. Oktober 2026 ist er ausgeliefert.

Wann ein System angreifbar ist

Brotli zu komprimieren ist ungefährlich; angreifbar ist nur, wer Brotli-Daten aus einer fremden Quelle dekomprimiert. Es gibt zwei Richtungen:

  • Client: Die Anwendung ruft eine URL ab und dekodiert eine Antwort mit Content-Encoding: br. Das eingebaute fetch() von Node.js und Bun tut das automatisch und lässt sich nicht abschalten. Betroffen sind damit Crawler, Webhook-Empfänger mit Rückruf, Link-Vorschauen, Monitoring-Skripte und jede Automatisierung, die Inhalte von Servern Dritter lädt. Ein Angreifer braucht dafür nur die Kontrolle über einen der abgerufenen Server.
  • Server: Ein Framework oder eine Middleware entpackt Request-Bodies mit Content-Encoding: br. Imperva nennt für Node.js body-parser 2.0.0 bis 2.3.0 und Express 5.0.0 bis 5.3.0 mit konfigurierten Parsern json() oder raw(). Ein nackter http-Server von Node.js dekodiert eingehende Bodies nicht selbst.

Apache mod_brotli und die verbreiteten Brotli-Module für nginx komprimieren nur und sind darum nicht betroffen. Envoy und Istio sind nur verwundbar, wenn der Brotli-Decompressor-Filter konfiguriert ist; Istio aktiviert ihn standardmässig nicht.

Betroffene Komponenten und Fixversionen

KomponenteGepatchte VersionenHinweis
libbrotli (Google Brotli)1.2.1, 1.1.1, 1.0.10betroffen sind 1.0.3 bis 1.2.0
Node.js26.12.1, 24.22.1, 22.23.4Release vom 21.10.2026, enthält weitere Fixes (DNS, TLS-Namensprüfung)
Bun1.4.4mit bun build --compile erstellte Executables neu bauen
Python Brotli1.2.1wird von urllib3, requests und aiohttp automatisch genutzt, wenn installiert
Python brotlicffi1.2.1.0ebenso; auch als Extra httpx[brotli]
.NET8.0.33, 9.0.22, 10.0.14, 11 RC3Out-of-Band-Update vom 25.10.2026; .NET Framework nicht betroffen, .NET 7 ohne Fix
Envoy1.40.0, 1.39.3, 1.38.6, 1.37.8nur mit Brotli-Decompressor-Filter
Istio1.31.2, 1.30.6, 1.29.9nur mit Brotli-Decompressor in einem EnvoyFilter
Java brotli4j1.24.0JNI-Wrapper bündelt eigene Brotli-Kopie
curl/libcurlBuild gegen Brotli 1.2.1nur mit --compressed bzw. CURLOPT_ACCEPT_ENCODING

Weitere Bindings für PHP, Ruby und Go (cgo) hängen an der systemweiten oder gebündelten libbrotli. Bei den Linux-Distributionen hatten Debian 12 und 13, Alpine und Amazon Linux 2023 am 26. Oktober gepatchte Pakete; Fedora und Red Hat waren teilweise gepatcht, für Ubuntu und SUSE stand der Fix noch aus.

Betroffene Versionen finden

Für Node.js, Python und die Systembibliothek genügen drei Abfragen. Auf Windows liefert node -v dasselbe wie auf Linux.

node -v
pip show Brotli brotlicffi
pipdeptree -r -p Brotli
Optionen erklärt
OptionWirkung
node -vgibt die Version der aktiven Node.js-Installation aus
pip show Brotli brotlicffizeigt Version und Abhängige der beiden Python-Pakete, sofern installiert
pipdeptreelistet den Abhängigkeitsbaum der installierten Python-Pakete (separat zu installieren)
-rkehrt den Baum um: zeigt, welche Pakete das genannte Paket einbinden
-p Brotlibeschränkt die Ausgabe auf das Paket Brotli

Auf Debian/Ubuntu und Alpine zeigt die Paketverwaltung die Version der Systembibliothek:

dpkg -l 'libbrotli*'
apk info -v brotli-libs
Optionen erklärt
OptionWirkung
dpkg -l 'libbrotli*'listet alle installierten Pakete, deren Name mit libbrotli beginnt, mit Version
apk info -v brotli-libszeigt das Alpine-Paket brotli-libs mit Versionsnummer

Container-Images sind separat zu prüfen: Ein aktualisierter Host nützt nichts, wenn das Image eine alte Node.js-Version oder eine gebündelte libbrotli enthält. Nach dem Update müssen Images neu gebaut und laufende Workloads neu gestartet werden; bei Bun und brotli4j gilt das auch für Anwendungen, die Brotli statisch einbinden.

Selbst gehostete GitHub-Runner: setup-node nimmt die Version aus dem Cache

actions/setup-node mit node-version: 22 prüft standardmässig nicht, ob es eine neuere 22er-Version gibt. Liegt im Tool-Cache des Runners bereits eine passende Version, wird diese verwendet. Auf GitHub-gehosteten Runnern wird das Image regelmässig neu ausgerollt; ein selbst gehosteter Runner behält seinen Cache dagegen, bis jemand ihn leert. Im Log steht dann zum Beispiel Found in cache @ .../_tool/node/22.23.1/x64.

Abhilfe schafft eine zusätzliche Zeile in jedem setup-node-Schritt:

- uses: actions/setup-node@v4
  with:
    node-version: 22
    check-latest: true
Optionen erklärt
OptionWirkung
node-version: 22wählt die neueste verfügbare Version der Linie 22.x
check-latest: truefragt bei jedem Lauf das Versionsverzeichnis von Node.js ab und lädt eine neuere Version herunter, statt die Version aus dem Tool-Cache zu verwenden

Alternativ lässt sich die Mindestversion fest eintragen (node-version: 22.23.4); das muss dann bei jedem Sicherheitsrelease nachgeführt werden. Relevant ist das besonders für Pipelines, die Inhalte von fremden Servern abrufen, etwa Scanner, Link-Prüfer oder Feeds: Dort läuft fetch() gegen Server, die Sie nicht kontrollieren, und der Runner hat in der Regel Zugriff auf Deploy-Secrets.

Wenn sofort kein Update möglich ist

Die Mitigationen setzen an der Dekodierung an:

  • Eingehend: Requests mit Content-Encoding, das br enthält, am Reverse Proxy oder in der Middleware ablehnen. Der Vergleich muss Gross-/Kleinschreibung ignorieren und auch Listen wie gzip, br erfassen.
  • Ausgehend: br aus Accept-Encoding entfernen und Antworten mit Content-Encoding: br vor der Dekodierung verwerfen. Das Entfernen aus Accept-Encoding allein reicht nicht, weil ein präparierter Server die Kodierung trotzdem senden kann. Beim eingebauten fetch() von Node.js und Bun ist das nicht möglich; dort hilft nur das Update.
  • curl: --compressed weglassen; in libcurl CURLOPT_ACCEPT_ENCODING auf NULL belassen.
  • Python: Brotli und brotlicffi deinstallieren und Extras wie httpx[brotli] aus den Abhängigkeiten entfernen. urllib3, requests und aiohttp fallen dann auf gzip und deflate zurück.
  • Envoy/Istio: den Brotli-Decompressor aus der Konfiguration bzw. den EnvoyFiltern entfernen und die laufende Konfiguration kontrollieren.

Cloudflare Workers und Browser

Wer Anwendungen als Cloudflare Worker betreibt, führt keinen eigenen Node.js-Prozess aus; die Runtime workerd wird von Cloudflare betrieben und aktualisiert. Eine Stellungnahme von Cloudflare zu CVE-2026-111497 lag am 26. Oktober nicht vor, Kunden können an der Runtime selbst nichts ändern. Betroffen bleiben jedoch die Werkzeuge rund um den Worker: Build-Skripte, wrangler und lokale Entwicklungsumgebungen laufen auf Node.js und sollten mit einer gepatchten Version laufen. Browser verwenden eigene Brotli-Implementierungen; in den Meldungen der Hersteller und der Sicherheitsforscher werden sie nicht als betroffen genannt.

Zeitachse

DatumEreignis
Februar 2026OpenAI Codex Security meldet den Fehler, der Fix landet ohne Release im Brotli-Quellcode
21.10.2026Node.js veröffentlicht 26.12.1, 24.22.1 und 22.23.4
22.10.2026Brotli 1.2.1 und brotlicffi 1.2.1.0 auf PyPI; Analyse von Imperva mit Codeausführung
23.10.2026Fixes für libbrotli, Bun, Envoy und Istio
24.10.2026brotli4j 1.24.0, Pakete für Amazon Linux 2023
25.10.2026Out-of-Band-Updates für .NET
26.10.2026Debian und Alpine gepatcht, Fedora und Red Hat teilweise

Quellen

  1. Node.js: October 2026 Security Releases

    offizielles Advisory mit Ursache, betroffenen Linien und Fixversionen sowie neun weiteren CVEs desselben Releases.

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

    CVE-Eintrag mit CVSS-4.0-Bewertung 9.2.

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

    technische Analyse mit Nachweis der Codeausführung, Client- und Serverpfad in Node.js, betroffene Versionen von Express und body-parser.

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

    Ursache in DecodeBlockTypeAndLength(), Fixversionen über alle Ökosysteme, Zeitachse und Mitigationen; laufend nachgeführt.

    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-Releases für die unterstützten .NET-Versionen.

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

    Informationsseite zur Lücke unter ihrem zweiten Namen.

    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

    Dokumentation der Option, die den Tool-Cache bei jedem Lauf gegen das Versionsverzeichnis prüft.

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

Kommentare

Die Kommentare werden von GitHub / Giscus geladen.