Spanische Wurst für PHP-Sicherheit

Die schlechte Sicherheitslage von Webapplikationen auf PHP-Basis soll der webbasierte Security-Scanner Chorizo der Würzburger Softwareschmiede Mayflower bekämpfen. Wir zeigen, was man vom Produkt erwarten kann und was nicht.

Artikel erschienen in Swiss IT Magazine 2006/18

     

Mit der Sicherheit von Webapplikationen ist es nicht weit her. So konstatiert beispielsweise Symantec in ihrem Internet Security Threat Report von September 2006, dass 69 Prozent aller gefundenen Schwächen in Softwareprodukten im ersten Halbjahr 2006 in Webapplikationen gefunden wurden. Dies verwundert kaum, weil schon auf der Sicherheits-Mailingliste Bugtraq jeden Tag Meldungen über Fehler in Webapplikationen über den Bildschirm tickern. Und am häufigsten involviert ist eine bekannte Scriptsprache: PHP.


Auf in den Kampf

Den Kampf gegen diesen Missstand haben sich die PHP-Experten der Würzburger Mayflower auf die Fahnen geschrieben und mit Chorizo einen Security Scanner für PHP-Applikationen auf den Markt geworfen. Dieser soll allerlei Programmierfehlern und potentiellen Angriffsstellen in PHP-Code zu Leibe rücken.
Beim Produkt handelt es sich um einen gehosteten Service, der in einer kostenlosen und einer kostenpflichtigen Variante erhältlich ist. Die beiden Ausprägungen von Chorizo unterscheiden sich in der Anzahl der Hosts, die gescannt werden können, und im Funktionsumfang. So fehlen der kostenlosen Version beispielsweise der Advisor oder Morcilla (siehe weiter unten).





Ebenfalls erhältlich ist eine Intranetversion, die samt Hardware im eigenen (abgeschlossenen) Netzwerk installiert werden kann. Diese bietet im Unterschied zum gehosteten Service die Möglichkeit, Seiten auf nicht öffentlichen Servern zu scannen. Ansonsten unterscheidet sich die Intranetversion funktional nicht vom gehosteten Service.
Getestet haben wir die kostenpflichtige gehostete Version, die für 289 Euro im Jahr erhältlich ist. Zum Einsatz kam dabei ein Linux-Server mit Apache 2.0 und PHP 5.1.
Chorizo besteht im Moment aus zwei Komponenten: Einerseits dem gehosteten Service, der die Tests ausführt und die etwas harmloseren Fehler wie Cross Site Scripting oder Information Disclosure abdeckt, und einer PHP-Erweiterung namens Morcilla, die auf dem Zielserver installiert werden muss und sich um die schwerwiegenden Fälle wie SQL Injections kümmert. Bei Morcilla stand uns lediglich eine Vorab-Version zur Verfügung, die allerdings schon alle Features enthalten soll. Die endgültige Version sollte bei Erscheinen des Artikels bereits verfügbar sein.


Neugieriger Proxy

Beim Security-Scanner handelt es sich nicht um ein Standalone-Programm, das einfach gestartet wird und auf Knopfdruck seine Arbeit erledigt, wie man dies vielleicht erwartet. Chorizo wird vielmehr als Proxy zwischen Anwender und Zielserver gehängt. So kann Chorizo die Kommunikation zwischen Browser und Zielserver überwachen und anhand der jeweiligen Aktionen Tests ausführen. Dies hat den grossen Vorteil, dass nicht erst mühsam Scan-Abläufe erfasst werden müssen und der Scanner mit realen Daten arbeitet. Die Steuerung von Chorizo erfolgt über einen Layer, der mit Hilfe von ein bisschen JavaScript vom Proxy automatisch eingefügt wird.
Um Chorizo in Betrieb zu nehmen, muss zuallererst ein von Mayflower bereitgestellter Server als Proxy konfiguriert werden. Für die populären Browser wie Internet Explorer und Firefox liegen illustrierte Anleitungen sowie Tips für Erweiterungen vor, mit denen sich im laufenden Betrieb Proxies wechseln lassen. Der Einsatz einer derartigen Erweiterung bietet sich an, da sonst auch der reguläre Internet-Traffic über den Mayflower-Server geroutet wird.




Um einen Server respektive eine Webapplikation scannen zu können, muss die zugehörige Domain im Kunden-Panel von Chorizo registriert werden. Dabei ist darauf zu achten, den Full Qualified Domain Name zu verwenden und diesen auch zu benutzen, wenn die Seiten gescannt werden, da sonst Chorizo nicht funktioniert. Im Rahmen der Registrierung der Domain wird ein Schlüssel generiert, der heruntergeladen und im Document Root des Zielservers plaziert werden muss. Ohne diesen Key verweigert Chorizo den Dienst. Dabei handelt es sich um einen Schutz, der verhindert, dass Dritte die eigenen Applikationen scannen können und umgekehrt. Diese Vorsichtsmassnahme ist nötig, da Chorizo in der gehosteten Version nur auf öffentliche, sprich ungeschützte Server zugreifen kann. Ob das Hinterlegen des Key erfolgreich war, zeigt das Steuerungsmodul an, das vom Proxy eingeblendet wird.


Schnüffeln im Innern

Zur Einrichtung von Morcilla muss man auf dem Zielserver aktiv werden, da es sich um eine PHP-Erweiterung handelt. Die Installation von Morcilla erfolgt entweder vom Quellcode aus (Anleitung liegt bei), was für geübte Administratoren mit wenigen Handgriffen, autoconf, make und gcc, zu erledigen sein sollte. Für Anwender von Windows sollen demnächst auch vorkompilierte Binaries bereitstehen. Unterstützt wird PHP 4 und höher in allen Versionen. Beschränkungen bezüglich der verwendeten Webserver und der PHP-Anwendung bestehen nicht – Morcilla verträgt sich mit allen von PHP unterstützten SAPIs. Einziger Fallstrick: Wie es die meisten PHP-Extensions an sich haben, die mit dem Sprachkern interagieren und die Scriptausführung überwachen respektive manipulieren, vertragen sie sich äusserst schlecht mit Artgenossen. Das heisst, eine parallele Verwendung von Morcilla, Zend Platform, xdebug oder Bytecode Cache wie APC ist nicht möglich.


Eifriger Manipulator

Die Arbeitsweise von Chorizo ist grundsätzlich ziemlich simpel. Es werden die Daten, die zwischen Client und Server hin- und hergeschickt werden, mitgeschnitten und dann vom Proxy aus zusätzliche Requests ausgeführt, bei denen versucht wird, durch Manipulation der Daten Zeichenketten in die Seiten einzuschleusen.

Dieses Script ist durch die ungefilterte Nutzung von $_REQUEST["name"] anfällig auf Cross Site Scripting (XSS). Ruft man test.php ohne Parameter auf und lässt es von Chorizo prüfen, werden noch keine Probleme gemeldet, da die Request-Variable name nicht gesetzt ist. Somit sieht sie Chorizo nicht und kann sie auch nicht manipulieren, sodass der Fehler unentdeckt bleibt. Dies ändert sich in dem Moment, in dem man den Parameter setzt: test.php?name=jane&number=1. Testet man diesen Aufruf mit Chorizo, werden die angehängten Parameter registriert und manipuliert. Nach einem kurzen Augenblick ist die Meldung da, dass JavaScript in $_REQUEST["name"] (und zusätzlich noch $_GET["name"]) eingeschleust werden konnte.





Auf diese Weise werden die meisten möglichen Angriffsszenarien eines nach dem anderen durchprobiert, nebst Cross Site Scripting unter anderem Remote Code Execution und Remote Code Inclusion, wobei vor allem letzteres interessant gelöst ist: Mit der Überwachung von Fehlermeldungen, die von PHP ausgegeben werden, entdeckt Chorizo auch Code Inclusions, wenn diese mindestens optisch keine Auswirkung auf das Script haben. Die Überwachung reagiert dabei spezifisch auf Fehler, die von bei falscher Anwendung gefährlichen Funktionen wie file_get_contents() oder include() ausgegeben werden. Derartige Fälle werden auch rapportiert, wenn man PHP angewiesen hat, keine Fehler anzuzeigen (error_reporting(0) respektive display_errors=off). Dies, indem Chorizo dem Script vordefinierte URLs unterschiebt und dann überwacht, ob diese durch den Zielserver abgerufen werden, was ein unfehlbares Indiz für Remote Code Inclusion ist. Allerdings hat die Erkennung der Code Inclusion noch einige Schwächen: Wer beispielsweise in file_get_contents() vergebens versucht, eine lokale Datei auszulesen, kriegt bei aktivierter Anzeige von PHP-Fehlern ebenfalls von Chorizo einen Code-Inclusion-Fehler angezeigt. Dies kann beispielsweise dazu führen, dass Chorizo eine Code Inclusion in $_SERVER["USER_AGENT"] bemängelt, die Variable in der gesamten Applikation aber gar nicht benutzt wird.




Ähnlich wie das Aufspüren von Code Executions funktioniert das Detektieren von SQL Injections. Auch hier probiert Chorizo, durch Manipulation den Datenbankserver und damit PHP zu einer Fehlermeldung zu provozieren.
Neben diesen gravierenden Fehlern wird man auch auf Kleinigkeiten wie offene Apache-Verzeichnisse (Directory Indices) oder Information Disclosure hingewiesen, bei der sich beispielsweise Rückschlüsse auf die aktuelle PHP-Versionsnummer ziehen lassen (expose_php=on).


Wächter der Zend Engine

Wurde die Anzeige von Fehlern in PHP deaktiviert oder operiert man mit Funktionen, die keine Ausgaben liefern, ist Chorizo aufgeschmissen und kann keine Fehler entdecken, da es nur von aussen auf die Applikation schauen kann. Hier kommt nun die bereits erwähnte Extension Morcilla ins Spiel. Sie überwacht Funktionen und untersucht, ob Eingaben von aussen (in diesem Fall von Chorizo) zur Ausführung gebracht werden können. Überwacht werden Datenbankfunktionen auf SQL Injections oder die verschiedenen Dateizugriffs- und Shell-Funktionen, ob es beispielsweise möglich ist, lokale Dateien auszulesen oder Befehle auf der Maschine auszuführen.


Praktische Auswertungen

Die Bedienung ist einfach gestaltet. Beim Scan-Vorgang kann man zwischen drei verschiedenen Betriebsmodi wählen: einem manuellen Scan der aktuellen Seite, einem rekursiven Scan über eine vordefinierte Anzahl Ebenen (0 bis 3) und einem automatischen Scan beim Absurfen der Webseite. Die Tests werden per Knopfdruck ausgelöst, worauf man, sobald die Tests für die jeweilige Seite abgeschlossen sind, einen kurzen Statusreport erhält. Dieser informiert darüber, wie viele Tests ausgeführt, Sicherheitslücken gefunden wurden und wie gravierend sie sind. Die Details zu den gefundenen Sicherheitslücken findet man im Chorizo-Online-Profil. Eine Zusammenfassung mit Kuchen- und Balkengrafiken informiert grob über die Fehlerverteilung und impliziert damit quasi den Handlungsbedarf. Dazu findet man eine Listung der verschiedenen gefundenen Fehler, wieder klassiert nach Grad der Bedrohung. Ein detaillierter Bericht bestehend aus der betroffenen URL, dem Code, der eingeschleust werden konnte, und einer allgemeinen Beschreibung wird mitgeliefert. Dazu gehören auch generische Code-Beispiele, die zeigen, wie sich das jeweilige Problem beispielsweise lösen liesse. Zudem erhält man weiterführende Links, die das Thema vertiefen. Neben der Aufstellung im Web erhält man PDFs, welche die gleichen Informationen zusammengefasst zum Ausdruck und geordneten Abarbeiten im Team bereitstellen.


Automatismen versus Handarbeit

Wir haben Chorizo und Morcilla eine Auswahl von Beispielcodes vorgelegt, die verschiedene Sicherheitslücken enthielten und die zudem unterschiedlich schwer zu knacken waren. Die einfachen Beispiele, bei denen die Variablen quasi nackt aus dem Request übernommen wurden, hat Chorizo alle gefunden, ebenso die offenen Apache-Verzeichnisse. Bei den schwierigeren Beispielen, bei denen HTML-Code oder System­pfade aufgefüllt werden mussten, zeigte Chorizo allerdings einige Schwächen. Während Code Inclusions oder HTTP-Header-Injections Hand in Hand mit Morcilla schnell aufgedeckt wurden, wurde beispielsweise eine ungefilterte Verwendung von $_SERVER["PHP_SELF"] erst nach einem kleinen Schubser erkannt. Das Auffüllen einer Cross-Site-Scripting-Lücke in einem HTML-Tag wurde dagegen wieder problemlos gemeistert.




Dies ist zwar ein zufriedenstellendes Resultat, was aber nicht heisst, dass eine Applikation, bei der Chorizo keine Fehler gefunden hat, frei von Käfern ist. Denn bei der Verwendung von Chorizo muss man sich einiger Einschränkungen bewusst sein, die auch ein Grund dafür sind, dass Chorizo keinen manuellen Audit ersetzen kann.
Neben der bereits erwähnten Blindheit für nicht verwendete Variablen, die sich mit einem richtig konfigurierten Error Reporting entdecken lassen, kann die Software beispielsweise Lücken oder Design Flaws nicht entdecken, die sich mit formal korrekten Anfragen ausnutzen lassen. Ein prominentes Beispiel für einen derartigen nicht zu erkennenden Fehler war die Anmeldung zur Supercard-Kreditkarte von Coop. Dort war es möglich, durch Angabe einer anderen Datensatz-ID und somit formal korrekten URL die Anträge von anderen Kunden einzusehen. Solche Fehler können im Moment nur vom Menschen entdeckt werden, da Chorizo nicht in der Lage ist, zu beurteilen, ob ein Kunde autorisiert ist, Inhalte zu sehen oder nicht. Ebenso problematisch sind auch umfangreiche Text-Transformationen, wie sie beispielsweise von Transformatoren für Markup-Sprachen wie Textile oder Markdown durchgeführt werden. Hier hängt der Input, der benötigt wird, um eine Lücke auszunutzen, derart stark von der genauen Implementierung ab, dass Löcher mit vordefinierten Pattern, wie sie Chorizo verwendet, kaum zu entdecken sind, sofern die richtigen Suchmuster fehlen.


Gute Ergänzung

Dies soll aber nicht heissen, dass es sich bei Chorizo nicht um ein nützliches Werkzeug handelt. Denn es ermöglicht schon bei der Entwicklung, Flüchtigkeitsfehler und einfachere Lücken zu entdecken. Dies sind meist auch diejenigen, die sich ohne Kenntnis respektive Analyse des Quellcodes ausnutzen lassen und entsprechend sehr gefährlich sind. Insofern hilft dies nicht nur den Programmierern, vom Start weg bessere Software auszuliefern, sondern hat auch einen edukativen Effekt, da sie direkt auf die Probleme und generischen Lösungsansätze hingewiesen werden. So kann bei weniger sensitiven Anwendungen ein Chorizo-Scan parallel zu bestehenden Qualitätssicherungsmassnahmen einen deutlichen Gewinn bringen, insbesondere, wenn ohnehin kein Geld für einen doch sehr teuren manuellen Audit zur Verfügung steht. Zudem ist Chorizo praktisch, um bei der Evaluation von Open-Source-Projekten in kurzer Zeit einen Eindruck über die Sicherheitslage zu erhalten.




Artikel kommentieren
Kommentare werden vor der Freischaltung durch die Redaktion geprüft.

Anti-Spam-Frage: Was für Schuhe trug der gestiefelte Kater?
GOLD SPONSOREN
SPONSOREN & PARTNER