archiv.galad.com

   

Texte


Internet Explorer Crash

2003-10-26

Seit dem Neudesign unserer Webseiten kämpften wir mit einem sporadisch auftretenden Fehler, den wir uns nicht erklären konnten: Beim Aufruf der Seiten stürzt der Internet Explorer mit einer Fehlermeldung ab und wird beendet. Die Abstürze erfolgten nicht nachvollziehbar und nach keinem besonderen Schema, unabhängig von Betriebssystem- und Browserversion, unabhängig davon ob eine direkte Internetverbindung bestand, oder der Zugang über einen Proxy erfolgt.

Halbwegs zuverlässig konnten wir nur dies sagen: Beim Aufruf einer lokal gespeicherten Kopie passiert nichts, und ein Windows 98 mit einem Internet Explorer 5 ohne Service Packs und ohne aktuelle Patches zeigt die Seiten am zuverlässigsten an, während die aktuellen Systeme mit aktuellem Patchlevel die größten Probleme mit den Seiten haben. Zudem betrifft dieser Fehler nur den Internet Explorer.

Nach stundenlangen erfolglosen Debug-Sessions der Javascripte und der Seitenstrukturen sind wir vor einigen Tagen durch Zufall darauf gestoßen, dass dieses Problem bereits Anfang September Diskussionsthema auf der <Full-Disclosure> Liste war.


New Microsoft Internet Explorer mshtml.dll Denial of Service?

<Threadansicht>



Die Ursache der ganzen Probleme war ausgerechnet das Gif-Bild, das als reines Layout-Hilfsmittel gar nicht in Erscheinung treten sollte: Ein 42 Byte großes, transparentes 1 Pixel Gif, das zum Aufspannen des äußeren Seitenrahmens mit dem Farbverlauf verwendet wird.


http://www.galad.com/frame/e1x1.gif

0000  47 49 46 38  39 61 01 00  01 00 80 00  00 FF FF FF  GIF89a..........
0010  00 00 00 21  F9 04 01 00  00 00 00 2C  00 00 00 00  ...!.......,....
0020  01 00 01 00  00 00 01 01  00 3B                     .........;


Dieses Bild ist defekt - alle Gif-Header sind in Ordnung, aber die vorletzten 4 Byte, die die eigentlichen LZW-komprimierten Bilddaten enthalten, sind ungültiger Datenmüll. Ein korrektes Gif sieht z.B. so aus:


0000  47 49 46 38  39 61 01 00  01 00 80 00  00 FF FF FF  GIF89a..........
0010  00 00 00 21  F9 04 01 00  00 00 00 2C  00 00 00 00  ...!.......,....
0020  01 00 01 00  00 02 02 44  01 00 3B                  .......D..;


Die 4 Byte Datenmüll sorgen für den Absturz des Internet Explorers. Genauer gesagt, für den Absturz desjenigen Teils der mshtml.dll, der für das Rendern von Gif-Bildern zuständig ist. Um die Sache noch abstruser zu machen, passiert dies jedoch nur im Zusammenhang mit dem Online-Download. Ist das Bild einmal im Browsercache angekommen oder wird es lokal abgerufen, treten keine Probleme auf.


<009483>

My feeling is that the following facts:
- rendering engine of IE, complemented with the "online" download of the image
- possible malformation of the image
lead to this outcome (browser crash).
There must be some code inside mshtml.dll that "crashes" when parsing the image.


<009506>

It appears the subroutine that parses the gif image allocates a buffer of length based on the size indicated in the data block. Then it proceeds to read the data block, looking for a 0x00 (or some other end-of-block identifier) to quit. It doesn't limit itself to the block size when copying data from the file.

I have not been able to determine whether this is a heap or stack overflow.

However, after some fiddling, I have found this problem also affects explorer.exe. Copy the file to a folder in windows, and turning on your image preview pane (web content pane, whatever that rubbish is on the left side) while viewing that directory. Then click on the file, and when the preview pane tries to render the image, sometimes it crashes.

Since a seperate thread of execution does the parsing, race conditions are probably what is making the crashes inconsistent.


<009511>

It seems that there is a real and new security hole existent.

I sent an email to secure-at-microsoft.com, so that they can verify the existence of the bug and publish a bugfix.



Es wäre natürlich nett gewesen, uns auch noch eine Nachricht zu schicken. Wir möchten aber nicht ausschließen, dass die entsprechende Nachricht in der täglichen Spamflut untergegangen und ungelesen gelöscht worden ist, je nachdem wie geschickt der Betreff gewählt wurde. :(
Nichtsdestotrotz geht unser Dank an die Full-Disclosure Liste für das "Debugging" unserer Website - zu spät, um uns graue Haare zu ersparen, aber früh genug zur Vermeidung der Glatzenbildung.

Warum uns dieser Fehler nicht bereits bei der Entwicklung aufgefallen ist, hat hauptsächlich zwei Gründe:

Zum einen zeigten die verwendeten Bildbetrachter nichts an - also genau das, was man von einem durchsichtigen, ein Pixel großen Bild auch erwarten würde. Auch der jetzt nachträglich getestete Import in einige Applikationen funktionierte ohne Widerspruch.

Zum anderen hat der Rahmen, in dem das transparente Gif zum Einsatz kommt, eine Dicke von 6 Pixeln. Dies ist für die meisten Browser zu wenig, um das Standardbild für ein fehlendes oder defektes Bild anzuzeigen. Dadurch sahen auch die Webseiten genau so aus, wie wir es erwartet haben.


32x1 32x2 32x3 32x4 32x5 32x6 32x7 32x8
32x9 32x10 32x11 32x12 32x13 32x14 32x15 32x16
32x17 32x18 32x19 32x20 32x21 32x22 32x23 32x24
32x25 32x26 32x27 32x28 32x29 32x30 32x31 32x32


Nach unseren letzten Tests mit aktuellem Patchlevel ist dieser Fehler noch nicht behoben worden. Deshalb ist hier eine kleine Testseite, die eine einfache Tabelle mittels des defekten "galadbug.gif" aufspannt:

   Internet Explorer Crashtest

TopOfDoc