PHP-Sicherheit Gefahren und Lösungsansätze Christopher Kunz <christopher.kunz@hardened-php.net>
Über Christopher Kunz Wohnt und arbeitet in Hannover PHP-Erfahrung seit 1999 Mitglied im Hardened-PHP Project URLs http://www.christopher-kunz.de/ http://www.hardened-php.net/ http://www.php-sicherheit.de/ 2
Weiterführende Informationen Christopher Kunz, Peter Prochaska PHP-Sicherheit dpunkt.verlag 2006 (2. Auflage 2007) ISBN 3-89864-369-7 36,00 3
Agenda Aktuelle Entwicklungen in Webapp- Security Client-Side Angriffe Server-Side Angriffe Härten des Webservers / PHP Request Filtering mit Apache-Modulen (Alle Slides werden auch online sein!) 4
So sieht's aus... "Wurm schlängelt sich durch MySpace" "StudiVZ: Belohnung für Sicherheitslücken" "Web-Kalender Kronolith lässt sich Code unterschieben" "dev!l`z Clanportal - SQL Injection [061124a]" 5
Aktuelle Problemfelder Angriffe gegen Nutzer Cross-Site Scripting (XSS) Cross-Site Request Forgery (CSRF) Angriffe gegen Server SQL Injection Command Injection Local/Remote Code Execution 6
Angriffe gegen den Nutzer Nutzer webbasierter Applikationen sind gefährdet! Aktuelles Beispiel: StudiVZ Ausspähen sensitiver Informationen per JavaScript/DOM Ausnutzen von Browser-Komfort für eigene Zwecke ( AutoVervollständigung ) Sehr große Spanne an Möglichkeiten 7
XSS Cross-Site-Scripting Grundidee: Zonenmodell moderner Browser austricksen Angreifer sucht Möglichkeit, eigenen Code (JavaScript, nicht PHP/Perl o.ä.) auf Zielsite einzubetten Browser des Opfers führt diesen Code aus Sicherheitszone: Die der Zielsite 8
XSS Einfache Beispiele Bei Formular-Textfeldern "><script>alert('xss')</script> ' onfocus=javascript:alert('xss') In HTML-Tags <IMG SRC="javascript:alert('XSS');"> <BODY BACKGROUND="javascript:alert('XSS')"> XSS Cheatsheet enthält mehr Beispiele http://ha.ckers.org/xss.html 9
XSS - Komplexität Durch DOM beliebige Manipulationen am Dokumentbaum möglich Ersetzen von Text Austauschen von Formularfeldern / -zielen Automatischer Versand von Formularen Durch Browserkomfort (Paßwort-Safe) auch Login-geschützte Seiten kein Problem 10
XSS und "Web 2.0" Moderne Websites sind überladen mit JavaScript (AJAX, Besuchertracking etc.) Injektion von HTML-Tags oft nicht nötig Eine verwundbare JS-Variable reicht Komplette Anwendung ist nicht mehr vertrauenswürdig Bei Webmail etc. praktisch unbegrenztes Abuse-Potential Auch nett: JS in Quicktime, Cross-Domain XML per Flash 11
XSS und PHP Hauptgrund: Ungeprüfte Ausgabe von Userinput echo $_GET['irgendwas'] PHP-Gegenmittel htmlentities(); strip_tags() Kein Administratorenproblem 12
SQL Injection Angriffe gegen Datenbanklayer Manipulation ungenügend geprüfter SQL- Queries Fehlende Typ-/Inhaltsprüfung Resultat: Verfälschtes Resultatset Auslesen privilegierter Daten Umgehung von Autorisierung / Authentifizierung Je nach DBMS: Zugriff aufs Dateisystem 13
SQL Injection in PHP Angreifbares Query: $query = "SELECT is_authorized FROM users WHERE username = '". $_POST['username']. "' AND password = '". $_POST['password']. "'"; $_POST['username'] = "admin' /*" Authentifizierung umgangen 14
SQL Injection: Gegenmaßnahmen Usereingabe nicht vertrauen! Maskieren von SQL-Sonderzeichen mysql_real_escape_string($_post['usernam e'] Prepared Statements mysqli->prepare() etc. Hauptsächlich Entwicklerproblem 15
Angriffe gegen den Server Automatisierte Scans nach verwundbaren Applikationen Professionelles Management der Angreifer Zunehmende professionelle Tools Ziel: Server rooten / als Spambot verwenden Das IST ein Administratorenproblem 16
Klassifikation Local/Remote Code Injection Arbitrary file inclusion meist "dank" eval/include und Konsorten Klassiker: include($_get['page']) Königsklasse: Nachladen von Exploitcode per HTTP Neu in PHP: Stream-Handler data: - praktisch für Exploits 17
C99shell 18
r57shell.php 19
Defacing Tool Pro v2.5 20
"PHP ist unsicher!" Oft verbreitetes "Argument" gegen PHP Nicht PHP ist unsicher, sondern PHP- Anwendungen Schwache Typisierung erleichtert Entwicklerfehler Ist C schuld an Sendmail oder Bind 7? Allerdings: Lücken im PHP-Kern noch immer (zu) häufig Tainted Mode fehlt nach wie vor 21
Bordmittel für PHP-Security Geeignete Auswahl der SAPI CGI/FastCGI statt mod_php Separation der Nutzer mittels suexec Eigene php.ini pro Nutzer Auch versch. PHP-Binaries pro Nutzer möglich ini-einstellungen für mehr Sicherheit 22
Safe Mode UID/GID Checks bei Dateioperationen Seit PHP 4 in PHP, stets Notlösung Extension-abhängig, häufige Lücken in der Vergangenheit Wird in PHP 6 abgeschafft Oft falsches Gefühl der Sicherheit 23
open_basedir open_basedir=/var/www/kunde1 Überprüft bei Dateioperationen Verzeichnis Direktive gibt Basisverzeichnis an, außerhalb dessen nicht zugegriffen werden darf Im Beispiel: include("/etc/passwd") wird verhindert 24
disable_functions disable_functions="system,passthru,eval" Funktionen selektiv verbieten Wird oft für Prozeßkontroll- /Systemfunktionen eingesetzt Unerwünschte Seiteneffekte Kompatibilitätsprobleme 25
system() und Co. PHP-Funktion system() forkt Shell Oft für Helper-Binaries wie ImageMagick Eingesetzt u.a. bei Typo3 Problem: Shell + Binaries kümmern sich nicht um Safe Mode Sicherheitsleck! Lösung: Keine externen Binaries zulassen! 26
allow_url_fopen Großes Problem für PHP-Anwendungen: Include auf unsichere Ziele Direktive "allow_url_fopen Off" verbietet Öffnen von URLs komplett Unerwünschte Nebenwirkungen Seit PHP 5.2.0: "allow_url_include" berücksichtigt nur include/require(_once) Empfehlung: Ausschalten! 27
Register Globals Registrierung von Requestvariablen als globale Variablen Aus $_GET['foo'] wird $foo Häufig noch aktiviert, obwohl seit 4.2.0 default off register_globals on vereinfacht unsauberen Code register_globals Off! Immer! register_globals verschwindet in PHP 6 28
Suhosin Freier Patch / Extension für PHP vom Hardened-PHP Project Früher: "Hardened-PHP" bzw. "Hardening Patch for PHP" Per php.ini konfigurierbar http://www.suhosin.org/ 29
Extension / Patch Funktionalität aufgeteilt in PHP-Extension Patch für PHP-Quellcode Extension kompatibel zu allen anderen PHP- Extensions Suhosin-Teile können unabhängig voneinander genutzt werden Verfügbar in OpenSUSE, diversen BSDs, Gentoo, Debian etc. 30
Suhosin-Patch Schutz gegen Overflows Canary Protection für Zend Memory Manager Schutz gegen Formatstring-Angriffe 31
Suhosin: Simulationsmodus Konfiguration: suhosin.simulation Tut alles, nur keine richtigen Aktionen Sehr nützlich zum Überprüfen auf Probleme mit lokaler Installation Testen / Austarieren der Blacklist / Whitelist 32
Suhosin: Variablen-Features Variablenfilter GET/POST/COOKIE darf keine geschützten Variablen enthalten Variablenlänge, Variablenzahl, Arraytiefe etc. limitierbar Superglobals gegen extract() etc. geschützt 33
Suhosin: Runtime-Features Rekursionstiefe limitierbar memory_limit kann nicht mehr vom User geändert werden Neue realpath() Funktion 34
Suhosin: Whitelist/Blacklist Per Vhost konfigurierbar Whitelist für Funktionen Blacklist für Funktionen Zwei Modi Normal Innerhalb eval() 35
Suhosin: Include-Filter (Konfigurierbares) Verbot von include auf... URLs (Blacklist/Whitelist möglich) Überlange Dateinamen (BSD) Abgeschnittene Dateinamen (%00) Hochgeladene Dateien Schutz gegen Directory Traversal (../../etc/passwd ) 36
Suhosin: Diverse Features Kryptographiefunktionen CRYPT_BLOWFISH-Algorithmus für crypt() Sha256() und sha256_file() für Message Hashing Transparente Cookieverschlüsselung Transparente Verschlüsselung von Sessiondaten Umfangreiches Logging 37
mod_security Freies Apache-Modul Analyse eingehender Requests Blacklist-Approach Regex-basierte Regeln Aktuelle Versionen: 1.9.x / 2.0 Grundlegende Änderungen in 2.0 38
mod_security: Features Überprüfung des gesamten Scopes oder einzelner Bestandteile (GET, POST, Cookie etc.) Überprüfung von XML-Dokumenten mit xpath Sprachunabhängig Logging / IDS-Funktionalität chroot-umgebung für Apache 39
mod_security Installation Download von http://www.modsecurity.org/ Version 1.9 apxs -cia mod_security.c apachectl stop / start Fertig! Version 2.0 Makefile editieren (top_dir =/usr/local/apache2) make; apachectl stop; make install Konfiguration apachectl start 40
mod_security: Konfiguration LoadModule security2_module modules/mod_security2.so SecRuleEngine [On Off DetectionOnly] Vor 2.0: SecFilterEngine SecServerSignature PwnServer/1.0 SecChrootDir /home/chroot 41
mod_security: Regeln Regeln bestehen aus 2-3 Komponenten optional: Wo? (Variablen-Scope) Was? (Filterausdruck) Was tun? (Aktion) SecFilter prüft gesamtes Scope SecFilterSelective prüft Teilscope In mod_security 2: SecRule SecRule VARIABLES OPERATOR [ACTIONS] 42
mod_security: Scoping REQUEST_URI REQUEST_HEADER:Content-Length ARGS ARGS!ARGS:safe ARGS:unsafe Regexp: ARGS:/^pageid_/ XML:/xPath/Expression etc. 43
mod_security: Operatoren Pre-2.0: Regexp für Regeln 2.0: viele zus. Funktionen Performance-Impact! Operatoren Numerisch: eq, ge, gt, le, lt Regexp: rx (impliziert durch Regex am Regelbeginn) rbl RBL-Lookup z.b. auf REMOTE_ADDR etc. SecRule ARG:id "@gt 0" 44
mod_security: Aktionen pass An dieser Regel vorbeilassen allow An allen Regeln vorbeilassen deny HTTP-Status 403 senden (= status:403) status:x HTTP-Status x senden redirect:x HTTP-Redirect auf URI x exec:x externes Executable x ausführen nolog, log Meldung (nicht) loggen skipnext:x Nächste x Regeln überspringen chain Verkettung mit nächster Regel pause:x Ausführung um x ms verzögern u.a.m. 45
mod_security: Fazit Blacklistansatz unnütz gegen 0Day Fängt mit passenden Rulesets extrem viele automatisierte Exploits "Web-IDS" im DetectionOnly-Modus 46
mod_parmguard Freies Apache-Modul Analyse eingehender Requests Apache 1.3, 2.x Whitelist-Ansatz XML-Konfigurationsdateien 47
mod_parmguard Whitelist-Ansatz gilt allg. als sicherer Keine "überflüssigen Variablen" Klare Definition der möglichen Schnittstellen Constraints Datentyp Wertebereich Bei Aufzählungen: Mögliche Optionen 48
mod_parmguard: Installation Download von http://www.trickytools.com/php/mod_parm guard.php./configure withapxs[2]=/usr/sbin/apachectl make && make install apachectl stop / start Fertig! 49
mod_parmguard: httpd.conf Konfiguration innerhalb von <Location>- Blöcken <Location /> ParmguardEngine On ParmguardConfFile /etc/parmguard.xml </Location> 50
mod_parmguard: XML-Konfiguration Konfigurationssprache: XML Validierung gegen mitgelieferte DTD Schachtelung / Gruppierung von Parametern Benutzung herkömmlicher XML-Tools zur Generierung möglich <url> <match>foobar.php</match> [parameter] </url> 51
mod_parmguard: Beispiel <form> <input type="text" name="name"> <input type="text" name="plz"> <input type="submit"> </form> <xml version="1.0"?> <!DOCTYPE parmguard SYSTEM "mod_parmguard.dtd"/> <parmguard> <global name="http_error_code" value="403"/> <url> <match>adresse.php</match> <parm name="name"> <type name="string"/> <attr name="maxlen" value="20"/> <attr name="charclass" value="^[a-za- Z]+$"/> </parm> <parm name="plz"> <type name="integer"/> <attr name="minval" value="00000"/> <attr name="maxval" value="99999"/> </parm> </url> </parmguard> 52
mod_parmguard: Fazit Interessanter Ansatz für kontrollierte Umgebung Aufwand kaum vertretbar bei großen Anwendungen Für Administratoren Variablenliste schwer zu erstellen 53
Vielen Dank Slides online: http://www.phpsicherheit.de/ Fragen? Kontakt: christopher.kunz@hardenedphp.net 54