OpenSSL erzeugt zu oft den gleichen Zufall

Der Zufallszahlengenerator der freien Krypto-Bibliothek liefert unter bestimmten Voraussetzungen relativ kurz hintereinander dieselben Zahlen. Noch ist nicht entschieden, ob die OpenSSL-Entwickler oder -Nutzer ihren Code ändern müssen.

In Pocket speichern vorlesen Druckansicht 59 Kommentare lesen
Lesezeit: 2 Min.
Von
  • Christian Kirsch

Wenn ein Prozess sehr viele Kindprozesse hat, die über die Krypto-Bibliothek OpenSSL Zufallszahlen abrufen, den Zufallszahlengenerator aber nicht selbst initialisieren, kommen eventuell innerhalb des Programms die gleichen Zufallszahlen mehrfach zu Anwendung. Konkret bedeutet das, dass sich zum Beispiel Verschlüsselung unter Umständen knacken ließe. Noch ist nicht entschieden, ob die OpenSSL-Entwickler oder -Nutzer ihren Code ändern müssen.

Das Problem tritt auf, wenn das Hauptprogramm zunächst den Zufallszahlengenerator (PRNG, pseudo random number generator) initialisiert und danach mit dem Unix-Systemaufruf fork neue Kind-Prozesse erzeugt. Diese Kinder bekommen eine eindeutige Prozess-IDs (PID). Die OpenSSL-Bibliothek verwendet diese PID intern, damit danach nicht alle Sub-Prozesse die gleichen Zufallszahlen bekommen. Allerdings gibt es im Betriebssystem-Kern einen Maximalwert für die PID: Ist er erreicht, bekommt der nächste Prozess eine niedrige ID, die noch kein anderer verwendet. Dadurch kann ein Child dieselbe PID erhalten wie ein früher erzeugtes und dann von OpenSSL dieselbe Zufallszahlensequenz geliefert bekommen.

Das trat in der Vergangenheit bereits bei PostgreSQL und Android auf. Ein Angreifer könnte somit versuchen, Zufallszahlen zu erraten und so an kryptografisch gesicherte Informationen zu gelangen. Entdeckt hatte das Problem der Ruby-Entwickler Eric Wong bereits 2011. Damals waren die OpenSSL-Entwickler jedoch der Auffassung, das Auftreten des Bugs liege an einer unsachgemäßen Nutzung der Bibliothek. Folglich bauten die PostgreSQL- und Android-Programmierer Workarounds, die entweder in jedem Child-Prozess den PRNG neu initialisieren oder ihn mit einem besseren Startwert versehen.

Bei den OpenSSL-Entwicklern beginnt jetzt das Nachdenken darüber, ob sie zusätzliche Parameter wie die Uhrzeit zum Starten des PRNG verwenden sollten. Auf ein externes Pseudo-Zufallsgerät, wie es Linux mit /dev/urandom bietet, wollen sie sich bislang nicht einlassen, da derlei zu betriebssystemabhängig sei.

Unklar ist, wie weit das Problem überhaupt verbreitet ist. Unter Mac OS X 10.8 ließ es sich mit dem veröffentlichten Beispiel-Code ebenso wenig reproduzieren wie unter Oracles Linux 6.4 und Fedora 16 mit einem Linux-Kernel 3.4.2. Dort lieferte der PRNG trotz identischer PID jeweils verschiedene Ergebnisse. Bei einem Debian mit Linux 3.2.0 hingegen trat das beschriebene Phänomen auf, nachdem das Programm 32077 Child-Prozesse erzeugt hatte. (ck)