Lücke im Brotli-Decoder lässt bösartige Server Node.js- und Python-Apps übernehmen
Ein Fehler im Brotli-Decoder von Google erlaubt es einem präparierten komprimierten Datenstrom, über das Ende eines Puffers im Speicher hinauszuschreiben. Die Lücke CVE-2026-111497 erhält im GitHub-Advisory 9,2 von 10 Punkten und betrifft Brotli 1.0.3 bis 1.2.0. Brotli komprimiert einen großen Teil des heutigen Webverkehrs, daher reicht das Problem weit über eine Bibliothek hinaus: Node.js, Bun, Envoy, Istio und die Python-Pakete, die requests und aiohttp von sich aus nutzen, bündeln oder laden den anfälligen Code. Die Fixes erschienen zwischen dem 21. und 23. Oktober.
Was schiefläuft
Ein Brotli-Strom ist in Blöcke unterteilt, zwischen deren Typen der Decoder beim Lesen wechselt. Laut dem Node.js-Advisory wurde ein ungültiger Blockwechsel als vorübergehender Bedarf an weiteren Eingabedaten behandelt statt als Formatfehler. Der Decoder hängte daraufhin weiter Bytes des Angreifers an einen acht Byte großen internen Puffer an und schrieb über dessen Ende hinaus. Je nachdem, was überschrieben wird, folgt ein Absturz, ein Abfluss von Prozessspeicher oder Remote Code Execution.
Gemeldet haben die Lücke Khai Tran und Sylvie Mayer von OpenAI Codex Security an Node.js. Google veröffentlichte die korrigierten Brotli-Versionen 1.0.10, 1.1.1 und 1.2.1, Node.js am 21. Oktober die Versionen 22.23.4, 24.22.1 und 26.12.1. Node.js 20 und andere Linien ohne Support bekommen keinen Fix.
Der Angriff funktioniert in beide Richtungen
Der Decoder läuft überall, wo komprimierte Daten ankommen, also kann jede Seite einer Verbindung zum Ziel werden. Ein bösartiger Server kann einen Client angreifen: Das in Node eingebaute fetch() entpackt Brotli-Antworten automatisch, ebenso die Python-Bibliotheken requests, urllib3 und aiohttp, sobald ein Brotli-Paket installiert ist. Die Anwendung muss das Paket dafür nicht importieren. Webhooks, Linkvorschauen, Crawler und „Import per URL“ holen ständig Inhalte von fremden Servern.
In der Gegenrichtung kann ein Client einen Server angreifen, der Request-Bodys entpackt. Express 5.0.0 bis 5.3.0 und body-parser 2.0.0 bis 2.3.0 entpacken Brotli in den Parsern raw() und json(). Das Imperva Red Team führte auf dem offiziellen Node.js-24.22.0-Image eigenen Code über beide Wege aus: über eine abgerufene Antwort und über einen Express-Request-Body. Es brauchte mehrere Versuche, den Exploit hat Imperva nicht veröffentlicht.
Wie weit es reicht
Der Fehler steckt im C-Referenzdecoder von Google, und viele Projekte liefern eine eigene Kopie davon aus. Eine Übersicht auf broccoli2shell.com führt Fixes für Bun 1.4.4, Envoy, Istio, Chromium, Firefox, ngx_brotli sowie die Python-Pakete Brotli 1.2.1 und brotlicffi 1.2.1.0. Ungepatcht waren dort am 24. Oktober noch Kopien in .NET, den Brotli-Erweiterungen für PHP und Ruby, DuckDB, ClickHouse, Apache Arrow, der JPEG-XL-Bibliothek, 7-Zip-Forks und MuPDF.
Die gemeinsame Bibliothek libbrotli patchen Linux-Distributionen separat. Debian etwa hat sie mit Sicherheitsupdates für bookworm und trixie behoben. Am 22. Oktober erschien auf GitHub ein öffentlicher Proof of Concept, der Code aber Berichten zufolge nur auf einem absichtlich geschwächten Build ausführt. Angriffe in freier Wildbahn waren bis dahin nicht bekannt.
Was Sie prüfen sollten
- Browser: Chrome, Edge und Firefox entpacken Brotli auf fast jeder Seite. Installieren Sie das neueste Update und starten Sie den Browser neu.
- Node.js und Bun: Führen Sie node --version aus. Alles unter 22.23.4, 24.22.1 oder 26.12.1 und Linien ohne Support wie 20 brauchen ein Upgrade. Bun muss mindestens 1.4.4 sein.
- Python: Führen Sie pip show Brotli brotlicffi aus. Ist eines davon älter als 1.2.1, aktualisieren oder deinstallieren Sie es, dann weicht requests auf gzip aus.
- Server: Spielen Sie das libbrotli-Update der Distribution ein und starten Sie jeden Dienst neu, der sie lädt. Ein laufender Prozess behält den alten Decoder bis zum Neustart im Speicher.
Der letzte Punkt geht leicht unter. Der Paketmanager kann den Fix nachts installieren, während PHP, Python und andere langlebige Prozesse wochenlang mit der alten Kopie weiterlaufen. Für alle mit eigenem Server ist das nach den NGINX-Lücken schon der zweite „Update und Neustart“-Fall in diesem Monat.