CVE-2021-41117
Unsichere Generierung von Zufallszahlen
- Veröffentlicht
- 11.10.2021
- Aktualisiert
- 04.08.2024
- CNA zuweisen
- GitHub_M
- Beweise beobachtet
- 08.08.2026
Primäres CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:NNiedrig · nächste 30 Tage
- Perzentil
- 87,1 %
- Modelldatum
- 21.09.2026
EPSS ist eine statistische Schätzung, keine Gewissheit oder ein Maß für die Auswirkung. Kombinieren Sie es mit CVSS, KEV-Status, Belichtung und Ihrer Umgebung.
Zusammenfassung
keypair ist ein in JavaScript geschriebener RSA-PEM-Schlüsselgenerator. keypair implementiert viele kryptografische Primitive selbst oder übernimmt sie, wo möglich, aus anderen Bibliotheken, einschließlich node-forge. Es wurde ein Problem entdeckt, bei dem diese Bibliothek identische RSA-Schlüssel erzeugte, die in SSH verwendet werden. Das würde bedeuten, dass die Bibliothek identische P-, Q- (und damit N-) Werte erzeugt, was bei RSA-2048-Schlüsseln praktisch unmöglich ist. Das wiederholte Erzeugen identischer Werte deutet in der Regel auf ein Problem mit einer schlechten Zufallszahlengenerierung oder einer schlechten Verarbeitung der CSPRNG-Ausgabe hin. Problem 1: Schwache Zufallszahlengenerierung (`GHSL-2021-1012`). Die Bibliothek verlässt sich nicht vollständig auf einen von der Plattform bereitgestellten CSPRNG, sondern verwendet stattdessen einen eigenen zählerbasierten CMAC-Ansatz. Der Punkt, an dem es schiefgeht, ist das Seeden der CMAC-Implementierung mit „echten" Zufallsdaten in der Funktion `defaultSeedFile`. Um den AES-CMAC-Generator zu seeden, verwendet die Bibliothek je nach JavaScript-Ausführungsumgebung zwei verschiedene Ansätze. In einem Browser verwendet die Bibliothek [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971). In einer nodeJS-Ausführungsumgebung ist das `window`-Objekt jedoch nicht definiert, sodass sie auf eine weitaus weniger sichere Lösung zurückgreift, die zudem einen Fehler enthält. Es sieht zwar so aus, als ob die Bibliothek versucht, wann immer möglich den CSPRNG von Node zu verwenden; leider scheint das `crypto`-Objekt `null` zu sein, weil eine Variable mit demselben Namen deklariert und auf `null` gesetzt wurde. Daher wird der Node-CSPRNG-Pfad nie genommen. Wenn jedoch `window.crypto.getRandomValues()` nicht verfügbar ist, wird ein Lehmer-LCG-Zufallszahlengenerator verwendet, um den CMAC-Zähler zu seeden, wobei der LCG mit `Math.random` geseedet wird. Das ist zwar schlecht und würde für sich genommen wahrscheinlich als Sicherheitsfehler gelten, erklärt aber nicht die extreme Häufigkeit, mit der doppelte Schlüssel auftreten. Der Hauptfehler: Die Ausgabe des Lehmer-LCG wird falsch kodiert. Die betreffende [Zeile][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008] mit dem Fehler lautet: `b.putByte(String.fromCharCode(next & 0xFF))` Die [Definition](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352) von `putByte` lautet `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`. Vereinfacht ausgedrückt ist dies `String.fromCharCode(String.fromCharCode(next & 0xFF))`. Das doppelte `String.fromCharCode` ist mit ziemlicher Sicherheit unbeabsichtigt und die Ursache für das schwache Seeding. Leider führt dies nicht zu einem Fehler. Vielmehr führt es dazu, dass der größte Teil des Puffers Nullen enthält. Da wir mit 0xFF maskieren, können wir feststellen, dass 97 % der Ausgabe des LCG in Nullen umgewandelt werden. Die einzigen Ausgaben, die zu sinnvollen Werten führen, sind die Ausgaben 48 bis einschließlich 57. Die Auswirkung ist, dass jedes Byte im RNG-Seed aufgrund der falschen Konvertierung eine 97-prozentige Wahrscheinlichkeit hat, 0 zu sein. Wenn dies nicht der Fall ist, sind die Bytes 0 bis 9. Zusammenfassend gibt es drei unmittelbare Probleme: 1. Die Bibliothek hat einen unsicheren Zufallszahlen-Fallback-Pfad. Idealerweise sollte die Bibliothek einen starken CSPRNG voraussetzen, anstatt zu versuchen, einen LCG und `Math.random` zu verwenden. 2. Die Bibliothek verwendet bei Ausführung in NodeJS keinen starken Zufallszahlengenerator korrekt, obwohl ein starker CSPRNG verfügbar ist. 3. Der Fallback-Pfad hat ein Implementierungsproblem, bei dem der Großteil der Seed-Daten effektiv null sein wird. Aufgrund der schlechten Zufallszahlengenerierung erzeugt keypair RSA-Schlüssel, die relativ leicht zu erraten sind. Dies könnte es einem Angreifer ermöglichen, vertrauliche Nachrichten zu entschlüsseln oder sich unbefugten Zugriff auf ein Konto des Opfers zu verschaffen.
Verantwortungsvoller Umgang
Verwenden Sie Schwachstelleninformationen nur auf Systemen, die Sie besitzen oder zu deren Testen Sie berechtigt sind. Kitploit verlinkt auf öffentliche Forschungsmetadaten und speichert keinen Exploit-Code oder bösartige Payloads.