2shell · Waldemar Enns

SicherheitshinweisCVE-2026-111497GHSA-9v8h-qqgm-4m35Stand:

Node2Shell / HTTP2Shell: Lücke im Brotli-DecoderCVE-2026-111497, auch Python2Shell und Broccoli2Shell

Präparierte, komprimierte Daten können den Brotli-Decoder von Google über das Ende eines Puffers hinausschreiben lassen. Das trifft Node.js, Bun, Python-Pakete und jede Software, die den C-Decoder in Version 1.0.3 bis 1.2.0 nutzt.

Rückrufhinweis

Brotli-Decoder 1.0.3 bis 1.2.0. Ein Schreibzugriff außerhalb des Puffers kann den Prozess abstürzen lassen, Speicherinhalte preisgeben und möglicherweise fremden Code ausführen. Ein Login braucht der Angreifer dafür nicht.

Betroffene Versionen und Updates
ProduktBetroffenFix inStatus
Google Brotli (C-Bibliothek)Distributionen liefern den Fix teils als Backport mit alter Versionsnummer.1.0.3 bis 1.2.01.0.10 und 1.1.1 nicht betroffen1.0.10, 1.1.1, 1.2.1gepatcht
Node.js 26Support bis 30.04.2029vor 26.12.126.12.1gepatcht
Node.js 24Support bis 30.04.2028vor 24.22.124.22.1gepatcht
Node.js 22Support bis 30.04.2027vor 22.23.422.23.4gepatcht
Node.js 25, 23, 20, 18 und älterDiese Linien bekommen keine Updates mehr. Wechsle auf eine Linie mit Fix.alle Versionen–kein Fix (EOL)
Express 5 / body-parser 2.xVersionsbereiche nur wie von Imperva getestet; Zwischenversionen nicht einzeln geprüft. Quelle: Imperva, 22.10.2026Express 5.0.0 bis 5.3.0, body-parser 2.0.0 bis 2.3.0Den Fehler enthält der Brotli-Decoder in Node.js, nicht Express. Das Node-Update schließt ihn.Node.js 22.23.4, 24.22.1, 26.12.1Fix über Node-Update
BunMit bun build --compile erstellte Programme neu bauen.1.0.21 bis 1.4.31.4.4gepatcht
Python Brotli1.0.3 bis 1.2.01.2.1gepatcht
Python brotlicffi1.0.3 bis 1.2.0.x1.2.1.0gepatcht
PHP-Erweiterung brotli (kjdev/php-ext-brotli)Betrifft brotli_uncompress() mit fremden Daten. Mit --with-libbrotli gebaut gilt der Stand der System-Bibliothek.0.21.0 und master–Fix in Arbeit PR #105 (offen)
Exakte VersionsbereicheDie Tabelle fasst Versionsbereiche zusammen und nennt im Zweifel eine Version zu viel. Maßgeblich sind die exakten Bereiche.
Angezeigter und exakter Bereich laut Quellen
ProduktAngezeigtExakt
Google Brotli (C-Bibliothek)1.0.3 bis 1.2.01.0.3 – 1.2.0 (außer 1.0.10 und 1.1.1)
Express 5 / body-parser 2.xExpress 5.0.0 bis 5.3.0, body-parser 2.0.0 bis 2.3.0Express 5.0.0 – 5.3.0, body-parser 2.0.0 – 2.3.0
Bun1.0.21 bis 1.4.3>= 1.0.21, < 1.4.4
Python Brotli1.0.3 bis 1.2.0>= 1.0.3, < 1.2.1
Python brotlicffi1.0.3 bis 1.2.0.x>= 1.0.3, < 1.2.1.0
PHP-Erweiterung brotli (kjdev/php-ext-brotli)0.21.0 und masterRelease 0.21.0 und master (gebündeltes Brotli 1.2.0)
Pakete der Distributionen (24 Einträge aus Debian, Ubuntu und Alpine)
DistributionPaketBetroffenFix inStatus
Debian 12brotlivor 1.0.9-2+deb12u11.0.9-2+deb12u1gepatcht
Debian 12nodejsalle Versionen–kein Fix gelistet
Debian 13brotlivor 1.1.0-2+deb13u11.1.0-2+deb13u1gepatcht
Debian 13nodejsalle Versionen–kein Fix gelistet
Debian 14brotlialle Versionen–kein Fix gelistet
Debian 14nodejsalle Versionen–kein Fix gelistet
Ubuntu 16.04 LTSbrotlialle Versionen–kein Fix gelistet
Ubuntu 18.04 LTSbrotlialle Versionen–kein Fix gelistet
Ubuntu 20.04 LTSbrotlialle Versionen–kein Fix gelistet
Ubuntu 22.04 LTSbrotlialle Versionen–kein Fix gelistet
Ubuntu 24.04 LTSbrotlialle Versionen–kein Fix gelistet
Ubuntu 24.04 LTSnodejsalle Versionen–kein Fix gelistet
Ubuntu 26.04 LTSbrotlialle Versionen–kein Fix gelistet
Ubuntu 26.04 LTSnodejsalle Versionen–kein Fix gelistet
Ubuntu 26.10brotlialle Versionen–kein Fix gelistet
Ubuntu 26.10nodejsalle Versionen–kein Fix gelistet
Ubuntu Pro:14.04 LTSnodejsalle Versionen–kein Fix gelistet
Ubuntu Pro:16.04 LTSnodejsalle Versionen–kein Fix gelistet
Ubuntu Pro:18.04 LTSnodejsalle Versionen–kein Fix gelistet
Ubuntu Pro:20.04 LTSnodejsalle Versionen–kein Fix gelistet
Ubuntu Pro:22.04 LTSnodejsalle Versionen–kein Fix gelistet
Alpine v3.21brotlivor 1.1.1-r01.1.1-r0gepatcht
Alpine v3.23brotlivor 1.2.1-r01.2.1-r0gepatcht
Alpine v3.24brotlivor 1.2.1-r01.2.1-r0gepatcht

„Kein Fix gelistet“ heißt: Der Tracker nennt noch keine Version mit Fix. Die Node.js-Pakete der Distributionen nutzen oft die System-Bibliothek, dann zählt die brotli-Zeile.

Das Update allein reicht nicht. Ein laufender Prozess behält den alten Decoder, bis du ihn neu startest. Container-Images baust du auf einer gepatchten Basis neu und rollst sie aus.

Wer ist betroffen?

Gefährdet bist du, wenn dein Code oder eine Bibliothek darin Brotli-Daten entpackt, die von außen kommen. Viele HTTP-Clients entpacken Antworten selbstständig, deshalb trifft das mehr Anwendungen als gedacht.

Deine Anwendung ruft URLs ab

fetch() in Node.js und Bun entpackt Antworten mit Content-Encoding: br automatisch.

In Python tun das urllib3 und damit requests sowie aiohttp, sobald Brotli oder brotlicffi installiert ist. httpx nur mit dem Extra httpx[brotli].

Typische Wege: Webhooks, Link-Vorschauen, Crawler, Import per URL.

Deine Anwendung nimmt Request-Bodys an

Express 5.0.0 bis 5.3.0 mit body-parser 2.0.0 bis 2.3.0 entpackt br-Bodys, zum Beispiel hinter express.json().

Express 4 mit body-parser 1.x lehnt br mit 415 ab. Ein reiner node:http-Server entpackt Bodys nicht selbst.

Dein Code ruft den Decoder direkt auf

zlib.brotliDecompress() und createBrotliDecompress() in Node.js, brotli.decompress() in Python, brotli_uncompress() in der PHP-Erweiterung brotli.

Dazu zählen Bibliotheken, die damit Archive, Caches oder Queue-Nachrichten lesen.

Express und body-parser enthalten den Fehler nicht. Sie reichen die Daten nur an den Decoder weiter. Ein Express-Update hilft deshalb nicht, das Node.js-Update schon. Hast du Node.js aus den Paketen deiner Distribution, nutzt es eventuell die System-Bibliothek. Dann kommt der Fix über das Brotli-Paket der Distribution.

Der Fehler im Decoder

Ein Brotli-Datenstrom besteht aus Blöcken, und der Decoder wechselt beim Lesen zwischen Blocktypen. Vor dem Fix meldete die Funktion DecodeBlockTypeAndLength() in c/dec/decode.c nur „ja“ oder „nein“. Ein unmöglicher Blockwechsel sah für den Aufrufer aus wie „brauche mehr Daten“.

Der Decoder hängte darauf weitere Bytes des Angreifers an einen internen Puffer von acht Byte an und schrieb über dessen Ende hinaus. So überschreibt er benachbarten Speicher.

Der Fix (Brotli-Commit 0ed4268) bricht in diesem Fall mit dem Fehler BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH ab. Der CVE-Eintrag nennt CWE-252 und CWE-787. Quellen: Node.js-Hinweis zu CVE-2026-111497, CVE-Eintrag bei OSV.

Versionen prüfen

Prüf überall, wo Code läuft: Produktion, Staging, CI-Runner, Build-Images, Serverless-Funktionen und Laptops. Schick dabei keinen Angriffs-Traffic an Produktivsysteme.

Node.js

node --version
# betroffen unter 22.23.4, 24.22.1, 26.12.1 und auf Linien ohne Support
node -p "process.versions.brotli"
# wer entpackt Request-Bodys?
npm ls express body-parser

Bun

bun --version
# betroffen 1.0.21 bis 1.4.3

Mit bun build --compile gebaute Programme enthalten die alte Runtime, bis du sie neu baust.

Python

pip show Brotli brotlicffi
# wer zieht Brotli nach?
pipdeptree -r -p Brotli
grep -i brotli poetry.lock uv.lock requirements*.txt

pip-audit, Dependabot und Safety haben die PyPI-Pakete anfangs nicht zuverlässig gemeldet. Prüf von Hand.

PHP-Erweiterung brotli

php -m | grep -i brotli
# Details zur geladenen Erweiterung
php --ri brotli

PHP selbst ist von dieser Lücke nicht betroffen, nur die Erweiterung.

System-Bibliothek

dpkg -l | grep -i brotli      # Debian, Ubuntu
rpm -qa | grep -i brotli      # RHEL, Fedora
apk info -v | grep -i brotli  # Alpine

Distributionen liefern den Fix teils als Backport mit alter Versionsnummer. Vergleich mit der Tabelle oben oder dem Sicherheitshinweis deiner Distribution.

Container

docker run --rm --entrypoint node <image> --version
docker run --rm --entrypoint pip <image> show Brotli brotlicffi

Eine Paketliste übersieht leicht die Runtime, die im Image steckt.

Noch ohne Fix

Manche Projekte bringen eine eigene Kopie des Decoders mit. Ein Update deiner Distribution ändert daran nichts. Jedes Projekt muss seine Kopie selbst aktualisieren.

Gebündelte Kopien ohne Release mit Fix
ProjektGebündelte KopieStand
PHP-Erweiterung brotli (kjdev/php-ext-brotli)Betrifft brotli_uncompress() mit fremden Daten. Mit --with-libbrotli gebaut gilt der Stand der System-Bibliothek.0.21.0 und masterFix in Arbeit PR #105 (offen)geprüft 24.10.2026, 22:26 Uhr (MESZ)

Weitere Projekte mit eigener Kopie, darunter .NET, das Ruby-Gem brotli und DuckDB, führt die Liste gebündelter Brotli-Kopien auf broccoli2shell.com.

Updates einspielen

# Node.js, z. B. mit nvm
nvm install 24.22.1   # oder 22.23.4 / 26.12.1
# Dockerfile
FROM node:24.22.1-slim
# Bun
bun upgrade
# Python
pip install -U "Brotli>=1.2.1" "brotlicffi>=1.2.1.0"
# Debian, Ubuntu
sudo apt update && sudo apt upgrade
  • Starte danach jeden Prozess neu, der Brotli lädt.
  • Bau Container-Images neu. Ein auf node:24.22.0 festgelegtes Image bleibt verwundbar, egal wie oft du es neu baust.
  • Heb die Versionen in package-lock.json, poetry.lock, uv.lock oder requirements.txt an. Sonst installiert der nächste Build die alte Version.
  • Zieh von Node.js 18, 20, 23 und 25 auf 22, 24 oder 26 um. Für diese Linien kommt kein Fix.

Wenn du noch nicht updaten kannst

Node.js nennt keinen Workaround. Die folgenden Schritte verkleinern die Angriffsfläche bis zum Update.

  • Python: Deinstalliere Brotli und brotlicffi, wo du Brotli nicht brauchst. urllib3, requests und aiohttp nutzen dann gzip und deflate. Entferne auch Extras wie httpx[brotli], sonst kommt das Paket beim nächsten Install zurück.
  • Eingehende Anfragen: Lehn Request-Bodys mit Content-Encoding: br an Proxy, Load Balancer oder WAF ab. Vercel hat dafür am 21.10.2026 Firewall-Regeln geschaltet.
  • Express 5: express.json({ inflate: false }) schaltet das Entpacken ab. Dann lehnt der Server auch gzip-Bodys ab, teste deine Clients vorher.
  • Bun: fetch(url, { decompress: false }) verhindert das Entpacken, aber nur für diesen einen Aufruf.
  • Ausgehende Abrufe: Eine WAF sieht die Antworten nicht, die dein Code von fremden Servern holt. Diesen Weg schließt nur das Update.

Ausnutzungsstand

CISA KEV
nicht gelistetKatalog 2026.10.23
EPSS (FIRST)
0,71 %Perzentil 53 · Stand 24.10.2026
Angriffe in freier Wildbahn
keine gemeldetStand 24.10.2026 laut Strobes
  • 22.10.2026: Öffentlicher Proof of Concept. Er bringt laut Aikido nur einen absichtlich geschwächten Build dazu, fremden Code auszuführen. Bericht von Aikido
  • 22.10.2026: Imperva führt im Labor Code auf dem offiziellen Node.js 24.22.0 (Linux arm64) aus, nicht bei jedem Versuch. Bericht von Imperva
  • 24.10.2026: Laut Strobes keine bestätigten Angriffe in freier Wildbahn. Bericht von Strobes

Zeitleiste

  1. Der Fix (Commit 0ed4268) landet im Brotli-Quellcode, noch ohne Hinweis auf eine Sicherheitslücke. Quelle
  2. Node.js veröffentlicht 22.23.4, 24.22.1 und 26.12.1. Quelle
  3. Vercel schaltet WAF-Regeln gegen eingehende Angriffe. Quelle
  4. Google veröffentlicht Brotli 1.0.10, 1.1.1 und 1.2.1. Quelle
  5. Für die PHP-Erweiterung brotli geht PR #105 auf, der Brotli auf 1.2.1 hebt. Quelle
  6. Bun veröffentlicht 1.4.4 mit Brotli 1.2.1. Quelle
  7. Ein öffentlicher Proof of Concept erscheint. Quelle
  8. Imperva meldet Codeausführung im Labor auf Node.js 24.22.0. Quelle
  9. CVE-Eintrag bei OSV veröffentlicht. Quelle
  10. Brotli 1.2.1 erscheint auf PyPI. Quelle
  11. CVE-Eintrag bei NVD veröffentlicht. Quelle
  12. GitHub-Advisory GHSA-9v8h-qqgm-4m35 veröffentlicht. Quelle
  13. brotlicffi 1.2.1.0 erscheint auf PyPI. Quelle
  14. Aikido nennt die Lücke HTTP2Shell, weil sie auch Python und andere HTTP-Software trifft. Quelle

Uhrzeiten in deutscher Zeit.

Wer die Arbeit gemacht hat

Ich habe die Lücke weder gefunden noch behoben. Die Arbeit haben andere gemacht:

Gemeldet von · laut Node.js
OpenAI Codex Security (Khai Tran, Sylvie Mayer)
Gemeldet von · laut Imperva
Matteo CollinaAbweichende Angabe von Imperva („Its advisory credits Matteo Collina with reporting it“). Node.js selbst nennt OpenAI Codex Security als Melder.
Fix in Node.js
Matteo Collina, Antoine du Hamel
Exploit-Forschung
Imperva Red Team
Analyse für Python
OpenSourceMalware
Analyse für Python
Aikido

Notfall-Check Node2Shell / HTTP2Shell

Ich prüfe deine Server und spiele die Updates ein.

Ich suche jede Node.js-, Bun- und Python-Installation auf deinem Server, auch in Containern und Images. Dann aktualisiere ich Runtime und Pakete, starte die Prozesse neu und sehe die Logs auf Auffälligkeiten durch. Du bekommst ein schriftliches Kurzprotokoll.

  • In der Regel fertig 48 Stunden nach Erhalt der Zugänge, an Werktagen.
  • Von Freitagabend bis Samstagabend arbeite ich nicht.
  • Finde ich Spuren eines Angriffs, halte ich an und bespreche mit dir das weitere Vorgehen.

Gleicher Umfang und gleiche Preise wie beim PHP-Notfall-Check.

149 € pro Website
299 € pro Server

Server heißt: eigener Server, VPS oder Docker-Host. Ab 3 Systemen 15 % Rabatt je System. Du kennst den Preis, bevor ich anfange. Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.

Notfall-Check buchen

Oder schreib mir an kontakt@waldemarenns.de, um welche Server es geht.

Läuft deine Website mit PHP? Für PHP2Shell gibt es den PHP-Notfall-Check ab 149 €.

Quellen

  1. Node.js · 21.10.2026 · Security Releases21.10.2026
  2. Bun · GHSA-663w-cv8g-jj2p23.10.2026
  3. Bun · 22.10.2026 · Bun v1.4.422.10.2026
  4. kjdev/php-ext-brotli · PR #10522.10.2026
  5. Imperva · 22.10.2026 · Node2Shell: From Brotli Data to Remote Code Execution22.10.2026
  6. Aikido · 22.10.2026 · Node2Shell: Node.js Brotli vulnerability allows remote code execution22.10.2026
  7. Aikido · 23.10.2026 · Node2Shell evolves to HTTP2Shell23.10.2026
  8. OpenSourceMalware · 23.10.2026 · Python Packages Vulnerable to Node2Shell23.10.2026
  9. Strobes · 24.10.2026 · HTTP2Shell (CVE-2026-111497): The Brotli RCE Hitting Node.js, Python and More24.10.2026
  10. Vercel · 21.10.2026 (aktualisiert 24.10.2026) · Node.js security advisory: Brotli decoder RCE (CVE-2026-111497)21.10.2026
  11. broccoli2shell.com · Stand 24.10.2026 · gebündelte Brotli-Kopien24.10.2026
  12. google/brotli · Release v1.2.121.10.2026
  13. google/brotli · Release v1.1.121.10.2026
  14. google/brotli · Release v1.0.1021.10.2026
  15. google/brotli · Commit 0ed4268 · Detect and report invalid stream earlier.27.02.2026
  16. google/brotli · Commit b418fa8 · Detect and report invalid stream earlier.21.10.2026
  17. google/brotli · Commit da98063 · Detect and report invalid stream earlier.21.10.2026
  18. google/brotli · Commit 50a9b70 · Detect and report invalid stream earlier.21.10.2026
  19. PyPI · Brotli 1.2.122.10.2026
  20. PyPI · brotlicffi 1.2.1.022.10.2026
  21. Debian LTS · DLA 4855-1 · brotli security update23.10.2026
  22. oss-security · 23.10.2026 · Nachricht 2523.10.2026
  23. oss-security · 24.10.2026 · Nachricht 624.10.2026
  24. GitHub Advisory GHSA-9v8h-qqgm-4m35
  25. NVD · CVE-2026-11149722.10.2026
  26. PyPA Advisory · PYSEC-2026-4322 (brotli)
  27. PyPA Advisory · PYSEC-2026-4323 (brotlicffi)
  28. PyPI · Brotli
  29. PyPI · brotlicffi
  30. CVE.org · CVE-2026-11149722.10.2026
  31. CVE List V5 · CVE-2026-11149722.10.2026
  32. GitHub · google/brotli
  33. OSV · DEBIAN-CVE-2026-111497
  34. OSV · UBUNTU-CVE-2026-111497
  35. OSV · ALPINE-CVE-2026-111497