Christian Seiler: safe_mode = Off ?? Wie macht ihr es?

Beitrag lesen

Hallo!

Naja, ich lasse mich gerne eines besseren belehrens, wenn du mir also etwas detailierte Schildern könntest wann es wie zu Problemen mit den Rechten kommt, sprich was muss ich wie hochladen, welche Datei wird ausgeführt und führt zu Problemen bei den Rechten?

Der Safe-Mode ist deprecated, er ist nicht ohne Grund in PHP 6 nicht mehr enthalten. Der Hintergrund ist nämlich folgender: Der Safe-Mode versucht ein Problem zu lösen, dessen Aufgabe es eigentlich nicht ist, von PHP gelöst zu werden.

Das Problem ist nämlich folgendes: Wenn man PHP als Modul installiert, dann läuft es mit den Rechten des Webserver-Users - und der ist in der Regel der gleiche für jeden virtuellen Host (es gibt zwar einige experimentelle MPMs für den Apache, die den ganzen Apache für verschiedene Hosts laufen lassen, aber produktionsreif sind die allesamt nicht - zudem bringen die noch andere Probleme mit sich). Wenn jetzt aber in einer Shared-Hosting-Umgebung Scripte von verschiedenen Kunden unter dem gleichen Benutzer laufen, dann können die sich ja auch gegenseitig in die Quere kommen. Das ist selbstverständlich schlecht, sehr schlecht. Andererseits war aber PHP als Modul lange Zeit die einzige performante Alternative zur reinen CGI-Ausführung. Bei CGI wird ein anderer Prozess gestartet, der dann natürlich unter einem anderen User laufen kann, als der Webserverprozess selbst (nennt sich beim Apache suexec).

Was macht nun also der Safe-Mode? Mal abgesehen davon, dass einige potentiell gefährliche Funktionen deaktiviert werden, wird folgendes überprüft: Wenn auf eine Datei zugegriffen werden soll, wird verglichen, ob der Eigentümer der Datei mit dem Eigentümer des Scripts, das gerade ausgeführt wird, übereinstimmt. Wenn nicht, gibt's eine Fehlermeldung und die Operation wird verboten.

Dies führt zu folgendem Problem: Das Anlegen eines Verzeichnisses funktioniert noch problemlos, da das Verzeichnis, in dem man das Unterverzeichnis anlegt, noch dem User des Scripts gehört. Auch der Zugriff auf das Unterverzeichnis funktioniert noch. Will man aber in dem Unterverzeichnis eine Datei anlegen, dann versagt das - weil das Verzeichnis, das die Datei enthalten soll, NICHT mehr dem Eigentümer des Scripts gehört. Man kann also im Safe-Mode nicht mit Unterverzeichnissen arbeiten! Es gibt *etliche* Anwendungsfälle, in denen die Verwendung von dynamisch generierten Unterverzeichnissen enorm (!) praktisch ist.

Zudem bietet der Safe-Mode keine wirkliche Sicherheit vor Leuten, die wirklich etwas anstellen wollen. Es gibt immer irgend welche Möglichkeiten, den Safe-Mode zu umgehen, weil die Checks eben nur in PHP selbst durchgeführt werden, nicht aber im Betriebssystem. Der Hosting-Betreiber gewinnt also ein vermeintliches Sicherheitsgefühl, ohne dass die Sicherheit tatsächlich vorhanden ist!

Zum Beispiel gibt es etliche PHP-Erweiterungen, die auch installiert sind. Es sind etliche Beispiele denkbar, wie man mit Erweiterungen den Safe-Mode umgehen kann. Zum Beispiel wurde jüngst entdeckt, dass man mit der curl-Erweiterung den Safe-Mode umgehen kann, eine gepatchte PHP-Version ist noch nicht veröffentlicht worden (einen Patch gibt es aber glaube ich bereits). Außerdem: Wenn man Fremdsoftware ausführt mittels system() o.ä., dann gelten die Safe-Mode-Limitierungen von PHP selbstverständlich nicht mehr! Klar, im Safe-Mode kann der Admin einschränken, dass nur Software aus einem bestimmten Verzeichnis ausgeführt werden können darf. Damit kann der Admin kontrollieren, dass nur Software, die er zulässt, ausgeführt werden darf. Problem dabei ist nur, dass der Admin dann sicherstellen müsste, dass die Software es nicht zulässt, die Safe-Mode-Limitierungen von PHP zu umgehen. Das *kann* er aber nicht wirklich - und eine derartige Möglichkeit ist im Normafall keine Sicherheitslücke in der Software selbst, sondern meist nur ein zusätzliches Feature (der Autor der Fremdsoftware hat die ja idR. nicht primär zur Verwendung innerhalb von PHP mit Safe-Mode geschrieben, sondern als Tool, das unter einem bestimmten User ausgeführt wird und dem User innerhalb der Limitierungen, die der Kernel bietet, das maximum an Features anbietet).

Es gibt außerdem noch einige weitere Einschränkungen des Safe-Modes, die im Endeffekt legitime Features stark einschränken, ohne dabei wirklich Sicherheit zu schaffen.

Die PHP-Entwickler haben dies auch eingesehen und entfernen den Safe-Mode aus PHP ab Version 6. Es gibt ihn dort also nicht mehr. Die Entwickler stellen sich inzwischen dankenswerterweise auf den Standpunkt: Der Kernel soll Einschränkungen forcieren.

Das heißt aber auch, dass PHP als Modul für Shared Hosting keine dauerhafte Lösung ist. Zum Glück gibt es im Gegensatz zur Anfangszeit von PHP nun auch eine brauchbare Alternative zur Modul-Variante von PHP: FastCGI. Mittels FastCGI ist es möglich, eine vergleichbare Performance wie PHP als Modul zu erreichen, die PHP-Scripte jedoch dennoch in separaten Prozessen ausführen zu lassen und somit unter einem anderen User (idR. der User, dem das Script gehört) in Erscheinung treten zu können. Damit braucht man irgendwelche Krücken wie den Safe-Mode nicht mehr und erreicht außerdem eine wirkliche Sicherheit, die mit dem Safe-Mode nicht erreichbar ist.

Viele Grüße,
Christian