Remote Code Execution

Das wohl am meisten verbreitete Sicherheitsproblem innerhalb von PHP ist die "Remote Code Execution", meistens über Aufrufe des Dateisystems.

In aller Regel wird es problematisch, wenn Skripte externe Dateien über beispielsweise über require(), include(), fopen() etc. einbinden und der entsprechende Pfad von extern (z.B. bei register_globals=on) beeinflusst werden kann. Dann braucht ein Angreifer den Schadcode der zur Ausführung gelangen soll nicht auf den angegriffenen Server bringen, sondern kann ihn direkt aus dem Netz heraus einbinden.

Die Gründe für die Problematik sind:

  • Fehlende oder fehlerhafte Validierung von Benutzereingaben die in Dateisystem-Funktionen wie include() und fopen() verarbeitet werden
  • In der PHP Grundeinstellung erlaubt allow_url_fopen die Einbindung von Programmcode auch von ausserhalb der eigenen Domain
  • Fehlerhafte oder gar fehlende Zugriffseinschränkungen bei vielen Providern erhöhen das Risiko eines Zugriffs auf Bereiche ausserhalb der eigenen Webroot

Die seit PHP 4.0.4 gesetzte Grundeinstellung allow_url_fopen=on ermöglicht in vielen schlecht geschriebenen Skripten die Einbindung von entferntem Programmcode. Seit PHP 4.3.4 ist diese Einstellung darüberhinaus leider auch PHP_INI_SYSTEM, was bedeutet, dass ein lokales Überschreiben via ini_set() nicht mehr möglich ist. Dies führt dazu, daß gerade im Shared Hosting die Anwender in aller Regel auf gute Progammierung vertrauen müssen, da viele Provider allow_url_fopen auf on gesetzt haben.

Auch bei Vollzugriff auf die Server-Einstellungen sollte man beachten, daß 'allow_url_fopen=off' keinen Schutz vor php://input bzw data:// Inkludierung bietet - hier stellt derzeit wohl nur der suhosin-Patch für PHP eine Abhilfe dar.

Remote Code Execution (bzw. Remote Code Injektion oder auch einfach Code Injection) wird ab PHP 5.2 zumindestens ein wenig erschwert. Die folgenden Punkte sind den PHP 6 meeting notes von Derick Rethans entnommen:

We split allow_url_fopen into two distinct settings: allow_url_fopen and allow_url_include. If allow_url_fopen is off, then allow_url_include will be off too.

We enable allow_url_fopen by default.

We disable allow_url_include by default.

Leider schützen allow_url_fopen und das neu eingeführte allow_url_include nur gegen URL-Injektionen ala http(s) und ftp(s) aber nicht gegen php bzw. data (neu in 5.2.0) URLs, die suhosin-Extension stellt in diesem Punkt wohl weiterhin die einzig sicherer Lösung dar.


Netzwerke