Brotli CVE-2026-111497: Node.js, Bun und Python patchen

Brotli CVE-2026-111497: Node.js, Bun und Python patchen

Brotli CVE-2026-111497: Node.js, Bun und Python patchen

CVE-2026-111497 ist ein Speicherfehler im Brotli-Decoder von Google, dem C-Code, der Daten mit Content-Encoding: br entpackt. Manipulierte komprimierte Daten schreiben über das Ende eines Puffers hinaus, was das Programm abstürzen lassen, Speicherinhalte preisgeben oder Code des Angreifers ausführen kann. Node.js, Bun, die Python-Pakete Brotli und brotlicffi sowie Envoy bringen jeweils eine eigene Kopie dieses Decoders mit, daher muss jedes einzeln aktualisiert werden. Diese Anleitung zeigt, wann eine Anwendung tatsächlich betroffen ist, wie Sie einen Server mit einem Befehl prüfen und wie Sie den Fix ausrollen, ohne einen Container zu übersehen.

Wie schwer die Lücke wiegt

  • Google bewertet sie mit 9.2 (critical) nach CVSS 4.0, Node.js mit high, Red Hat mit 8.1.
  • Die Forscher von Imperva haben eigenen Code auf einem ungepatchten Node.js 24.22.0 unter Linux ARM64 ausgeführt, sowohl über eine per fetch abgerufene Antwort als auch über einen Express-Request-Body. Der Exploit ist nicht öffentlich.
  • Die Bewertung der CISA vom 23. Oktober verzeichnet keine Ausnutzung in freier Wildbahn, und es gibt keinen zuverlässigen öffentlichen Proof of Concept.
  • Die Lücke wirkt in beide Richtungen: Ein Server, der komprimierte Eingaben entpackt, kann von einem Client angegriffen werden, und ein Client, der komprimierte Antworten entpackt, von einem Server.

Der Fix wurde am 27. Februar in den Brotli-Quellcode übernommen, doch erst das Brotli-Release vom 21. Oktober enthielt ihn. Deshalb erschienen alle gepatchten Runtimes in derselben Woche.

Sind Sie betroffen?

Gefährdet ist nur Code, der Brotli-Daten dekodiert, die jemand anderes kontrolliert:

  • Node.js und Bun - das eingebaute fetch(), wenn es eine Antwort mit Content-Encoding: br liest, Brotli-Aufrufe aus node:zlib auf nicht vertrauenswürdigen Daten und Body-Parser, die Brotli-Uploads entpacken (Express 5, body-parser 2). Ein einfacher HTTP-Server in Node.js dekodiert Request-Bodys nicht von selbst.
  • Python - es genügt, dass das Paket Brotli oder brotlicffi installiert ist: requests, urllib3, httpx und aiohttp dekodieren Brotli-Antworten dann selbstständig, auch wenn Ihr Code Brotli nie importiert.
  • Envoy und Istio - nur wenn ein Brotli-Dekompressionsfilter konfiguriert ist.

Jeder Dienst, der Drittanbieter-APIs, Webhooks oder Zahlungsanbieter aufruft oder Seiten scrapt, führt fetch() gegen Server aus, die Sie nicht kontrollieren. br aus Accept-Encoding zu entfernen ist kein Fix: Ein Server kann trotzdem Brotli senden.

Software Betroffen Behoben in
Node.js 22.x, 24.x, 26.x vor dem Fix; 20.x und älter (End of Life) 22.23.4, 24.22.1, 26.12.1
Bun 1.4.3 und älter 1.4.4
Python Brotli 1.2.0 und älter 1.2.1
Python brotlicffi 1.2.0.x und älter 1.2.1.0
Google Brotli (C-Bibliothek) 1.0.3 - 1.2.0 1.0.10, 1.1.1, 1.2.1
Envoy 1.39.2, 1.38.5, 1.37.7, 1.36.11 1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12
Istio 1.31.0 - 1.31.1, 1.30.0 - 1.30.5, 1.29.0 - 1.29.8 1.31.2, 1.30.6, 1.29.9

Einen Server mit einem Befehl prüfen

Dieses POSIX-Shell-Skript prüft Bun, Node.js und Python auf dem Rechner (oder in einem Container) und meldet, welche älter als der Fix sind. Speichern Sie es als brotli-check.sh:

#!/bin/sh
# CVE-2026-111497 (Brotli decoder): which runtimes on this host are older than the fixes?
ver_lt() { [ "$1" = "$2" ] && return 1; [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]; }
if command -v bun >/dev/null 2>&1; then
  v=$(bun --version)
  if ver_lt "$v" 1.4.4; then echo "bun $v: VULNERABLE, upgrade to 1.4.4+"; else echo "bun $v: fixed"; fi
fi
if command -v node >/dev/null 2>&1; then
  v=$(node -p "process.versions.bun ? '' : process.versions.node")
  if [ -z "$v" ]; then echo "node: this is Bun's node shim, see the bun line"; else major=${v%%.*}
  case $major in
    22) fix=22.23.4 ;; 24) fix=24.22.1 ;; 26) fix=26.12.1 ;;
    *) fix= ;;
  esac
  if [ -z "$fix" ]; then echo "node $v: no fixed release for this line, move to 22, 24 or 26"
  elif ver_lt "$v" "$fix"; then echo "node $v: VULNERABLE, upgrade to $fix+"
  else echo "node $v: fixed"; fi
  fi
fi
for py in python3 python; do
  command -v $py >/dev/null 2>&1 || continue
  $py - <<'PY'
from importlib import metadata
for pkg, fix in (("Brotli", "1.2.1"), ("brotlicffi", "1.2.1.0")):
    try:
        v = metadata.version(pkg)
    except metadata.PackageNotFoundError:
        print(f"python {pkg}: not installed")
        continue
    a = [int(x) for x in v.split(".") if x.isdigit()]
    b = [int(x) for x in fix.split(".")]
    print(f"python {pkg} {v}: {'VULNERABLE, upgrade to ' + fix + '+' if a < b else 'fixed'}")
PY
  break
done
sh brotli-check.sh
docker exec my-app sh -s < brotli-check.sh   # the same check inside a running container

Ausgabe geprüft am 2026-10-24 (ein Entwickler-Laptop, danach offizielle Docker-Images):

bun 1.4.1: VULNERABLE, upgrade to 1.4.4+
node 26.6.0: VULNERABLE, upgrade to 26.12.1+
python Brotli: not installed
python brotlicffi: not installed
bun 1.4.4: fixed
node: this is Bun's node shim, see the bun line
node 22.23.4: fixed
node 16.20.2: no fixed release for this line, move to 22, 24 or 26
python Brotli 1.1.0: VULNERABLE, upgrade to 1.2.1+
python brotlicffi: not installed

Führen Sie es in jedem Container aus, nicht nur auf dem Host: Das Node.js des Hosts sagt nichts über das aus, das in ein Image eingebaut ist.

So rollen Sie den Fix aus

  1. Jede Kopie finden. Images werden am häufigsten übersehen. Listen Sie auf, was läuft: docker ps --format '{{.Image}}', dann die FROM-Zeilen Ihrer Dockerfiles. Ein Tag wie node:22 oder oven/bun:alpine bewegt sich nur weiter, wenn Sie es pullen; ein fest gepinntes Tag wie oven/bun:1.4.1-slim nie.
  2. Runtime aktualisieren. Gepinnte Tags anheben (oven/bun:1.4.4-slim, node:22.23.4-alpine), auf Hosts bun upgrade und die Node.js-Pakete aktualisieren, in Python-Umgebungen pip install -U "Brotli>=1.2.1" (oder brotlicffi>=1.2.1.0). Braucht eine Python-Anwendung Brotli nicht, schließt auch pip uninstall Brotli brotlicffi den Weg: Die HTTP-Clients weichen dann auf gzip und deflate aus.
  3. Neu bauen und ersetzen. docker compose build --pull && docker compose up -d. Ein laufender Prozess behält den alten Decoder bis zum Neustart, also starten Sie auch die Dienste auf den Hosts neu.
  4. Prüfen. Führen Sie das Prüfskript erneut in jedem Container aus (docker exec <name> bun --version ist die Kurzform). Lockfiles mit --frozen-lockfile können den Rebuild nach einem Dependency-Update scheitern lassen: Committen Sie das aktualisierte Lockfile zusammen mit package.json.
  5. Noch kein Update möglich? Lehnen Sie Requests mit Content-Encoding: br am Proxy ab, bevor irgendetwas den Body dekodiert, und rufen Sie keine Daten von nicht vertrauenswürdigen Hosts ab. Vercel weist darauf hin, dass Firewall-Regeln keine Antworten abdecken, die Ihr eigener Code von anderen Servern abruft - hier hilft nur das Update.

Für einen Node.js-Stack auf einer VM siehe Cloud-Server für Node.js, für Python Cloud-Server für Python und Flask und für Images, die sich sauber neu bauen lassen, Cloud-Server für Docker Swarm.

Was wir getan haben

Innerhalb weniger Tage nach den Fixes haben wir jeden DCXV-Dienst, der auf Bun läuft, auf 1.4.4 umgestellt: Gepinnte Basis-Images bekamen behobene Tags, und alle Images wurden mit frischem Pull neu gebaut. Unsere Node.js-Komponenten dekodieren keine Brotli-Bodys, und unsere Proxys haben keine Brotli-Dekompression. Kundenserver werden von ihren Eigentümern verwaltet: Wenn Sie Node.js, Bun oder Python auf einem DCXV-Cloud-Server betreiben, führen Sie die Prüfung oben noch heute aus, oder fragen Sie uns nach verwalteter Serveradministration.

Quellen (geprüft am 2026-10-24): die Node.js-Sicherheitsreleases vom Oktober 2026 (22.23.4, 24.22.1, 26.12.1), das Release von Bun 1.4.4, die CISA-Bewertung vom 23. Oktober 2026 und die Forschung von Imperva.

PHP2Shell: PHP-RCE-Lücken auf dem Server prüfen und patchen
clouddedicatedhosting

PHP2Shell: PHP-RCE-Lücken auf dem Server prüfen und patchen

PHP2Shell (CVE-2026-109618, CVE-2026-109619) lässt eine nicht authentifizierte Anfrage Code in PHP ausführen. Gefixte Versionen, Prüfskript, php.ini-Notmaßnahmen und Update-Plan.

Brotli CVE-2026-111497: Node.js, Bun und Python patchen
cloudnetworkinginfrastructure

Brotli CVE-2026-111497: Node.js, Bun und Python patchen

Eine Lücke im Brotli-Decoder (CVE-2026-111497) erlaubt Codeausführung über fetch() in Node.js und Bun oder Python-HTTP-Clients. Fixversionen, Prüfskript und Rebuild.

SaaS-Cloud-Server dimensionieren: CPU, RAM, NVMe, Backups
cloudinfrastructurepricing

SaaS-Cloud-Server dimensionieren: CPU, RAM, NVMe, Backups

Cloud-Server für SaaS in Docker und Node.js dimensionieren: Speicherbudget, CPU-Limits, NVMe und Backups, k6-Lasttest, voller Monatspreis und Arbeitsblatt.

KI-Coding-Agenten auf EU-VPS hosten: gehärtetes Setup
aicloudhosting

KI-Coding-Agenten auf EU-VPS hosten: gehärtetes Setup

KI-Coding-Agenten auf einem EU-VPS mit Grenzen betreiben: Wegwerf-Workspaces, Egress-Allowlist, Tokens, Limits, geprüfter Code, ehrliche Restrisiken und Kosten.

IPv4-Geolokalisierung nach Transfer: Schritt für Schritt
ipv4networkingtransfer

IPv4-Geolokalisierung nach Transfer: Schritt für Schritt

Ihr übertragener IPv4-Block zeigt noch das frühere Land? So prüfen Sie WHOIS, BGP und GeoIP, veröffentlichen einen Geofeed und beantragen Korrekturen.