Die Suhosin-Extension ist eine von vielen Möglichkeiten, den PHP Core vor mehr oder weniger gefährlichen Sicherheitsrisiken zu bewahren und dadurch die Allgemeinsicherheit zu verbessern. Ich möchte in diesen Artikel die Suhosin Extension vorstellen und später ein paar Schritte zur Konfiguration erläutern.
Das Hardened-PHP Project: Suhosin ist ein weitverbreitetes Projekt vom bekannten Security Researcher Stefan Esser (@i0n1c). Ziel des Projektes ist es, zusätzlichen Schutz vor Angriffen aus dem Internet zu gewähren. Suhosin kann dabei entweder als PHP-Modul oder als PHP-Patch installiert werden – oder sogar kombiniert. Der Patch bietet u.a. die Zend Engine Protection als Schutz gegen Bufferoverflows und anderen Sicherheitslücken in der Zend Engine. Die Extension sorgt hingegen für mehr Sicherheit auf Anwendungsebene. Besonders auf Servern mit mehreren Benutzern kann eine passende Konfiguration sinnvoll sein.
Zu den Features zählen sich einige interessante Funktionen. Unter anderem findet man dort Session und Cookie Encryption sowie verschiedene Filter, welche gegen böswillige Benutzereingaben schützen sollen. Auch ein Script, welches nach jedem Upload ausgeführt wird um die Datei zu kontrollieren, kann eingestellt werden.
- Transparent Cookie Encryption
- Protects against different kinds of (Remote-)Include Vulnerabilities
- Protects against HTTP Response Splitting Vulnerabilities
- Adds protection against \0 attack on preg_replace()
- Transparent session hijacking protection
- Allows enforcing limits on REQUEST variables or separated by type (GET, POST, COOKIE)
- Adds protection against newline attacks to mail()
- … vollständige Liste
Die Installation ist einfach: Wie oben bereits genannt verwenden wir unter Debian-Systemen einfach apt um das Suhosin-Modul zu installieren (php5-suhosin). Unter vielen Distributionen wird der Suhosin-Patch bei der PHP Installation über die Repositories automatisch mitinstalliert. Wie eine manuelle Installation aussieht, könnt ihr hier nachschauen. Ansonsten sollte man nach einem Neustart vom Webserver bzw. PHP Prozess Manager in der phpinfo() einen Eintrag finden, welche Auskunft über die Einbindung der Suhosin-Extension und den eingestellten Optionen gibt.
Die richtige Konfiguration machts aus: Wir können nach der Installation die Einstellungen direkt in die jeweilige php.ini schreiben oder auch direkt die suhosin.ini verwenden (meistens unter /etc/php/conf.d/suhosin.ini). Hier können wir dann für alle verfügbaren Optionen die gewünschten Werte vergeben. Ein paar interessante Einstellungen möchte ich gerne vorstellen.
[php]
# Suhosin.
extension=suhosin.so
# Protokolliert alle Ausnahmen und Co. im syslog
suhosin.log.syslog = 511
# Wieviele Directory-Sprünge sind erlaubt?
# ../dir = 1, ../../dir = 2, ../../../dir = 3 usw.
suhosin.executor.include.max_traversal=4
# Deaktiviert /e in preg_replace (bzgl. RCE)
suhosin.executor.disable_emodifier=Off
# Folgende Funktionen dürfen nicht über eval() aufgerufen werden
suhosin.executor.eval.blacklist=include,include_once,require,require_once,
curl_init, …
# Deaktiviert eval() in allen PHP Aufrufen
# Kein Unterschied zur disable_function Direktive bekannt
suhosin.executor.disable_eval=Off
# Whitelist, welche Funktionen von PHP überhaupt benutzt werden dürfen
suhosin.executor.func.whitelist=echo, exit
# Was soll Suhosin bei Filter-Violation machen?
# 402 = HTTP 402 Response
suhosin.filter.action=402
# Maximale Längen von COOKIE, POST und GET.
suhosin.cookie.max_array_depth=4096
suhosin.cookie.max_array_index_length=2048
suhosin.cookie.max_name_length=2048
suhosin.cookie.max_value_length=650000
suhosin.cookie.max_vars=4096
suhosin.request.max_array_depth=4096
suhosin.request.max_array_index_length=2048
suhosin.request.max_name_length=2048
suhosin.request.max_value_length=650000
suhosin.request.max_vars=4096
suhosin.post.max_array_depth=8048
suhosin.post.max_array_index_length=1024
suhosin.post.max_name_length=2048
suhosin.post.max_totalname_length=8048
suhosin.post.max_vars=4096
# Schützt Mail-Formulare vor Spamattacken
suhosin.mail.protect=2
# Falls ein SQL Query fehlerhaft ist, wird dieser ohne
# Ausgabe von Informationen terminiert + protokolliert
suhosin.sql.bailout_on_error=On
# Aktiviert die Cookie Encryption
suhosin.cookie.encrypt=On
# Alle hochgeladenen Dateien werden erst über das Script überprüft
# Sehr interessante Implementationen möglich
suhosin.upload.verification_script=/var/verify.sh
[/php]