Als ich einen Eintrag beim Wohnzimmerhostblogger gelesen habe, musste ich schon schlucken.
Dieser Bug ist seit über einem Jahr offen, und das PHP-Team meint es wäre nicht ihr Problem. Kurz zusammengefasst: Unter *IX findet der Zugriff auf eigentlich alles über sogenannte File-Deskriptoren (kurz FD) statt. Wenn Apache als Webserver läuft, hat er nun also einen File-Deskriptor für die IP und den Port, auf dem er lauscht, offen. Damit weiß das Betriebssystem, wohin es Anfragen weiterleiten muss, und der Apache hat eine Art Eingangskanal für die Anfragen. Ein Apache-Modul, so zum Beispiel PHP, hat automatisch als Teil von Apache auch Zugriff auf diese ganzen FDs.
Wenn aus PHP heraus nun ein Programm gestartet wird, sollten diesem diese FDs aber nicht zur Verfügung gestellt werden. PHP räumt hier aber in keiner Weise auf, so dass ein über PHP (mittels system(), exec() oder eines der diversen anderen Kommandos) gestartetes Programm auf diesen FD auch zugreifen kann. Und nicht nur das, es kann ihn sogar übernehmen!
Konkret heisst das, sobald man auf einem System Dateien hochladen kann, kann man damit ein PHP-Skript und ein kleines Programm hochladen. Dieses Programm wird nun über PHP gestartet, und schnappt sich die FDs vom Apache. Und kann nun zum Beispiel Web-Server spielen, ohne dass es von außen zu bemerken ist. Und damit auf den verbreiteten Shared-Hosting-Systemen, die viele Kundenpräsenzen mit einem Apache bedienen, auch die Anfragen an alle anderen Kunden sich unter den Nagel reißen. Und nicht nur das, auf alle Log- und sonstigen Dateien die der Apache offen hat (eventuell auch SSL-Zertifikate o.ä.) kann damit zugegriffen werden
Und nun stellt sich PHP da hin und meint, es wäre nicht ihr Problem. Von mir aus, dann sollten sie sich aber im Zuge einer Behebung doch selber darum sorgen, dass es im Apache oder wo auch immer sie meinen dass das Problem eigentlich herkommt, geschlossen wird. Wie gut, dass ich weder den Apache als Webserver noch PHP als Modul einsetze, da besteht dieses Problem nämlich nicht.