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 eingebautefetch()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.jsbody-parser2.0.0 bis 2.3.0 und Express 5.0.0 bis 5.3.0 mit konfigurierten Parsernjson()oderraw(). Ein nackterhttp-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
| Komponente | Gepatchte Versionen | Hinweis |
|---|---|---|
| libbrotli (Google Brotli) | 1.2.1, 1.1.1, 1.0.10 | betroffen sind 1.0.3 bis 1.2.0 |
| Node.js | 26.12.1, 24.22.1, 22.23.4 | Release vom 21.10.2026, enthält weitere Fixes (DNS, TLS-Namensprüfung) |
| Bun | 1.4.4 | mit bun build --compile erstellte Executables neu bauen |
Python Brotli | 1.2.1 | wird von urllib3, requests und aiohttp automatisch genutzt, wenn installiert |
Python brotlicffi | 1.2.1.0 | ebenso; auch als Extra httpx[brotli] |
| .NET | 8.0.33, 9.0.22, 10.0.14, 11 RC3 | Out-of-Band-Update vom 25.10.2026; .NET Framework nicht betroffen, .NET 7 ohne Fix |
| Envoy | 1.40.0, 1.39.3, 1.38.6, 1.37.8 | nur mit Brotli-Decompressor-Filter |
| Istio | 1.31.2, 1.30.6, 1.29.9 | nur mit Brotli-Decompressor in einem EnvoyFilter |
| Java brotli4j | 1.24.0 | JNI-Wrapper bündelt eigene Brotli-Kopie |
| curl/libcurl | Build gegen Brotli 1.2.1 | nur 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
Auf Debian/Ubuntu und Alpine zeigt die Paketverwaltung die Version der Systembibliothek:
dpkg -l 'libbrotli*'
apk info -v brotli-libs
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
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, dasbrenthält, am Reverse Proxy oder in der Middleware ablehnen. Der Vergleich muss Gross-/Kleinschreibung ignorieren und auch Listen wiegzip, brerfassen. - Ausgehend:
brausAccept-Encodingentfernen und Antworten mitContent-Encoding: brvor der Dekodierung verwerfen. Das Entfernen ausAccept-Encodingallein reicht nicht, weil ein präparierter Server die Kodierung trotzdem senden kann. Beim eingebautenfetch()von Node.js und Bun ist das nicht möglich; dort hilft nur das Update. - curl:
--compressedweglassen; in libcurlCURLOPT_ACCEPT_ENCODINGaufNULLbelassen. - Python:
Brotliundbrotlicffideinstallieren und Extras wiehttpx[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
| Datum | Ereignis |
|---|---|
| Februar 2026 | OpenAI Codex Security meldet den Fehler, der Fix landet ohne Release im Brotli-Quellcode |
| 21.10.2026 | Node.js veröffentlicht 26.12.1, 24.22.1 und 22.23.4 |
| 22.10.2026 | Brotli 1.2.1 und brotlicffi 1.2.1.0 auf PyPI; Analyse von Imperva mit Codeausführung |
| 23.10.2026 | Fixes für libbrotli, Bun, Envoy und Istio |
| 24.10.2026 | brotli4j 1.24.0, Pakete für Amazon Linux 2023 |
| 25.10.2026 | Out-of-Band-Updates für .NET |
| 26.10.2026 | Debian und Alpine gepatcht, Fedora und Red Hat teilweise |
Kommentare
Die Kommentare werden von GitHub / Giscus geladen.