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.