Tool bringt Apache-Webserver zum Stillstand

Ein Fehler in der Verarbeitung von Headern mit Range-Requests lässt sich ausnutzen, um mit einem einzigen PC einen Apache-Webserver in die Knie zu zwingen. Eine Tool namens "Apache Killer" kursiert bereits.

In Pocket speichern vorlesen Druckansicht 154 Kommentare lesen
Lesezeit: 2 Min.
Von
  • Daniel Bachfeld

Ein bislang unbekannter Fehler in der Verarbeitung von Byte-Range-Headern lässt sich ausnutzen, um mit einem einzigen PC einen Apache-Webserver 2.2 zum Stillstand zu bringen. Auf der Mailing-Liste Full Disclosure ist dafür das Perl-Skript "Apache Killer" erschienen, das das Problem eindrucksvoll demonstriert.

Das Tool sendet GET-Requests mit mehreren "Byte Ranges", die zu einer sehr hohen Speicherbelegung des Systems führen. Die Angabe von "Bytes Ranges" ermöglichen dem Browser, etwa bestimmte Teile eines Dokuments nur teilweise zu laden, etwa die Bytes 500 bis 1000. Auf diese Weise knüpfen etwa auch Download-Clients an abgebrochene Downloads an. Das soll den Bandbreitenverbrauch verringern. Die Angabe mehrerer Teile im Header in unsortierter Folge bringen aber den Apache offenbar aus dem Tritt.

Einen offiziellen Patch gibt es noch nicht, als Workaround funktionieren jedoch Rewrite-Regeln, die nur noch einen einzigen Range-Requests in GET und HEAD-Headern erlauben. Für die meisten Anwendungen sollte das kein Problem sein. Um die Regeln zu aktivieren, müssen Administratoren das Modul mod_rewrite im Apache-Webserver laden.

Alternativ soll es auch helfen, über das Modul mod_header und die Konfiguration
RequestHeader unset Range im Header enthaltene Range-Requests komplett zu löschen. Vermutlich dürfte dies aber zu größeren Problem führen, als die Anzahl der Ranges zu beschränken. Admins sollten mit dem Tool die Wirksamkeit ihrer Maßnahmen prüfen, bevor es andere tun.

Update: Anscheinend sind die verlinkten Rewrite-Regeln ungenügend. Sie verhindern zwar die geschilderten Angriffe, diese lassen sich jedoch auch über RequestRange-Header durchführen. Ein erweiterter Regelsatz könnte etwas wie diese Regeln enthalten:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|GET) [NC]
RewriteCond %{HTTP:Range} ([0-9]*-[0-9]*)(\s*,\s*[0-9]*-[0-9]*)+ [OR]
RewriteCond %{HTTP:Request-Range} ([0-9]*-[0-9]*)(\s*,\s*[0-9]*-[0-9]*)+
RewriteRule .* - [F] (dab)