PHP stümpert bei Zufallszahlen

Unter anderem die zufälligen Session-IDs lassen sich erraten, warnt Adreas Bogk. Und das trotz angeblicher Verbesserungen der Zufallszahlenfunktionen von PHP.

In Pocket speichern vorlesen Druckansicht 329 Kommentare lesen
Lesezeit: 2 Min.

Der Sicherheitsexperte Andreas Bogk warnt, dass die Session-ID eines an einer PHP-Anwendung angemeldeten Users trotz der jüngsten Verbesserungen in PHP nach wie vor erratbar ist. Bei genauerem Hinsehen zeigen die angeblichen Verbesserungen erschreckende Defizite auf.

Um die einzelnen Seitenabrufe einem angemeldeten User zuordnen zu können, versieht sie PHP mit einer Session-ID. Damit ein Angreifer eine Sitzung nicht mit einer gefälschten Session-ID übernehmen kann, wird diese zufällig gewählt. Fast immer, wenn auf Computern Zufallszahlen benötigt werden, kommen Pseudo-Zufallszahlengeneratoren wie der Linear Congruential Generator (LCG) zum Einsatz. Sie erzeugen durch komplexe mathematische Operationen einen Strom von Zahlen, die zumindest insoweit zufällig sind, als dass bereits erzeugte Zahlen nahezu keine Rückschlüsse auf die kommenden erlauben. Wer allerdings den Anfangszustand – also den Initialisierungswert – des Generators kennt, kann damit die gleichen Operationen durchführen und somit alle Pseudozufallszahlen berechnen. Deshalb ist es eminent wichtig, derartige Generatoren mit wirklich nicht vorhersagbaren Zahlen zu initialisieren.

Der Hacker Samy Kamkar konnte jedoch zeigen, dass genau dies bei PHP nicht geschah und er deshalb mit einem kleinen Programm Session-IDs zumindest so weit vorhersagen konnte, dass das Ausprobieren der restlichen Möglichkeiten durchführbar wurde. Daraufhin "verbesserte" das PHP-Team die Initialisierung des LCGs so, dass dieser konkrete Angriff seit Version PHP 5.3.2 beziehungsweise 5.2.13 nicht mehr durchführbar ist. Doch wenn man sich die Änderungen im Detail anschaut, zeigen sich deutliche Schwächen. So kommentiert der Entwickler eine Änderung mit

/* Add entropy to s2 by calling gettimeofday() again */

Er ruft also als zusätzliche Zufallsquelle kurze Zeit nach dem ersten Mal ein zweites Mal die Systemzeit ab. Das lässt sich mit jemand vergleichen, der zu dem Schluss kommt, dass die Zahl X zu leicht zu erraten ist und sie darauf hin mit X + 23 kombiniert. Wie Bogk es formuliert: "Da [wird] nicht viel mehr Entropie
hinzugefügt". Immerhin verwendet der Entwickler nur die unteren Bits der Zeitangabe.

Hinzu kommen weitere Schwächen, die Andreas Bogk in einem Advisory analysiert. Demnach bleiben nur "wenige Mikrosekunden, und die Prozess-ID" als Zufallsspender und Bogk kommt zu dem Schluss, dass sich Session-IDs nach wie vor erraten lassen. Gegen Ende legt er den PHP-Entwicklern unter anderem nahe, doch ihre Kryptographie-Kenntnisse aufzufrischen. Nicht betroffen sind übrigens PHP-Installationen, die die Erweiterung Suhosin einsetzen. (ju)