Alle Beiträge

Node.js: randomUUID() in Snapshots und Grenzen des Berechtigungsmodells

Node.js · 3 Min. Lesezeit ·

Beim Node.js-Sicherheitsrelease vom Oktober 2026 schauen die meisten auf die Bugs mit hohem Schweregrad. Zwei der kleineren Fixes lohnen trotzdem einen eigenen Blick, weil sie Annahmen korrigieren, die man ganz nebenbei trifft: dass crypto.randomUUID() jedem Prozess einen anderen Wert liefert, und dass das Berechtigungsmodell eine Mauer ist. Für die meisten Anwendungen ändert keins von beidem etwas. Für zwei bestimmte Gruppen schon.

Wenn „zufällig“ in jedem Prozess gleich ist

CVE-2026-106074, mit mittlerem Schweregrad bewertet und auf den Linien 26, 24 und 22 behoben, betrifft Startup-Snapshots und Single Executable Applications (SEAs). Die Entropie-Caches hinter crypto.randomUUID() und randomInt() wurden in User-Land-Snapshots und SEAs mitgespeichert. Jeder Prozess, der aus demselben Snapshot oder derselben Executable startete, wiederholte also dieselben Werte.

Zum allgemeinen Hintergrund: Ein Snapshot oder eine SEA ist ein Abbild der Anwendung, dessen Zustand einmal erfasst und dann in vielen Prozessen wiederhergestellt wird. Genau das macht den Start schnell. Es heißt aber auch, dass alles, was zum Zeitpunkt der Erfassung zufällig war, von jeder Kopie geteilt wird. Hier hatte die Runtime selbst Zufall zum falschen Zeitpunkt gecacht, und der Fix steckt in der Runtime.

einmal erfasst, beim Build Snapshot oder SEA gecachter Zufall Prozess 1: Wert A Prozess 2: Wert A Prozess 3: Wert A drei Prozesse, ein „zufälliger“ Wert
Einen erfassten Zustand wiederherzustellen ist der Sinn eines Snapshots. Vor dem Fix kam dabei auch der Zufall mit zurück.

Betroffen: wer einen eigenen Startup-Snapshot baut oder eine SEA ausliefert und darin mit diesen Funktionen IDs, Tokens oder Schlüssel erzeugt. Nicht betroffen: eine gewöhnliche App, die mit node server.js läuft, und so laufen die meisten Node-Anwendungen.

Die Lehre überdauert den Fix, als allgemeine Praxis: Leite IDs, Tokens oder Secrets nie aus Werten ab, die beim Build entstanden sind. Erzeuge sie erst, nachdem der Prozess gestartet ist. Wenn du eine SEA oder einen Snapshot auslieferst, geht ein schneller Test so: beim Start einen Wert loggen, die Executable zweimal starten, vergleichen.

// run at startup, start the executable twice, compare the output
console.log('boot id', crypto.randomUUID());

Zwei verschiedene Zeilen heißen: Jeder Prozess hat seinen eigenen Zufall. Zwei identische Zeilen heißen: Die Runtime ist nicht gepatcht, oder irgendetwas wird zu früh erfasst.

Das Berechtigungsmodell ist eine Schicht, nicht die Mauer

Mit dem Berechtigungsmodell von Node.js kann ein Prozess seinen eigenen Zugriff auf Dateisystem, Netzwerk und ähnliche Ressourcen einschränken. Dieses Release behebt darin zwei Umgehungen, beide mit niedrigem Schweregrad: CVE-2026-106073, eine Umgehung über fs.realpathSync auf den Linien 26, 24 und 22, und CVE-2026-106071, eine zu weite Freigabe im Dateisystem durch eine Wildcard-Radix-Suche, nur auf 26. Ein dritter niedriger Fix, CVE-2026-106070, ebenfalls nur auf 26, verhindert, dass ZipFile nach einer fehlgeschlagenen Prüfung des ZIP-Headers vom Angreifer kontrollierte Präfix-Bytes zurückgibt.

Niedrig heißt hier niedrig, und ich will es nicht aufbauschen. Es ist aber eine nützliche Erinnerung im allgemeinen Sinn: Eine Einschränkung innerhalb der Runtime ist eine Verteidigungsschicht. Wer damit Code ausführt, dem er nicht vertraut, sollte die eigentliche Grenze außerhalb von Node ziehen, auf Ebene des Betriebssystems: ein Container, ein eigener Benutzer ohne Rechte, Read-only-Mounts.

unprivilegiertes Benutzerkonto Container, Read-only-Mounts Node.js-Berechtigungsmodell dein Prozess
Hat die innerste Einschränkung eine Lücke, halten die äußeren Schichten trotzdem. Genau dafür gibt es sie.

Betroffen: wer sich darauf verlässt, dass das Berechtigungsmodell nicht vertrauenswürdigen Code einsperrt. Nicht betroffen: Apps, die es nie eingeschaltet haben, und Apps, die es als zusätzliche Absicherung über einer Isolation auf Betriebssystemebene nutzen.

IDs und Secrets erst nach dem Prozessstart erzeugen, nie beim Build, und die Grenze um nicht vertrauenswürdigen Code vom Betriebssystem ziehen lassen, nicht von der Runtime.

Der nächste Schritt ist dasselbe Upgrade wie für den Rest des Releases: 26.12.1, 24.22.1 oder 22.23.4, je nach Linie. Wer eine SEA oder einen Snapshot ausliefert, macht nach dem Upgrade noch einmal den Test mit den zwei Starts. Quelle: nodejs.org, Wednesday, October 21, 2026 Security Releases.

Notizen der Leser

  1. Noch keine Notizen. Die erste ist immer die mutigste.
Baust du etwas Ähnliches? Ich kann helfen. Schreib mir auf WhatsApp