Skip to content

Es war einmal eine Apache DoS-Schwachstelle ...

Vor vier Jahren entdeckte Michal Zalewski eine DoS-Schwachstelle im Apache Webserver und veröffentlichte sie auf der Mailingliste Bugtraq. Ein Fehler beim Verarbeiten von Byte-Range-Headern führte dazu, dass der Server durch einen einzigen entsprechend präparierten Request lahm gelegt werden konnte. Nun sollte man annehmen, dass eine 4 Jahre alte Schwachstelle inzwischen behoben und dabei auch der gesamte in Frage kommende Code überprüft wurde.

Und wenn sie nicht gestorbengepatcht sind...

Leider ist das wohl nicht der Fall, wie "Kingcope" nun herausfand. Ein von ihm unter dem Namen Apache Killer auf der Mailingliste Full-Disclosure veröffentlichter Proof-of-Concept nutzt die Schwachstelle für DoS-Angriffe aus (Eintrag im ASF Bugzilla dazu). Es handelt sich zwar nicht um genau die gleiche Schwachstelle, eine gewisse Verwandtschaft besteht aber. Die Apache-Entwickler diskutieren das Problem auf der Entwickler-Mailingliste und haben mit einem Security Advisory auf die Schwachstelle und das veröffentlichte Tool reagiert.

Daten, viele Daten, zu viele Daten

Während Michal Zalewski den Byte-Range-Header nutzte, um dem Server zum Senden möglichst große Daten zu bringen, wird er von "Kingcope" genutzt, um dem Speicher des Servers zu (über)füllen. Wobei Michal Zalewskis Ansatz (zusätzlich) Protokollbedingt ist und alle Server betrifft, die RFC 2616 korrekt implementieren. Das Problem wird von der IETF zur Zeit diskutiert. Ggf. muss das Protokoll angepasst werden, um die mögliche Schwachstelle zu berücksichtigen.

Aber kommen wir zurück zum aktuellen Exploit. Über "Byte Ranges" ist es möglich, nur bestimmte Teile eines Dokuments zu laden, z.B. die Bytes 1.000 bis 2.000. Damit ist es z.B. möglich, abgebrochene Downloads fortzusetzen statt sie neu zu starten. Wenn der Browser die ersten 5.000 Bytes bereits geladen hat, muss er ja nur noch die Bytes ab 5.001 laden, um die Datei zu vervollständigen. Der Apache stolpert nun über mehrere ungeordnet angeforderte Byte Ranges und belegt beim Vorbereiten der auszuliefernden Daten den gesamten verfügbaren Speicher.

Den Apache-Entwicklern ist die aktuelle Schwachstelle nur teilweise anzukreiden: Der Apache-Server muss auf Anforderung mehrere sich überlappende Ranges ausliefern, um dem Standard zu entsprechen. Der Fehler der Entwickler liegt darin, dass er dabei sehr ungeschickt vorgeht und sehr viel Speicher belegt. Und dieser Teil der Schwachstelle soll nun behoben werden.

Workarounds

Es sind mehrere Workarounds bekannt. Auf der Mailingliste Full Disclosure wurden Rewrite-Regeln vorgeschlagen, die GET- und HEAD-Requests mit mehreren Ranges im RANGE-Header ausfiltern. Diese Regeln sind jedoch unvollständig, da sie nur den aktuellen Exploit berücksichtigen, der Angriff aber auch über RequestRange-Header erfolgen kann. Das Security Advisory der Apache-Entwickler enthält passende Regeln und führt weitere Workarounds auf. Z.B. ist es auch möglich, mit mod_headers die RANGE-Header komplett zu löschen:
RequestHeader unset Range
Darüber werden aber fast alle Clients stolpern, die Daten schrittweise laden wollen oder müssen.

Und wer denkt an die KinderVorfahren?

Ein Patch soll demnächst erscheinen. Aber was ist mit dem ebenfalls betroffenen, nicht mehr unterstützten Apache 1.3? Wird es dafür zumindest halb-offizielle Patches der jeweiligen Distributionen geben, oder gehen die leer aus? Und was ist mit all den seit einer halben Ewigkeit nicht mehr aktualisierten Apache-2.x-Servern im Web? Ob die ganzen veralteten Apache-Installationen jetzt wohl ersetzt bzw. aktualisiert werden? Ansonsten dürften sie bald ein gefundenes Fressen für die Skriptkiddies sein. Wer also noch so eine Antiquität mit Internetanschluss betreibt, sollte jetzt besser den Stecker ziehen. Zumindest den für den Internetanschluss.

Duck&Cover!

Laut Netcraft sind gut 65% aller Webserver Apaches, und bis der Patch alle erreicht hat, dürfte es eine Weile dauern. Jede Menge potentieller Opfer für die Skriptkiddies also. Wenn Sie einen Apache-Server betreiben, sollten Sie prüfen, ob er von der Schwachstelle betroffen ist (was i.A. der Fall sein wird), wenn möglich einen Workaround ergreifen und den Patch nach seiner Veröffentlichung so schnell wie möglich installieren. Beim Shared Hosting bleibt nur die Hoffnung, dass die Hoster angemessen reagieren.

Außer dem in Perl geschriebenem Apache Killer wurden für PHP mehrere Möglichkeiten entwickelt, einen Server auf seine Anfälligkeit zu testen: Für das Zend-Framework von Michael Kliewe, mit Hilfe von cURL von Fabian Beiner und eine reine PHP-Lösung von Norbert Bartels (alle via PHP Magazin gefunden). Der Nachteil aller Tests: Sie führen sehr wahrscheinlich zu einem DoS. Also überlegen Sie sich sehr gut, ob Sie ihren Server wirklich testen wollen oder sich einfach nach der Aussage der Apache-Entwickler im Security Advisory richten:
"Versions: Apache 1.3 all versions, Apache 2 all versions"
und
"The default Apache HTTPD installation is vulnerable."
Da bleibt kaum ein Apache übrig, der nicht betroffen ist.

Ach ja: Mit dem Patch wird die Schwachstelle natürlich nur teilweise geschlossen. Wenn irgendwann die Protokollspezifikation angepasst wurde, muss die Implementierung noch daran angepasst werden, um die Schwachstelle endgültig zu beheben.

Carsten Eilers

Trackbacks

Keine Trackbacks