Forscher von Imperva haben gezeigt, dass fehlerhafte Brotli-Daten dazu führen können, dass vom Angreifer kontrollierter Code auf einem gewöhnlichen, unveränderten Node.js-Build läuft. Damit gehen sie über frühere Experimente hinaus, die nur auf einem absichtlich geschwächten Testbinärprogramm funktionierten.
Der Proof of Concept mit dem Namen „Node2Shell“ nutzt CVE-2026-111497 aus, einen Fehler im Brotli-Decoder, der in der Laufzeitumgebung enthalten ist. Node.js hat die Schwachstelle offengelegt und am 21. Oktober 2026 Korrekturen veröffentlicht.
In Impervas Labor lief die Nutzlast auf dem offiziellen Node.js-24.22.0-Image für Linux arm64. Es wurde nichts neu gebaut, und kein Debugger war angeschlossen. Die einzige Eingabe waren manipulierte Brotli-Daten, die an den mitgelieferten Decoder übergeben wurden. Das Ergebnis war nicht gleichbleibend: Die Codeausführung gelang erst nach mehreren Versuchen. Imperva arbeitete mit einem Build und einer Anwendungskonfiguration und untersuchte weder andere Prozessorarchitekturen noch die Release-Linien 22.x und 26.x. Wurden die Daten an 24.22.1 übergeben, der korrigierten Version, wurden sie abgelehnt, und nichts wurde ausgeführt.
Der erste öffentliche Proof of Concept hatte Codeausführung nur auf einem absichtlich so veränderten Build erreicht, dass sich der Fehler leichter auslösen ließ. Auf einem normalen Build berichtete sein Autor von einem Absturz und einem teilweisen Auslesen des Prozessspeichers statt von Codeausführung. Er räumte ein, dass dort kein funktionierender Angriff gelungen war.
Laut The Hacker News war bis zum 22. Oktober kein Ausnutzen der Schwachstelle in realen Angriffen gemeldet worden.
Zwei Wege zum Decoder
Da der verwundbare Decoder Teil von Node.js selbst ist, sind Anwendungen auf den Linien 22.x, 24.x und 26.x betroffen, nicht nur die von Imperva getestete Version. Datenverkehr kann aus beiden Richtung eines HTTP-Austauschs den Decoder erreichen: über die eingebaute fetch()-Funktion von Node.js, die eine Brotli-kodierte Antwort eines anderen Servers dekomprimiert, oder über Middleware, die einen Brotli-kodierten Anfrage-Body dekomprimiert.
In Express 5 verarbeiten die Parser express.json(), express.urlencoded(), express.text() und express.raw() Brotli-Anfrage-Bodies, sobald sie einer Route zugeordnet sind, wie sie es bereits bei gzip und deflate getan haben. Ein einfacher Node.js-HTTP-Server dekodiert einen Brotli-Body nicht allein deshalb, weil einer eintrifft. Dafür braucht es eine solche Middleware oder einen expliziten Aufruf.
Imperva konnte die Ausführung auf beiden Wegen nachstellen, sowohl über den Anfrage-Body als auch über die Antwort. Seine Tests beschränkten sich auf Versionen innerhalb der Bereiche Express 5.0.0–5.3.0 und body-parser 2.0.0–2.3.0 und deckten nicht jede Version darin ab.
Ein Blockwechsel, den das Format verbietet
Der Auslöser liegt darin, wie der Decoder auf einen Zustand reagiert, den ein gültiger Brotli-Stream nicht erreichen kann. Ein Stream deklariert während der Dekodierung die Blocktypen, die er verwenden wird. Imperva Eingabe erreichte einen Blockwechsel, den die eigene Struktur des Streams ausschloss. Anstatt den Stream abzulehnen, wertete der Decoder den Zustand als Aufforderung, mehr Eingaben zu verarbeiten, und lief in einem ungültigen Zustand weiter.
Ein separater Lauf unter einem Speicher-Sanitizer zeigte die Folge: einen Schreibzugriff über das Ende des vorgesehenen Puffers, also die Speicherbeschädigung, die dem Fehler zugrunde liegt. Node.js hat dies behoben, indem ein Upstream-Patch für Brotli übernommen wurde, der den Decoder an dieser Stelle mit einem Formatfehler anhalten lässt.
Der CVE-Eintrag beschreibt den Fehler als Pufferüberlauf in der Quelldatei c/dec/decode.c des Brotli-Decoders, betroffen sind Google Brotli 1.0.3 bis 1.2.0 auf allen Plattformen. Diesem Eintrag zufolge kann ein manipulierter komprimierter Stream einem nicht authentifizierten Angreifer aus der Ferne erlauben, angrenzenden Speicher des Decoder-Zustands zu beschädigen, sensible Speicherinhalte offenzulegen, einen Denial of Service auszulösen oder möglicherweise beliebigen Code auszuführen. Der Eintrag verweist Nutzer der Bibliothek auf die Versionen 1.0.10, 1.1.1 oder 1.2.1.
Patches und Artefakte, die ein Inventar übersehen können
Abhilfe schafft der Umstieg auf eine gepatchte Node.js-Version. Da Node-Binärdateien häufig fest in Container-Images und andere Build-Artefakte eingebaut sind, kann ein Abhängigkeitsinventar sie übersehen. Die Linie 20.x und ältere Versionen sind End-of-Life und erhalten die Korrektur nicht. Anwendungen auf diesen Versionen müssen deshalb auf eine unterstützte Linie wechseln.
Die Advisory von Node.js nennt keine Workaround-Option innerhalb der Laufzeitumgebung. Anwendungen, die sich nicht sofort aktualisieren lassen, haben damit keinen Ersatzweg. Imperva empfahl, nicht vertrauenswürdigen Brotli-Verkehr auf betroffenen Pfaden dort einzuschränken, wo das praktikabel ist, und betonte zugleich, dass nur ein Update die Schwachstelle beseitigt. Das Unternehmen erklärte, es habe Regeln für Web Application Firewalls ergänzt und sie gegen die nachgestellten Angriffe getestet.
Vercel, das Node.js-Workloads für seine Kunden betreibt, hatte am 21. Oktober Regeln eingeführt, die den Angriff in eingehenden Anfragen blockieren. Diese Regeln erfassen jedoch keine Brotli-Antworten, die eine Anwendung von anderen Servern abruft, und sie ersetzen kein Update.




