Facebook
Twitter
Google+
Kommentare
0

HashDoS Angriff legt (unter anderem) PHP lahm

Ich bin leider die letzten 2 Tage nur wenige Stunden dazu gekommen die Live-Streams vom 28. Chaos Communication Congress (28C3) zu schauen, aber bzgl. PHP ist heute Nachmittag ein interessanter Talk gehalten worden mit dem Thema Effective Denial of Service attacks against web application platforms dem ich hier einen kurzen Artikel widmen werde.

Es geht darum wie PHP (und die anderen anfälligen Sprachen auch) Hash-Tabellen erstellen und verwalten. Die hier interessante Hash-Tabelle ist das $_POST Array, das man von außen füllen kann, und das anfällig ist wenn man nur genügend “passende” Datensätze reinfüllt. Der Algorithmus der die Hash-Tabelle befüllt wird nämlich langsamer sobald Kollisionen der Keys auftreten. Schickt man also beispielsweise 300KB POST-Daten an ein PHP-Script ist eine schnelle CPU damit ca. 30 Sekunden unter Volllast. Bei 8MB (dem Standard-Maximum für POST-Daten in der php.ini) wären es immerhin schon 5 Stunden, die die CPU benötigt um die Hash-Table zu füllen. Man kann also mit einer relativ kleinen DSL-Leitung einigen Schaden anrichten. Mit einer Gigabit-Leitung kann man so 10.000 CPU-Kerne dauerhaft beschäftigen.

Etwas Abhilfe schaffen da die Einstellungen max_input_time und max_execution_time, die je nach Distribution 30 Sekunden, 60 Sekunden bzw. nicht beschränkt sind. Man müßte also mehrere kleine Anfragen schicken und kann nicht die 8MB ausnutzen. mit ca. 500KB kann man einen CPU-Kern dann etwa eine Minute beschäftigen.

Das Problem ist wohl seit 2003 bekannt, Perl hat es damals behoben indem in die Generierung des Hash-Index auch Zufall mit einfließt, und nicht nur der Key die Hash-Position bestimmt. Neben PHP sind übrigens auch Java, Apache Tomcat, Apache Geronimo, Jetty, Oracle Glassfish, ASP.NET, Python, Plone, CRuby 1.8, JRuby, Rubinius und v8 (Node.JS) betroffen (Details zu betroffenen und gefixten Versionen).

Abhilfe schafft beispielsweise die PHP-Extension Suhosin, mit der die Anzahl an POST-Variablen beschränkt werden kann (Standard ist 200). Seit 3 Wochen gibt es auch einen Patch für PHP der eine neue php.ini Variable max_input_vars (Standard 1000) einführt, dieser Patch wird enthalten sein in PHP >=5.3.9 und >=5.4.0 RC4

Ein sehr hilfreicher Artikel bei cryptanalysis.eu erklärt noch einige Details. Natürlich empfiehlt es sich auch das aufgezeichnete Video des Talks zu schauen. Aktuell ist es ein PreRelease, das finale Video wird wahrscheinlich erst morgen oder übermorgen erscheinen nehme ich an.

Aktuell werden wohl noch keine großflächigen Angriffe beobachtet, aber wer auf der sicheren Seite sein will installiert sich Suhosin falls nicht eh schon geschehen. Aber Achtung, einige Restriktionen sind zu streng und könnten die Benutzung der Applikation beeinflussen die auf hohe Werte einiger Einstellungen angewiesen ist, also bitte vorher testen. Oder noch etwas gedulden und bald auf PHP 5.3.9 bzw. PHP 5.4.0 updaten.

EDIT: php.net ist langsam bzw. zeitweise nicht erreichbar…

EDIT: Der torrent zum offiziellen Release des Videos.

EDIT: Demo-Webseite incl. Quelltext

Ähnliche Artikel:

  1. PDT 2.1 unter Windows mit Subclipse SVN Client
Über den Autor

PHP Gangsta

Der zweitgrößte deutsche, eher praxisorientierte PHP-Blog von Michael Kliewe veröffentlicht seit Mitte 2009 Artikel für Fortgeschrittene.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen