Friday, February 23, 2007

MS MIME Type Detection Prevention

Im letzten Eintrag blieb die Frage offen, wie man dem Ratespiel des Internet Explorers auf der Server Seite entgegen wirken kann. Ich denke ich habe dafür eine solide Lösung gefunden. Nach einigen Versuchen stellte sich heraus, dass die hard coded - tests von Microsoft bzw. die FindMimeFromData Funktion nichts anderes tun, als die ersten 256 Bytes des jeweiligen Dokumentes nach folgenden Strings zu untersuchen:

  • <html
  • <head
  • <body
  • <pre
  • <table
  • <a href
  • <img src ('src' situationsbedingt nicht notwendig)
  • <script>string</script>

Taucht einer dieser Strings auf, ist das für Microsoft ein eindeutiges Indiz dafür, dass es sich um ein valides HTML Dokument handelt und dementsprechend wird es vom Zauberbrowser MSIE ausgegeben.

Von daher ist es kein großer Aufwand mehr, ein entsprechendes Skript zu schreiben das die ersten Bytes daraufhin untersucht. In leicht abgewandelter Form sollte das Skript auch für andere Dateitypen verwendbar sein. - http://php-classes.net/image.rar

Soviel zur MIME Type Detection Prevention.

Tuesday, February 20, 2007

IE (Image) Header Injection

Es soll tatsächlich Leute geben die immernoch der Auffassung sind, dass der Internet Explorer sicher oder zumindest nicht unsicher sei. Denjenigen sei dieser Blogeintrag ans Herz gelegt.

Die Image Header Injection ist eigentlich eine schon länger bekannte Sicherheitslücke im Internet Explorer, jedoch hat Jungsonn sie vor einigen Tagen gewissermaßen ein zweites Mal entdeckt. Daraufhin entfachte im sl.ackers.org Forum eine heiße Diskussion, die ich zum Anlass nehme das ganze nochmal zusammenzufassen.

Wir sind vom Internet Explorer längst gewöhnt, dass er merkwürdige Dinge in jeglicher Hinsicht tut und auch die neuste 7.0 Version verhält sich nicht anders. Das meißte Aufsehen erregte in letzter Zeit der mhtml bug, der zusammengefasst einen Lesezugriff im Kontext des Browsers auf beliebige Webseiten ermöglicht und Angreifern dadurch ungeahnte Freiheiten verleiht.

Um beim Thema zu bleiben - was hat es mit Header Injection aufsich?
Der aufmerksame Leser wird bemerkt haben, dass ich "Image" in der Überschrift in Klammern gesetzt habe und das nicht ohne Grund. Diese Art von Header Injection bezieht sich nicht nur auf Bilder, sondern ist vermutlich in allen Dokumenttypen möglich. Es läuft darauf hinaus, dass beliebiger HTML Code, eingebettet in z.B. ein Bild, im Internet Explorer zur Ausführung gebracht werden kann.

Um die Ursache zu erklären, muss man jedoch etwas weiter ausholen (1):
Jede Datei auf einem Webserver ist mit einem Content-Type versehen, der Browsern mitteilt, wie weiter mit der jeweiligen Datei verfahren werden soll. Wäre der Content-Type text/html, würde das entsprechende Dokument als HTML dargestellt werden, image/png wäre ein Bild im PNG Format.

Danach sollte es verständlich sein, dass Dokumente nicht als HTML gerendert werden sollten, wenn als Content-Type nicht explizit text/html genannt wird. Dies ist der Punkt, wo sich der Internet Explorer verabschiedet und eigene Wege geht.

Microsoft implementierte ein Verfahren das sie Mime Type Dectection nennen. Die Grundidee ist bereits in RFC 2616 genannt und beschreibt ein Verfahren, bei dem die ersten paar hundert Bytes genutzt werden um daraus auf den Content-Type zu schließen, wenn dieser eben noch nicht explizit genannt wurde.

Das Problem an dieser Stelle ist, das Microsoft obiges Verfahren schlichtweg völlig falsch implementiert hat, was letztenendes die Ursache für den Header Injection Bug ist. Der Internet Explorer verdreht den Vorgang und versucht zuerst den Content-Type zu erraten, statt den ev. bereits vorgeschriebenen zu nehmen.

Stößt er bei diesem Topfschlagen Spiel auf HTML ähnliche Konstrukte wie <script>, rendert er das gesamte Dokument als HTML und führt dementsprechend den Code aus, womit man bei Cross Site Scripting angelangt wäre.

Ich denke es liegt auf der Hand wie gefährlich und verbreitet diese Sicherheitslücke ist. Es gibt unzählige one-click Image Hoster (z.B. http://imageshack.us) und in nahezu jedem bulletin Board lassen Grafiken in Form von Avataren hochladen. Dabei ist das nur ein Auszug.

Viele Entwickler implementieren Sicherheitsmaßnahmen die z.B. Grafiken auf Validität prüfen oder grundsätzlich Files auf den richtigen Mime-Type. Dadurch lassen sich die offensichtlichsten Angriffsvektoren abwehren, jedoch tippe ich das über 95% aller Webapplications durch den hier diskutierten Bug verwundbar sind. Im Grunde ist das nicht einmal verwerflich, denn wer kann kann schon mit Browser Bugs dieser Art rechnen. Das hat nichts mehr mit einem sicheren Programmierstil zutun, da diese Bugs einfach willkürlich auftreten. Man kann dem im Vorraus nur durch Erfahrungswerte und einem gewissen Gespühr entgegenwirken.

Im Gegensatz zu diversen Behauptungen, kann man seine eigenen Anwendungen aber durchaus vor diesen Angriffen schützen. Es bedarf lediglich einer Untersuchung des Quellcodes, des in Frage stehenden Dokuments, auf verdächtige Zeichenketten. In einem GIF ist kein <script> oder Ahnliches in der Form <blah> zu erwarten. Bei anderen Dokumenten könnte es unter Umständen komplexer werden, dazu werde ich zeitnah eine Funktion implementieren.

Fazit:
Zwar lassen sich die eigenen Webanwendungen vor entsprechendem Missbrauch schützen, prinzipiell ist man mit dem Internet Explorer jedoch allen Gefahren schutzlos ausgeliefert. Wer jetzt noch immer keinen Umstieg in Betracht zieht, dem scheinen seine Webaccounts einschließlich online banking nicht viel Wert zu sein.

Nachtrag:
Wie sich herrausstellte, ist selbst Google anfällig: Öffnen mit MSIE:
http://docs.google.com/File?id=ddh33ggd_4ndhddc
Auch Gmail habe ich mir angesehen, da ich vermutete, dass die Attachment Funktion auf gleiche Weise ausnutzbar ist. Das funktionierte jedoch nicht, da Google mein angehängtes PNG Bild offensichtlich in ein BMP umwandelte. (von Google behoben)

(1) Die Beschreibung beruht im Wesentlichen auf den Informationen aus dem Artikel MSIE faciltates Cross Site Scripting von http://splitbrain.org

Friday, February 09, 2007

Blogspot & Bugreports

When you report an XSS security problem in a web 2.0 site you usually assume it will get fixed as soon as possible. blog.php-security.org
Grundsätzlich sollte diese Annahme stimmen; aber Ausnahmen bestätigen bekanntlich die Regel. So auch auf blogger.com. Ich erinnere nochmal daran, dass ich vor über zwei Monaten eine Mail an das blogger team geschickt habe in der ich mitteilte, dass das Feed Plugin anfällig für Cross Site Scripting Attacken ist. Nur wenige Tage später erhielt ich eine Antwort von Nick, der mir für den Report dankte und versicherte, dass man sich um das Problem kümmern würde.

Wie man unschwer erkennen kann, ist in der Hinsicht noch nicht viel geschehen. Die XSS Lücke in der Suchfunktion von blogspot ist seit Monaten bekannt, auch hierum kümmert sich niemand.

Konsequenzen?
Natürlich keine. Die Authentifizierungs Cookies sind and die blogger.com Domain gebunden, was bedeutet, dass XSS auf blah.blogspot.com nicht weiter sicherheitsrelevant ist, wie im ersten Fall.

Das ist selbstverständlich völliger Unsinn. Ganz abgesehen von entsprechendem Session Riding (1), ist es ein leichtes an besagte Cookie Informationen zu kommen, indem man den Eigentümer des Blogs auf http://www2.blogger.com/display?blogID=xxx navigiert. Die blogID der Opferseite ist nicht zuletzt im HTML Quelltext zu finden.

(1) Auf www2.blogger.com wird in der Regel ein valider securityToken im POST Array vorrausgesetzt, die Verlässlichkeit auf solche Schutzmechanismen geht jedoch gegen Null, sobald Browser Bugs wie jünglichst der des Internet Explorers, ins Spiel kommen.

Thursday, February 08, 2007

The Art Of Deception

Ein guter Freund von mir war Anfang der Woche so freundlich und hat mir das Buch "The Art Of Deception" von Kevin Mitnick bestellt. Es gibt auch eine deutsche Übersetzung des Werkes, erfahrungsgemäß sind Originale aber ansprechender.

Von der Thematik her, fällt das Buch in meinen Interessenbereich und ich denke ich werde es recht schnell durchgelesen haben. Im Wesentlichen befasst sich Mitnick mit Social Engeneering, ein verhältnismäßig moderner Begriff, dessen Eigenschaften jedoch in der Natur des Menschen liegen und dementsprechend alt seien dürften.

Der Begriff Social Engineering bezeichnet eine auf psychologischer Analyse und Sozialkompetenz beruhende zwischenmenschliche Beeinflussung, die dazu dient, eine Zielperson dazu zu verleiten, vertrauliche Informationen weiterzugeben, auf die der Täuschende auf offiziellem Wege keinen Zugriff erhalten würde. Sie beruht häufig auf der Ausnutzung informeller sozialer Strukturen und immanenter psychologischer Verhaltensmuster.
Wenn ich es gelesen habe, werde ich nochmal genauer darauf eingehen. Vielen Dank an Benjamin Biel.

PHP Security From The Inside

Während der letzten Wochen hatte ich kaum Gelegenheit meinen Blog mit sinnvollen Informationen zu füllen, nicht zuletzt weil ich momentan in Planungen für ein umfangreiches Projekt verstrickt bin, über das ich zeitnah berichten werde.

Dennoch sei dieses Interview erwähnt, in dem Stefan Esser in recht gebündelter Form seine Ansichten bezüglich PHP & Application Security wiedergibt. Wer mehr über das Inside von PHP Security From The Inside wissen möchte, kann sich auf php.internals die noch recht jungen Threads Comments on PHP security und auch Is this what Stefan Esser was referring to ...? ansehen.