Risiko durch MIME-Sniffing im Internet Explorer

Das Hochladen von Bildern gehört zum Pflichtkatalog für Web-2.0-Anwendungen. Doch Besonderheiten des Internet Explorers verlangen sorgfältige Beachtung -- ansonsten schleicht sich schnell Cross-Site-Scripting-Potenzial für Angriffe auf Besucher ein.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 10 Min.
Von
  • Henry Sudhof
Inhaltsverzeichnis

Um ihre Besucher vor möglichen Angriffen durch JavaScript zu schützen, betreiben viele große Portale einiges an Aufwand, etwa durch die Implementierung besonderer Filter zum Schutz vor aktiven Inhalten. Grundsätzlich ist es bei den meisten ohnehin nicht möglich, eigene aktive Inhalte wie JavaScript, HTML-Code oder Flash Applets in Profile, Blogs oder Foren einzustellen. Allerdings bieten die meisten Mitmach-Seiten das Hochladen und Einbinden eigener Bilder an. Damit können Angreifer allerdings eine aus Kompatiblitätsgründen und für mehr Sicherheit eingeführte Funktionen des Internet Explorer missbrauchen. Der Angriff funktioniert denkbar einfach: In den Anfang eines Bildes bettet man einfach HTML-Code zusammen mit JavaScript ein. Beim Öffnen eines derart manipulierten Bildes erkennt der Internet Explorer den Code im Bild und führt ihn aus – statt einfach nur das Bild anzuzeigen.

Kern des Problems sind die verschiedenen Wege, den Typ einer Datei zu ermitteln. Eine Dateiendung .jpg signalisiert etwa ein Bild im JPEG-Format. Der Webserver kann im HTTP-Header zudem den Content-Type definieren, hier image/jpg. In der Regel ermittelt er den Typ aber anhand der Dateiendung der aufgerufenen Datei. Und schließlich kontrollieren die meisten Webbrowser noch die ersten Bytes einer Datei (die Signatur) auf bekannte Bytefolgen wie PNG, PK, JFIF und so weiter.

Der Internet Explorer fügt eine vierte Methode hinzu: Das mit dem Internet Explorer 4 eingeführte MIME-Sniffing (auch als Mime Type Detection bekannt). Alle IE-Versionen glauben damit nicht automatisch, dass eine Datei aus dem Internet den Typ hat, den der Server im HTTP-Header als Content-Type überträgt. Auch der Dateierweiterung und der Signatur allein vertraut er nicht mehr. Stattdessen schaut der Internet Explorer zusätzlich in die ersten 256 Bytes einer Datei hinein, um den Dateityp zu ermitteln. Dieses Verhalten tritt jedoch nur beim Download einer Datei auf, wenn der Anwender die URL direkt aufruft. Lokal gespeicherte Dateien verursachen beim Öffnen im Internet Explorer ebensowenig Probleme wie Bilder, die der Browser über Image-Tags (IMG) in HTML-Seiten einbindet.

Ursprünglich sollte MIME-Sniffing vor der fehlerhaften Signalisierung des Content-Types durch den Server schützen. Angreifer hatten auf diese Weise Schutzfunktionen im Internet Explorer umgangen, die verhindern sollten, dass der Browser heruntergeladene Dateien wie .hta-Dateien automatisch ausführt. Zudem macht MIME-Sniffing den Browser fehlertolerant gegenüber versehentlich falsch übertragenen Content-Types: Sendet der Server etwa text/plain und liefert dann doch eine HTML-Datei aus, so verarbeitet der Internet Explorer sie als HTML.

So lange die Dateiendung, der Content-Type und die Signatur den gleich Dateityp signalisieren, ignoriert der Browser das Ergebnis des MIME-Sniffs bei den gängigen Formaten gif, jpeg und png. Erst wenn die Ergebnisse inkonsistent sind, behandelt der Internet Explorer die Datei anhand des beim MIME-Sniffs erkannten Typen.

Was einst dem Schutz des Anwenders vor bösartigen Servern und dem Admin als nützliche Hilfestellung für seinen falsch konfigurierten Server diente, kann nun im Web 2.0 zum Einfallstor werden. Widersprechen sich Erweiterung, Content-Type und Signatur, orientiert sich der Browser am Inhalt der Datei. So kann unter Umständen ein auf den ersten Blick harmloses Bilder gefährlich werden, wenn es am Anfang Teile von HTML-Code enthält. Denn dann rendert der Internet Explorer diesen Code. Angreifer haben auf diesen Weg die Möglichkeit, JavaScripte in Bilder einzubetten – was das Tor für Cross-Site-Scripting-Angriffe öffnet. Ein Angreifer könnte beispielsweise mit präparierten Bildern seinem Opfer das Authentifizierungs-Cookie für den gerade besuchten Server stehlen und sich selbst damit anmelden (siehe auch Passwortklau für Dummies, ... oder warum Cross Site Scripting wirklich ein Problem ist).

Die folgenden drei Bilder demonstrieren das Problem in seinen Ausprägungen. Ist im Internet Explorer JavaScript alias ActiveScripting erlaubt, erscheint bei den Beispielen zwei und drei eine Warnung: "Sie sind verwundbar".

  • Im ersten Beispiel stimmen alle Angaben überein, sodass der Internet Explorer das JavaScript im PNG-Bild nicht ausführt. Die Erweiterung ist PNG, der Content-Type ist image/png und die Signatur ist ebenfalls PNG:
    security_logo.png, Content-Type: image/png, Signatur: PNG, Internet Explorer führt enthaltenes JavaScript nicht aus.
  • Für das zweite Beispiel haben wir die Erweiterung dieser Datei auf JPG geändert. Der Server erkennt dies und sendet als Content-Type: image/jpeg. Die Signatur signalisiert weiterhin eine PNG-Datei, weshalb der Internet Explorer das MIME-Sniffing startet, den eingebetteten HTML-Code findet und das JavaScript ausführt:
    security_logo.jpg, Content-Type: image/jpeg, Signatur: PNG, Internet Explorer führt enthaltenes JavaScript aus.
  • Im dritten Beispiel handelt es sich um eine BMP-Datei, bei der auf den ersten Blick alles korrekt aussieht: Die Erweiterung ist BMP und die Signatur am Anfang der Datei signalisiert ebenfalls BMP. Dennoch wird es vom Internet Explorer als text/html interpretiert. Das liegt unter anderen daran, dass unser Server (und viele andere auch) als Content-Type image/bmp übertragen, obwohl es eigentlich image/x-ms-bmp heißen müsste.
    security_logo.bmp, Content-Type: image/bmp, Signatur: BMP, Internet Explorer führt enthaltenes JavaScript aus.