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? |
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: <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: