Hardened-PHP

  • Von Stefan Esser, der sich in der Vergangenheit einen Namen als Sicherheitsexperte machen konnte [3] stammt das Projekt "Hardened-PHP" [4]. Die Zielsetzung dieses Patches für PHP4 und PHP5 war es, gegen in der Zend Engine auftretende Sicherheitslücken (Stack/Buffer Overflows, Off-by-one etc.) generische Schutzmechanismen zu implementieren, sowie unsichere PHP-Applikationen durch Ab- und Umschaltung bestimmter Features etwas zu entschärfen. Die volle Featureliste und Erklärung findet sich in der Dokumentation [5].


    Die aktuelle Version 0.2.6 ist in einer Version für PHP 4.3.10 sowie 5.0.3 verfügbar und liegt als komprimierte Patchdatei zum Download [6] bereit. Einige Linuxdistributoren stellen auch bereits angepasste PHP-Pakete bereit, die Hardened-PHP enthalten.


    Nach dem Entpacken wird der Quellenbaum von PHP mit "patch -p 1 < ../ hardened-php-4.3.10-0.2.6.patch" gepatcht und muß danach neu übersetzt werden. Hardened-PHP kennt einige Konfigurationsdirektiven, stellt aber für die meisten Anwendungen ausreichende Defaultwerte bereit, so daß es praktisch "out of the box" eingesetzt werden kann. Vorsicht ist nur für Benutzer des Zend Optimizers oder einer anderen Zend-Extension geboten: die Kompatibilität mit Hardened-PHP kann hier nicht sichergestellt werden.


    Im täglichen Umgang mit dem Webserver sollte der Administrator die Hardening-Features nicht bemerken - lediglich bei einem verhinderten Angriff auf den geschützten Webserver meldet Hardened-PHP die Art des Angriffs, IP des Angreifers und die angegriffene Datei per Syslog oder dem jeweiligen SAPI-Log (meist dem Apache-Errorlog). Ähnlich denAktionen bei mod_security kann Hardened-PHP nunmehr auch Scripts beim Eintreten einer Attacke ausführen, um so z.B. den Administrator per E-Mail oder SMS zu informieren.


    Der Patch für PHP steht unter der PHP License und wird von Stefan Esser kostenlos zur Verfügung gestellt. Durch die kontinuierliche Weiterentwicklung ist Hardened-PHP innerhalb kürzester Zeit zu einem empfehlenswerten Zusatz für jede PHP-Installation geworden, die weitgehend bedenkenlos eingesetzt werden kann. Es empfiehlt sich jedoch, vor dem produktiven Einsatz auf einem Testserver eventuelle Unverträglichkeiten zu eruieren und gegebenenfalls auszuräumen.

  • PHP ist die meistverbreitete Scriptsprache und wird auf Millionen Webservern weltweit genutzt. Diese Verbreitung macht es wichtig, daß PHP-Scripts und die PHP-Engine (Zend Engine bzw. ZE 2) gegen Sicherheitsprobleme resistent sind.


    Das Hardened-PHP Projekt wurde ins Leben gerufen, um diese Sicherheitsfragen zu lösen.


    Was ist Hardened-PHP?
    Hardened-PHP ist ein Patch, um PHP zu "härten" und den Server einerseits gegen Fehler in unsauber implementierten Anwendungen, andererseits gegen möglicherweise noch unentdeckte Sicherheitslücken in der PHP-Engine selber abzusichern.


    Entwicklungsgeschichte von Hardened-PHP
    Die Idee für eine gepatchte Version von PHP, die gegen Angriffe abgesichert ist, ist vielleicht so alt wie PHP selber. Im Jahr 2002 wurde das PHP-Auditing-Projekt von einigen OpenBSD-Benutzern ins Leben gerufen, nachdem von Stefan Esser diverse Advisories über von außen ausnutzbare Lücken in PHP herausgegeben wurden. Das gesamte Projekt war nicht wirklich erfolgreich - es schien recht unkoordiniert und die Mitglieder verloren mangels Resultaten schnell das interesse. In den folgenden Monaten wurden von Esser mehrere weitere Lücken in CVS-Versionen von PHP gefunden und vor dem Release behoben. Da aber die vorhandene Codebase von PHP sehr umfangreich ist, entschied er sich, das Hardened-PHP-Projekt ins Leben zu rufen. Das Projekt wurde wegen Zeitmangel allerdings mehrfach verschoben.


    Am 17.4.2004 wurde die erste Version von Hardened-PHP veröffentlicht - sie enthilet schon die meisten Features enthielt, die sich Esser für ein erstes Release gewünscht hatte. Das Projekt wurde nicht öffentlich gemacht, bis ein Unbekannter ein Posting über Hardened-PHP auf symlink.ch absetzte. Die vorläufige Webseite für das Projekt wurde daraufhin von einigen Besuchern gesehen.


    Nach einem Redesign am 16.5.2004 wurde die Dokumentation in einer ersten Version online gestellt und Hardened-PHP 0.1.1 mit einigen kleineren Fixes veröffentlicht.


    Einstellungen für den Variablenfilter
    Alle Werte sind in der Klasse PHP_INI_SYSTEM. Die Defaultwerte werden in ext/varfilter/varfilter.c definiert und können über einen Eintrag in php.ini geändert werden.


    Direktive
    Standardwert
    Erklärung

    varfilter.max_request_variables
    200
    Anzahl der Variablen, die in einem Request vorkommen dürfen.

    varfilter.max_varname_length
    64
    Maximale Länge für einen Variablennamen

    varfilter.max_value_length
    1000
    Maximale Länge für einen Variablenwert

    varfilter.max_array_depth
    100
    Maximale Tiefe für Arrays


    Änderungsvorschläge
    Ein Wert von 1000 Bytes für varfilter.max_value_length erscheint viel zu gering. Ein mittleres Forumsposting umfaßt bereits mehr als 1 KB Daten, von einem Artikel für ein CMS o.ä. ganz zu schweigen. Dieser Wert sollte demnach so erhöht werden, daß keine Breakage für vorhandene Applikationen auftritt.


    Man kann relativ leicht in Erfahrung bringen, ob der voreingestellte Wert für die eigene Installation zu gering ist: Finden sich im Syslog verdächtig viele Einträge der Form Oct 19 16:26:38 localhost php security-alert: tried to register a variable with a too long value (attacker '') , die keiner konkreten Angriffssituation zugeordnet werden können, so ist es wahrscheinlich, daß der Wert von max_value_length zu gering ist.



    http://www.christopher-kunz.de/Hardened_PHP.73.0.html