Apache Sicherheit bei Verwendung von PHP

Sicherheit in Webanwendungen ist immer ein großes Thema, dazu gehört auch die sichere Einbindung des PHP-Modules in den Apache httpd Webserver. In diesen Artikel behandele ich kurz, wie PHP in den Apache eingebunden wird und nur von Dateien mit der Endung .php oder .php5 ausgeführt wird, und weshalb hier eine Sicherheitslücke lauern kann.

Wieder mal ist ein sogenanntes Future vom Apache Httpd Auslöser eines Exploits, diesmal bei WordPress.

Grundlegend kann man sich nun Fragen, liegt der Fehler nun beim Apache Httpd, bei WordPress oder beim Administrator des Apache Httpds? Nun, bei gesamter Betrachtung hat jeder etwas Schuld, aber das tut nichts zu Rolle. Interessanter ist es, wie ich als Administrator eines Apache Httpds nicht Opfer dieses Exploits geworden wäre, bzw. der Exploit keine Auswirkungen auf mein System hat.

Um zu verstehen, was hier passiert ist, eine kurze Erklärung des Exploits. Hier entsteht eine Lücke durch ein Future vom Apache Httpd, welche vom WordPress nicht abgefangen wurde. Dieses Future greift vornehmlich bei mehrfachen Dateiendung (bspw. archive.tar.gz oder image.php.jpg), es arbeitet den Dateinamen von rechts nach links ab, um einen diese einen entsprechenden Dateityp zu zuordnen. Wenn bei nun die für die Endung .jpg kein Dateityp im Apache httpd hinterlegt ist, nimmt er sich die nächste Stelle, was bei einer Datei mit den Namen image.php.jpg, die Endung .php wäre. Somit wird die Datei den Typ PHP zugeordnet und wird durch den PHP Parser geschickt und ausgeführt.

[…]
Files with Multiple Extensions

Files can have more than one extension, and the order of the extensions is normally irrelevant. For example, if the file welcome.html.fr maps onto content type text/html and language French then the file welcome.fr.html will map onto exactly the same information. If more than one extension is given that maps onto the same type of meta-information, then the one to the right will be used, except for languages and content encodings. For example, if .gif maps to the MIME-type image/gif and .html maps to the MIME-type text/html, then the file welcome.gif.html will be associated with the MIME-type text/html.

Languages and content encodings are treated accumulative, because one can assign more than one language or encoding to a particular resource. For example, the file welcome.html.en.de will be delivered with Content-Language: en, de and Content-Type: text/html.

Care should be taken when a file with multiple extensions gets associated with both a MIME-type and a handler. This will usually result in the request being handled by the module associated with the handler. For example, if the .imap extension is mapped to the handler imap-file (from mod_imagemap) and the .html extension is mapped to the MIME-type text/html, then the file world.imap.html will be associated with both the imap-file handler and text/html MIME-type. When it is processed, the imap-file handler will be used, and so it will be treated as a mod_imagemap imagemap file.

[…]

Quelle: http://httpd.apache.org/docs/2.2/mod/mod_mime.html

Also was sollte man als Administrator eines Apache Httpds machen?

Nun, erstmal sollte dafür gesorgt werden, dass Dateien nur durch den PHP Parser gelangen, wenn die Dateiendung auch wirklich den Abschluss der Datei bildet. Bei Debian Lenny kann dies wie folgt erreicht werden:

/etc/apache2/mods-enabled/php5.conf

<IfModule mod_php5.c>
  AddType text/plain .php .phtml .php3 .php4 .php5
  <FilesMatch "\.php5?$">
    AddType application/x-httpd-php .php .php5
    AddType application/x-httpd-php-source .phps
    SetHandler application/x-httpd-php
  </FilesMatch>
</IfModule>

Damit hätte man als Administrator eines Apache Httpds schon mal sorgfältiger gehandelt und der beschriebene Exploit wäre gar nicht möglich gewesen. Trotz allen müssen PHP-Anwendung, wie WordPress, umsichtig genug entwickelt werden, dass der Exploit gar nicht erst vorhanden ist.

Hinweis: Falls nun jemand meint, der SetHandler würde reichen, der irrt, zu mindestens bei Debian Lenny wird es nicht funktionieren, erst mit den oben gezeigten Beispiel arbeitet der Apache 2.2 zuverlässig, so wie es gewollt ist.

DualBoot Windows Vista / Linux

Diese Anleitung müsste auch für Windows 7 funktionieren, ich habe es bisher aber noch nicht ausprobieren können, über eine Rückmeldung würde ich mich freuen.

Über den Windows Bootmanager

Voraussetzung hierfür, ist dass Linux Grub als Bootmanager verwendet.

Schritt 1 – Eine Kopie von der Linux-Bootpartition erstellen

Als erstes muss Windows beigebracht werden, wie es Linux booten kann, dafür muss ein kleines Abbild erstellt werden von der Bootpartition (z.B. wo GRUB installiert ist), dies muss natürlich als root angelegt werden und dann nach Windows transferiert werden (per USB-Stick, CD o.ä.):
dd if=/dev/sda1 of=/tmp/linux.bin bs=512 count=1

Schritt 2 – Windows Vista installieren

Schritt 3 – Dual Boot unter Windows Vista konfigurieren

Nun wird ein Eintrag für GRUB im Windows Vista Bootmanager erstellt unter Verwendung von bcdedit.

  • In Windows Vista die Kommandozeile mit administrativen Rechten starten (Rechtsklick auf cmd und “Als Administrator ausführen”/”Run as Administrator” auswählen)
  • Den Linuxbootsektor auf die (aktive) Windows Bootpartition kopieren, die Partition enthält die bootmgr.
  • Eintrag für GRUB erstellen:
    bcdedit /create /d "GRUB" /application BOOTSECTOR
    Hinweis: bcdedit liefert eine ID für den Eintrag zurück, welche hier {LinuxID} genannt wird. Die {LinuxID} muss mit der erhaltenen ID in diesen Schritt ersetzt werden. Ein Beispiel einer {LinuxID} ist {81ed7925-47ee-11db-bd26-cbb4e160eb27}.
  • Angabe des Laufwerks, welches eine Kopie des Linuxbootsektors enthält.
    bcdedit /set {LinuxID} device boot
  • Angabe des Pfads zum kopierten Linuxbootsektor.
    bcdedit /set {LinuxID} PATH \linux.bin
  • Hinzufügen eines Linuxeintrags, welcher im Bootmenü angezeigt wird.
    bcdedit /displayorder {LinuxID} /addlast
  • Zeit das Menü für 10 Sekunden an, um die Betriebssystemauswahl zu ermöglichen.
    bcdedit /timeout 10

Quelle: http://port25.technet.com/…-Support.aspx

Über GRUB

Schritt 1 – Windows installieren

Schritt 2 – Linux mit Grub installieren

Schritt 3 – Grubeintrag für Windows Vista erstellen

Einfach vor oder nach den Linux-Booteinträgen folgendes hinzufügen. Wobei x und y in (hdx,y) durch die entsprechenden Zahlen zu Ersetzen sind.

  • x = Festplatte (heraus findbar über die device.map im Grubverzeichnis, welche Angabe hier erfolgen muss)
  • y = Partition (Die Partition auf der der entsprechenden Platte, wobei bei 0 angefangen wird zu zählen und bis 4 geht zu erweiterten Partition mehr dazu hier: GRUB Manual – 2. Naming-convention)

/boot/grub/menu.lst
title Windows Vista
rootnoverify (hdx,y)
chainloader +1

makeactive