Die häufig verwendeten sicheren RNGs wie Linux / dev / random, ChaCha20 oder RdRand funktionieren in vielen herkömmlichen Fällen gut. Sie sind jedoch alles andere als idiotensicher. Angenommen, Sie tun etwas Lustiges, als würden Sie Ihre Echtzeituhr nicht einrichten, wenn Sie beim Booten Zufallszahlen generieren. Wenn Sie nicht verstehen, wie sich dies auf Ihr RNG auswirkt, kann jemand, der dies tut, mit Ihrem privaten Schlüssel davonlaufen. Hier gibt es wenig Raum für Fehler, da eine kleine Menge an Nicht-Zufälligkeit ein gesamtes kryptografisches Protokoll wie die Schlüsselgenerierung gefährden kann.
Während Probleme mit naiven Roll-Your-Own-Implementierungen von Zufallszahlengeneratoren oder physische Interferenzen in Ihrer Hardware für gute Diskussionen sorgen, sind die meisten Schwachstellen in den Nachrichten mit Zufallszahlengeneratoren wie z Das von Ihnen erwähnte Debian-Problem ist nicht auf diese Probleme zurückzuführen. Die größten Probleme, die ich wiederholt gesehen habe, sind Entwickler, die glauben, sie hätten eine gute Entropiequelle, um den Zufallszahlengenerator zu säen, wenn sie dies tatsächlich nicht tun, und fälschlicherweise zulassen, dass der Zustand des Zufallsgenerators entdeckt und ausgenutzt wird, oder dass es an strengen Tests mangelt des Zufallszahlengenerators selbst. Die NSA muss Ihre Schlüsselgenerierung nicht hintertüren, wenn Sie einer von 0,75% der TLS-Clients sind, die Schlüssel mit niedriger Entropie verwenden. Zusammenfassend lässt sich sagen, dass Entwickler die wenigen, wenn überhaupt, Warnungen ignorieren und davon ausgehen, dass ihr RNG in jeder Anwendung funktioniert.
Was ist Entropie und woher bekomme ich welche?
Da alle Computerprogramme produzieren Dieselben Ausgänge bei gleichen Eingaben müssen von einer Entropiequelle (oder unvorhersehbaren Daten) im Betriebssystem oder in der Hardware gelesen werden. Heutzutage haben wir Dinge wie den RdRand-Befehl, der jede Sekunde Dutzende oder Hunderte von MB Entropie erzeugen kann. Geräte mit Hardware-Zufallszahlengeneratoren wie der Ferranti Mark 1 von 1951 oder der Intel 82802 Firmware Hub von 1999 waren jedoch bis in die 2010er Jahre eher die Ausnahme als die Regel.
Historisch gesehen verlassen sich Zufallszahlengeneratoren daher auf relativ langsame Entropiequellen wie menschliche Eingaben oder Computer-Timings, und Legacy-Systeme verfügen möglicherweise fast über keine integrierten Funktionen mit guten Entropiequellen. Linuxs / dev / random kann beispielsweise die Startuhrzeit, das Timing menschlicher Eingabegeräte, Festplatten-Timings, IRQ-Timings und sogar die Änderung des Entropiepools durch andere Threads verwenden.
In vielerlei Hinsicht Zufallszahlengeneratoren sind zerbrechlich, weil diese Standardmethoden, um Entropie zu erhalten, nicht narrensicher sind. Alles, was diese Entropiequellen vorhersehbar oder eingeschränkt macht, gefährdet Ihr RNG, zum Beispiel:
Herausfinden des Zustands und des Mangels an Nachsaat
Oft erhalten RNGs nicht bei jedem Funktionsaufruf eine neue Entropie, wie dies bei / dev / random der Fall ist. Manchmal kann man nicht schnell genug Entropie bekommen oder man vertraut der Entropiequelle nicht vollständig. Stattdessen wird das RNG mit einer bekannten Entropiequelle ausgesät und erzeugt dann unabhängige Werte aus diesem Keim. Wenn jedoch jemand den internen Zustand des Generators herausfindet, laufen die Dinge schlecht, was zu allem führt, vom Klonen von Smartcards bis zum Betrügen eines Spielautomaten in Vegas.
Ein Pufferüberlaufangriff oder ein ähnlicher Angriff kann den Status des Zufallszahlengenerators anzeigen. Das Erlernen des Zustands kann auch mit einem Brute-Force-Angriff möglich sein, insbesondere wenn der Algorithmus bekannt und reversibel ist, schnell berechnet werden kann oder ein Klartext bekannt ist. Dies war der Fall bei Problemen mit Windows XP, Dropbear SSH-Bibliothek, XorShift128 + in Chrome und dem Messerne-Twister-Algorithmus unter vielen anderen.
Wenn für diese Angriffe im bekannten Zustand eine erweiterte Abschwächung erforderlich ist, ist das RNG anfällig. Der beste Weg, um Angriffe mit bekanntem Status abzuschwächen, besteht darin, keinen anfälligen Algorithmus zu verwenden (wie die meisten CSRNGs). Diese Frage erklärt auch genauer, was ein gutes RNG sicher macht. Manchmal weisen jedoch auch CSRNGs Schwachstellen auf (z. B. die RNG-Sicherheitsanfälligkeit im Linux 2.6.10-Kernel). Eine gründliche Verteidigung erfordert daher Abschwächungen wie die Verwendung separater Zustände für Zufallszahlengeneratoren (möglicherweise einen pro Benutzer), die häufige Aktualisierung des Seeds und den Schutz vor Seitenkanalangriffen und Pufferüberläufen.
Schuldzuweisungen zwischen Entwicklern und Benutzern
Oft sind diese RNGs fragil, da die Einschränkungen zwischen Bibliotheksentwicklern oder Betriebssystemerstellern, die kein narrensicheres System entwickeln können, und Benutzern, die dies erwarten, falsch kommuniziert werden einer. Linux beispielsweise zwingt Benutzer, zwischen hoher Latenz / dev / random und potenziell niedriger Entropie / dev / urandom zu wählen. Als weiteres Beispiel hatte PHP vor 5.3 keine Unterstützung für starke PRNGs in Windows über Schnittstellen wie mcrypt_create_iv () und hatte vor 7.0 kein gutes integriertes CSPRNG.
Schwierigkeiten bei der Erkennung
Bei der Diskussion von Zufallszahlen gibt es einen beliebten Diskussionspunkt, bei dem für eine wirklich zufällige Zahl jede Möglichkeit gleich wahrscheinlich ist und es unendlich viele mögliche Muster gibt. Wie können Sie also eine Sequenz wirklich betrachten und sagen, dass sie nicht zufällig ist? (relevanter Dilbert)
In Wirklichkeit ist das Erkennen von Mustern in Zufallszahlen ein ausgereiftes, wenn auch unvollkommenes Feld, und die Frage, ob Nicht-Zufälligkeit erkannt werden kann, wurde seit M.G. Kendall und B. Babington-Smiths Arbeit von 1938. Sie können nachweisen, dass bestimmte Arten von Mustern nicht wesentlich häufiger auftreten als zufällige Zufälle. Zum Beispiel kann ich überprüfen, ob die Ziffer 1 häufiger als andere Ziffern ist, wobei die Schwellenwerte durch einen Chi-Quadrat-Test bestimmt werden. Solange diese getesteten Muster zumindest aus der Ferne wahrscheinlich sind und Sie einen ausreichend langen Satz generierter Zahlen überprüfen, ist die Wahrscheinlichkeit eines falsch positiven Ergebnisses gering. Während einige versteckte Probleme mit einigen Zufallszahlengeneratoren jahrelang unentdeckt bleiben können, sind Sie es, wenn Sie eine grundlegende Kryptoanalyse durchgeführt und dann Tests in Industriequalität durchgeführt haben, wie in dieser Frage beschrieben kann nicht zu viel falsch machen.
Designer unterschätzen jedoch möglicherweise auch nur ihre Angreifer (wie sollten Sie vorhersagen, dass Leute Ihren Spielautomaten rückentwickeln und zeitlich festlegen würden?). Schlimmer noch, manchmal wird der Zufallszahlengenerator oder die Entropieerzeugung nie von einem Experten überprüft, und nur das Ergebnis der Verwendung des RNG wird untersucht, beispielsweise wenn PS3-Firmware-Signaturen mit einer konstanten "zufälligen" Ausgabe signiert wurden .
Letztendlich ist das Problem hier ähnlich wie bei einem Großteil der Cybersicherheit: Sie haben einen sehr komplexen Satz von Protokollen, Anforderungen und Geräten für Zufallszahlen. Wenn Sie die Komplexität nicht verstehen, sind Sie wie immer anfällig für einen Angreifer, der dies tut.