Wie heise Security gestern vermeldet hat, gibt es ein Problem in aktuellen Apache2 Webservern der Version 2.2.x, welches bei GET-Requests mit mehreren “Byte-Ranges” auftritt und dazu genutzt werden kann, den RAM des angegriffenen Ziels überlaufen zu lassen, was zum Absturz des Webserver oder gar des ganzen Servers führen kann. Meine Beobachtungen sind, dass nicht jede Installation gleich anfällig ist.

Zwar wird bei einem Angriff mit dem Exploit-Code einiges an CPU-Leistung verbrannt, der RAM Verbrauch steigt um ein paar hunder MB, reicht aber auf den Systemen unter meiner Kontrolle nicht aus, diese aus dem Tritt zu bringen – zumindest nicht mit nur einem angreifenden Rechner und 1000+ Threads.

Schritte zum Dämpfen der Bedrohung sind entweder die Abschaltung des Byte-Ranges in der Config des Header Moduls, was aber neben dem kompletten Deaktivieren von “resumable Downloads” noch schwerwiegendere Folgen haben dürfte oder aber das Beschränken der Zahl der Range-Requests via mod_rewrite. Ich habe mich wie vermutlich die Meisten für die zweite Lösung entschieden.

Diese Instruktionen beziehen sich auf ein Server-System mit Debian Linux. Bei Verwendung einer anderen Distribution müssen ggf. Dateipfade angepasst werden.
Dazu muss in jedem VHost folgender Code eingefügt werden (z. B. nach der DocumentRoot-Direktive):

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

Da ich wenig Lust habe, das in jeden VHost manuell einzufügen, lagere ich das in eine eigene Datei in /etc/apache2/conf.d/antiapachekiller aus und füge ein Include /etc/apache2/conf.d/antiapachekiller in jeden VHost nach dem DocumentRoot ein. Weil ich das bei ziemlich vielen Seiten machen muss, habe ich das mit diesem Skiptchen automatisiert. Dieses kann an beliebiger Stelle liegen, der Pfad mit den VHost-Definitionen ist fest eingebaut (und müsste bei Abweichungen angepasst werden), und ein Backup des Apache-Verzeichnisses vorher wird dringend empfohlen!

#!/bin/bash
cp -rvp /etc/apache2/sites-available/ /tmp/
cd /tmp/sites-available/
FILES=`ls *.conf`
for FILE in $FILES
do
echo $FILE
cat $FILE | perl -ne 'print $_; print \
"Include /etc/apache2/conf.d/antiapachekiller\n" \
if ($_ =~ /DocumentRoot/ )' > /etc/apache2/sites-available/$FILE
done

Selbst wenn kein eigenes Backup vorher angelegt wurde, liegen die Originaldateien nach der Anwendung des Skripts noch in /tmp/sites-available/
Danach sollten die VHosts zumindest noch stichprobenartig überprüft werden und dann der Indianer neu geladen werden (/etc/init.d/apache2 reload).