28C3: Eine Konferenz, viele neue Angriffe

Neues rund um die Websecurity
Kommentare

Vom 27. bis 30.12.2011 fand der 28. Chaos Communication Congress (28C3) statt, der uns unter anderem einen außerplanmäßigen Patch von Microsoft bescherte. Außerdem wurden neue beziehungsweise aktualisierte Angriffe und eine neue Methode zur Suche nach Schwachstellen vorgestellt.

Entwickler Magazin

Der Artikel „28C3: Eine Konferenz, viele neue Angriffe“ von Carsten Eilers ist erstmalig erschienen im Entwickler Magazin 2.2012

Von den vielen interessanten Vorträgen des Kongresses sollen hier nur einige wenige näher betrachtet werden. Konkret: Die, die sich mit Websecurity beschäftigten. Aufzeichnungen der Vorträge stehen in verschiedenen Formaten zum Ansehen und Herunterladen zur Verfügung [1], eine Gelegenheit, die Sie sich bei Interesse an dem einen oder anderen Thema/Vortrag nicht entgehen lassen sollten. Los geht es mit einem neuen Angriff, der Microsoft zur Veröffentlichung eines außerplanmäßigen Patches veranlasste.

Hash-DoS: DoS-Angriffe über Hash-Funktionen

Alexander „alech“ Klink vom Sicherheitsdienstleister n.runs und Julian „zeri“ Wälde von der TU Darmstadt stellten auf dem 28C3 einen DoS-Angriff auf Webserver vor. In ihrem Vortrag mit dem Titel „Effective Denial of Service Attacks against Web Application Platforms“ [2] beschrieben sie Schwachstellen in den Hash-Funktionen vieler gängiger Skriptsprachen und Webanwendungsplattformen, die sich für DoS-Angriffe ausnutzen lassen [3].

Eine kurze Einführung: Hash-Funktionen

Vereinfacht ausgedrückt berechnet eine Hash-Funktion hash(M) aus einer beliebig langen Eingabe M, zum Beispiel einem Text, einen möglichst eindeutigen Hash-Wert h fester Länge, beispielsweise eine Zahlen-Buchstaben-Kombination: h = hash(M) . Der Hash-Wert wird auch als Fingerprint (Fingerabdruck) der Eingabe bezeichnet. Allgemein wird von Hash-Funktionen gefordert, dass sich die Ergebnisse für verschiedene Eingaben mit ausreichend großer Wahrscheinlichkeit unterscheiden. Die Ergebnisse sollen möglichst gleichmäßig auf den definierten Wertebereich verteilt sein. Zwei Eingabewerte mit gleichem Hash-Wert werden als Kollision bezeichnet. Da die Ausgabemenge kleiner als die Eingabemenge ist, muss es zwangsläufig zu Kollisionen kommen.

Eine kurze Einführung: Hash-Tabellen

Hash-Tabellen werden zum Speichern von Schlüssel-Wert-Paaren verwendet. Sie bestehen meist aus einem Array von Listen oder ähnlichen Konstruktionen. Mit einer Hash-Funktion wird der Hash-Wert des Schlüssels berechnet, der dann als Index für das Array verwendet wird. Das Schlüssel-Wert-Paar wird in der zugehörigen Liste gespeichert. Bei der Suche wird analog vorgegangen: Erst wird der Hash-Wert des Schlüssels berechnet, dann aus der Liste des damit bestimmten Array-Felds das passende Schlüssel-Wert-Paar geholt. Im Idealfall gibt es unter jedem Indexwert nur genau einen Eintrag, sodass das Eintragen und Suchen sehr schnell geht. Gibt es Kollisionen, sind zusätzliche Vergleiche der gespeicherten Schlüsselwerte mit dem einzutragenden beziehungsweise gesuchten Schlüsselwert nötig, und die Funktionen werden deutlich langsamer.

Ein Beispiel

Das Schlüssel-Wert-Paar [‚foo‘, ‚bar‘] soll in einer Hash-Tabelle gespeichert werden. Zuerst wird der Hash-Wert von ‚foo‘ berechnet, zum Beispiel hash(‚foo‘) = 3. Danach wird das Paar [‚foo‘, ‚bar‘] in der Hash-Tabelle unter dem Index 3 eingetragen (Abb. 1). Nun tragen wir weitere Schlüssel-Wert-Paare ein, zum Beispiel [‚irgend‘, ‚was‘] und [‚ganz was‘, ‚anderes‘]: hash(‚irgend‘) = 5 und hash(‚ganz was‘) = 3. Dass die Hash-Werte von ‚foo‘ und ‚ganz was‘ übereinstimmen, ist, wie oben erwähnt, normal, so etwas lässt sich nicht vermeiden. Die Tabelle sieht dann wie in Abbildung 2 aus: Unter dem Index 5 ist ein Schlüssel-Wert-Paar abgespeichert, unter dem Index 3 zwei. Werfen wir einen Blick auf die Komplexität der Funktionen zum Eintragen, Suchen und Löschen im durchschnittlichen Fall (Average Case): Normalerweise ist der Aufwand dafür unabhängig von der Anzahl der vorhandenen Einträge (genannt n), die Operationen werden also immer in der gleichen Zeit ausgeführt, was in der Komplexitätstheorie als O(1) bezeichnet wird. Die Funktionen arbeiten im durchschnittlichen Fall also sehr schnell. Deutlich schlechter sieht es im schlimmsten Fall, dem Worst Case, aus. Dann ergibt sich eine Komplexität von O(n). Denn im schlimmsten Fall würden alle n Schlüssel der vorhandenen Einträge den gleichen Hash-Wert ergeben, sodass alle Schlüssel-Wert-Paare unter dem gleichen Index eingetragen wurden. Dann müssen alle bereits gespeicherten Schlüssel mit den neu einzutragenden verglichen werden, es sind also n Vergleiche notwendig (Abb. 3). Im schlimmsten Fall sind die Funktionen also furchtbar langsam. Zum Glück kommt der schlimmste Fall in der Realität äußerst selten vor, sofern man nicht nachhilft. Gelingt es, gezielt Kollisionen zu finden, kann ein Rechner sehr effektiv ausgelastet werden.

Abb. 1: Die Hash-Tabelle mit dem ersten Eintrag
Abb. 2: Die Hash-Tabelle mit den weiteren Einträgen
Abb. 3: Eine Hash-Tabelle im Worst Case (n=4)
Gesucht: eine Schwachstelle

Eine Hash-Funktion wird als kollisionsfrei oder kollisionsresistent bezeichnet, wenn sich Kollisionen praktisch nicht berechnen lassen. Für kryptografische Hash-Funktionen ist die Kollisionsfreiheit Voraussetzung, bei normalen Hash-Funktionen wird darauf aber kein besonderer Wert gelegt. Außerdem wird in der Kryptografie verlangt, dass es nicht effizient möglich sein darf, zu einem gegebenen Hash-Wert eine passende Eingabe zu berechnen. Auch diese Forderung gilt für normale Hash-Funktionen nicht, sodass es insgesamt möglich ist, Kollisionen gezielt zu erzeugen. Alexander Klink und Julian Wälde haben in den oft genutzten Hash-Funktionen DJBX33A und DJBX33X und damit verwandten Algorithmen Möglichkeiten gefunden, gezielt Kollisionen zu erzeugen. Zum Teil können gleichwertige Teil-Strings bestimmt werden, zum Teil sind so genannte Meet-in-the-middle-Angriffe [4] möglich.

Autor

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -