Suhosin

Aus THM-Wiki
Wechseln zu: Navigation, Suche

Suhosin ist ein Schutzmechanismus für PHP-Applikationen. Erklärtes Ziel ist die Absicherung von Web-Servern und somit auch deren AnwenderInnen, sowohl vor bekannten als auch potentiellen Schwachstellen in PHP-Applikationen und dem PHP-Kern selbst.

Allgemeines

Suhosin

"Suhosin" ist Südkoreanisch und bedeutet in etwa "Schutzengel". Die Wahl dieser Bezeichnung hat ihren Ursprung sicherlich teilweise im Interesse einer der beteiligten Entwickler für die koreanische Kultur, Sprache und Küche. Sie trifft aber auch recht genau Intention und Wirkungsweise des Systems.
Suhosin entspringt dem Hardened-PHP Project und ist als Nachfolger des dort entstandenen und weit verbreiteten Hardening Patch anzusehen. Es besteht aus zwei unabhängig verwendbaren Teilen. Einer PHP-Extension, die den Hauptteil der Schutzfunktionalitäten beinhaltet, und einem Patch gegen den PHP-Kern zum Abfangen von "low-level" Anfälligkeiten (z.B. "buffer overflows" etc.).


Das Hardened-PHP Project

Das Hardened-PHP Project wurde 2004 gegründet und besteht aus Stefan Esser, Christopher Kunz und Peter Prochaska. Die Mitglieder sind annerkannte Experten mit langjähriger Erfahrung im Bereich PHP und Sicherheit. Sie bieten über das Projekt kommerzielle Dienstleistungen für die Betreiber von PHP-basierten Webanwendungen an, wie etwa Sicherheits-Audits oder Code-Reviews. Daneben ist das Projekt aber auch Quelle für freie Informationen und Software zum Thema PHP-Sicherheit.

Motivation

PHP als Implementierungssprache für Web-Anwendungen erfreut sich großer und rasch ansteigender Beliebtheit. Die Lernkurve ist (scheinbar) flach. Es existiert ein breites Angebot an Literatur und Online-Quellen, die insbesondere den Einstieg in PHP erleichtern sollen. Sicherheitsaspekte stehen hierbei jedoch meist nicht im Vordergrund. Gleichzeitig ist PHP aber eine sehr mächtige Sprache. Es existieren eine Reihe von bekannten Schwachstellen bzw. Sprach-Features, die bei sorgloser oder inkorrekter Programmierung zu erheblichen Sicherheitsproblemen auf den betroffenen Systemen führen können. Die Gefahr der "remote code inclusion", also des (unerwünschten) Ausführens von aus externen Quellen geladenen PHP-Codes innerhalb der Anwendung sei hier als prominentes Beispiel genannt.
Die Suhosin-Extension setzt an dieser Stelle an. Sie bietet die Möglichkeit, bekannte Schwachstellen und sicherheitskritische Programmiertechniken durch entsprechende Konfigurationseinstellungen von vornherein abzublocken.
Abhängig vom konkreten Szenario ist der Einsatz der Suhosin-Extension also immer dann zu erwägen, wenn die Qualität des eingesetzten PHP-Codes nicht sichergestellt werden kann. Insbesondere, wenn Fremdanwendungen gehosted werden, ist dies wohl nur schwer, bzw. mit hohem Aufwand möglich.

Aber auch bei sorgfältiger Programmierung der Anwendung und Konfiguration der PHP-Umgebung kann es durch Schwachstellen im PHP-Kern selbst, wie z.B. Puffer-Überläufen oder Format-String Anfälligkeiten zu Sicherheitslücken kommen. Der Suhosin-Patch implementiert Schutzmaßnahmen, um die Zend-Engine selbst gegen solche "low level" Anfälligkeiten abzusichern. Er ist dabei in der Lage, auch bisher unbekannte Anfälligkeiten im PHP-Kern zu erkennen [1].
Der Einsatz des Suhosin-Patch kann daher grundsätzlich als sinnvoll angesehen werden, da solche Schwachstellen in der Vergangenheit immer wieder aufgetreten sind und von EntwicklerInnen gar nicht, bzw. nur bei genauen Kenntnissen der PHP-Internas umgangen werden können.


Lizenz und Verfügbarkeit

Suhosin ist unter der PHP License Version 3.01 lizensiert.
Die Suhosin-Extension ist derzeit in der Version 0.9.20 verfügbar, der Suhosin-Patch in der Version 0.9.6 (für PHP-Versionen von 4.3.11 bin 5.2.4).

Funktionsweise

Die prinzipielle Funktionsweise von Suhosin besteht darin, alle Aktionen, die ein PHP-Skript vornimmt, gegen Regeln zu prüfen, die in der Suhosin-Konfiguration hinterlegt sind. Verstößt ein Skript gegen diese Regeln (beispielsweise durch den Aufruf einer Funktion, die in einer blacklist hinterlegt ist), wird dessen Ausführung abgebrochen. Analog können Benutzereingaben, bzw. generell die Parameter von HTTP-Anfragen geprüft oder gefiltert werden (z.B. die Verwendung geschützter Variablennamen oder das Hochladen ausführbarer Dateien).
Das Blockieren von Aufrufen, die der Suhosin-Konfiguration widersprechen, stellt hierbei lediglich das Default-Verhalten dar. Es können andere Aktionen eingestellt werden, wie etwa das Senden eines bestimmten HTTP Response Code, die Weiterleitung der HTTP-Anfrage oder die Ausführung eines PHP-Skripts.
Alle von Suhosin vorgenommenen Aktionen werden protokolliert. Per Default geschieht dies in syslog, es können aber andere Ausgabeformate bis hin zu eigenen Logging-Skripten konfiguriert werden.
Suhosin stellt außerdem zusätzliche Kryptographie-Funktionalitäten zur Verfügung.

Eine bemerkenswerte Eigenschaft von Suhosin ist der sogenannte "Simulationsmodus". Hierbei werden Maßnahmen, die auf Grund der Konfiguration greifen würden, nicht tatsächlich durchgeführt, sondern lediglich protokolliert. Dies erleichtert den Test und die Abstimmung der Suhosin-Konfiguration, ohne den laufenden Betrieb einer PHP-Anwendung zu gefährden.

Eigenschaften

Es folgt eine Auflistung wichtiger Eigenschaften von Suhosin. Eine ausführliche Liste ist auf der Homepage des Projektes zu finden [2].

  • Schutz des PHP-Kerns (Suhosin-Patch)
    • Schutz der Hauptspeicherverwaltung vor Puffer-Überläufen
    • Schutz vor „format string“-Anfälligkeiten
    • Schutz von Zend-Destruktoren (Hashtables, Linked Lists)
    • Patch binärkompatibel, also auch mit anderen PHP-Erweiterungen nutzbar
  • Schutz zur Ausführungszeit
    • Transparentes Verschlüsseln von Cookies
    • Sicherer Schutz vor Remote Code Inclusion Anfälligkeiten
    • Möglichkeit zum Deaktivieren von eval()
    • Black-/Whitelisting von Funktionen (auch gesondert für per eval() ausgewertete Funktionen)
    • Möglichkeit zur Konfiguration einer maximalen Rekursionstiefe
    • Schutz von super-globalen Variablen
  • Filter-Funktionen
    • Ignorieren von Request-Parametern mit reservierten Namen (z.B. _SERVER, _SESSION, ...)
    • Definition von Einschränkungen (Anzahl Variablen, Länge Varibalennamen, Verschachtelungstiefe von Arrays usw.)
    • Verifikation von hochgeladenen Dateien durch externe Skripts
    • Unterdrücken von ausführbaren (binären) hochgeladenen Dateien
  • Logging
    • Unterstüzung verschiedener Ausgabeformate
    • Detailierte Informationen (Dateinamen, Zeilennummern, IP-Adressen der auslösenden Anfrage usw.)
  • Verschiedenes


Installation

Der Einsatz von Suhosin ist vor Allem unter Linux und im Zusammenhang mit LAMP-basierten Webservern verbreitet. Im Folgenden soll daher exemplarisch die Installation auf Debian 4.0 (etch) vorgestellt werden. Die Vorgehensweise bei anderen Linux-Distributionen (z.B. Fedora [3], CentOS [4], OpenSuse [5], Mandriva [6]) ist ähnlich, bzw. ist dort Suhosin bereits in den entsprechenden PHP-Paketen enthalten.
Suhosin-Patch und -Extension können unabhängig voneinander und je nach Anwendungsfall einzeln oder gemeinsam installiert werden (siehe Motivation und Eigenschaften).

Suhosin-Extension

Die Suhosin-Extension ist als Paket im Debian (etch) Repository verfügbar. Sie kann also problemlos über apt-get installiert werden.

apt-get install php5-suhosin

Diese Vorgehensweise bietet sich insbesondere an, wenn die Extension ohne den Suhosin-Patch installiert werden soll.
Für einen gemeinsamen Betrieb mit dem Patch ist es möglicherweise sinnvoll, die Extension aus einem Repository zu installieren, das eine bereits mit Suhosin gepatchte PHP-Version anbietet (siehe Suhosin-Patch).

Suhosin-Patch

Die Quellen der aktuellen PHP-Version 5.2.0-8+etch4 von Debian (etch) sind bereits gepatcht und mit Suhosin nicht mehr kompatibel. Das Erstellen und Installieren von mit dem Suhosin-Patch versehenen Paketen aus dem originalen Debian-Repository (wie etwa in [7]) ist daher nicht möglich.
Es ist natürlich generell möglich, PHP ausgehend von den ursprünglichen Quellen mit Suhosin zu patchen und zu installieren, diese Vorgehensweise ist auf der Homepage des Hardened-PHP Projekts [8] beschrieben.
Hierbei würde allerdings die Debian-Paketverwaltung umgangen, die durch stabile und gewartete Software-Pakete entscheident zur Sicherheit und Stabilität des Systems beiträgt.
Eine Alternative bietet hier das Dotdeb-Repository, das aktuelle und gewartete Pakete für Debian LAMP-Server bereitstellt. Über dieses Repository kann ein aktuelles, bereits mit dem Suhosin-Patch versehenes PHP 5 unter Debian (etch) installiert werden, wahlweise auch gemeinsam mit der Suhosin-Extension.

Zur Installation von Suhosin aus dem Dotdeb-Repository muss zunächst ein entsprechender Mirror in der Datei /etc/apt/sources.list hinterlegt werden. Hierzu müssen der Datei -falls noch nicht vorhanden- folgende Zeilen hinzugefügt werden (exemplarisch für den Mirror dotdeb.netmirror.org):

deb http://dotdeb.netmirror.org/ stable all
deb-src http://dotdeb.netmirror.org/ stable all

Eine Liste mit internationalen Mirrors ist auf der Dotdeb-Homepage zu finden [9].

Danach muss die Debian Paket-Liste aktualisiert werden.

apt-get update

Nun können die benötigten PHP-Pakete installiert werden.

apt-get install <paketname>

Für den Einsatz auf einem LAMP-Server müssen typischerweise folgende Pakete installiert werden (php5-suhosin ist hierbei die Suhosin-Extension):

  • libapache2-mod-php5
  • php-pear
  • php5-cli
  • php5-common
  • php5-curl
  • php5-dev
  • php5-gd
  • php5-ldap
  • php5-mysql
  • php5-pspell
  • php5-suhosin
  • php5-xmlrpc

Bei dieser Vorgehensweise werden gegebenenfalls andere Pakete (wie etwa MySQL oder Apache), die auf einem LAMP-Server typischerweise vorhanden sind und zu denen eine Abhängigkeit besteht, mit aus dem Dotdeb-Repository aktualisiert.
Ist dies nicht erwünscht, müssen die PHP-Pakete gezielt und einzeln installiert/aktualisiert werden, z.B. über das Paketverwaltungs-Werkzeug dselect.


Konfiguration

Suhosin wird über Einträge in der PHP-Konfigurationsdatei php.ini konfiguriert, bzw. über entsprechende Einträge in einer dort inkludierten Datei.
Der Suhosin-Patch ist nach Installation aktiv und bedarf keiner weiteren Konfiguration. Die Suhosin Logging-Eigenschaften werden aber auch vom Patch unterstützt.
Für die Extension stehen eine Vielzahl von Konfigurationsparametern zur Verfügung, diese sind auf der Suhosin-Homepage im Detail dokumentiert [10].
Für alle Parameter greifen Default-Werte, so dass die Extension (nach ihrer Aktivierung in php.ini) auch ohne weitere Konfiguration genutzt werden kann. Diese Default-Einstellungen sind für "normale" Anwendungsfälle optimiert und sollten einen weiten Bereich von üblichen Web-Anwendungen abdecken.
Der aktuelle Status der Suhosin-Parameter (incl. Default-Werten) kann über phpInfo() abgefragt werden.

Exemplarisch sollen hier Einträge vorgestellt werden, die den Suhosin-Simulationsmodus aktivieren und die Funktion phpInfo() auf die Blacklist setzen.

# configuration for php suhosin module
extension=suhosin.so

; Misc Options
suhosin.simulation = On

; Executor Options
suhosin.executor.func.blacklist=phpinfo


Literatur

  • Christopher Kunz, Stefan Esser, Peter Prochaska: PHP-Sicherheit. 2., aktualisierte und überarbeitete Auflage. dpunkt-Verlag, Heidelberg 2007, ISBN 978-3898644501.

Weblinks


--Keim-MKe 00:21, 5. Nov. 2007 (CET)