Wie letzte Woche im Insecurity Bulletin berichtet hatte sich in die libXfont-Bibliothek eine Sicherheitslücke beim Verarbeiten von LZW-komprimierten Dateien eingeschlichen. Wie sich herausgestellt hat, enthält das Grafikprogramm Gimp (GNU Image Manipulation Program) einen ähnlichen Fehler. Er erlaubt es einem entfernten Angreifer, Buffer-Overflow-Attacken gegen Gimp-Anwender durchzuführen.
Da LZW-Komprimierung in so vielen Programmen zum Einsatz kommt, ist es nicht erstaunlich, dass neben der libXfont-Schwachstelle noch weitere diesbezügliche fehlerhafte Applikationen gefunden wurden. Gimp verwendet LZW zum Dekodieren von GIF-Dateien, und der für die Sicherheitslücke verantwortliche Programmierfehler befindet sich in der Datei “plug-ins/common/file-gif-load.c”. Dort ist die Funktion “LZWReadByte()” für das Verarbeiten von GIF-Dateien zuständig.
Das GIF-Format ist recht alt und erlaubt verlustfreie Komprimierung von Bildern mit einer geringen Farbtiefe von 8 Bit, das heißt, lediglich 256 verschiedenen Farben. Das für GIF-Dateien verwendete verlustfreie Komprimierungsverfahren basiert auf dem LZW-Algorithmus, der auch bei zahlreichen anderen Anwendungen zum Einsatz kommt. Für das Einlesen dieser LZW-Daten ist bei Gimp die Funktion “LZWReadByte()” zuständig, die das die Dekomprimieren übernimmt. Dies funktioniert genauso wie in libXfont. Auch hier tritt der spezielle Fall von KwKwK-Eingabedaten auf, der gesondert behandelt werden muss. An dieser Stelle hat sich in Gimp exakt der gleiche Fehler eingeschlichen wie in der X11-libXfont-Bibliothek, nämlich, dass der Fall eines zu großen neuen Datencodes für das Wörterbuch nicht korrekt behandelt wird:
if (code >= max_code)
{ *sp++ = firstcode; code = oldcode;
}
Dieses Code-Fragment ist praktisch identisch mit dem aus libXfont, und auch hier ist “sp” wieder ein Zeiger auf einen Puffer fester Größe:
static gint stack[STACK_SIZE], *sp; sp = stack;
Der Fall “code>max_code” sollte laut LZW-Spezifikation nicht auftreten, und führt im Gimp-Code zu einem durch die Zeiger-Arithmetik “*sp++” hervorgerufenen Buffer Overflow. Im Gegensatz zur libXfont-Schwachstelle handelt es sich hier um einen Stack Overflow, da “stack” nicht dynamisch mit “malloc()” auf dem Heap alloziert wurde. Aufgrund der Ähnlichkeit der Sicherheitslücken sieht auch das Gimp-Patch ähnlich aus wie das für die Bibliothek libXfont:
if (code == max_code) { if (sp < &(stack[STACK_SIZE])) *sp++ = firstcode; code = oldcode;
}
Ein entfernter Angreifer kann diese Schwachstelle ausnutzen, indem er eine speziell konstruierte GIF-Datei an einen Anwender schickt, der diese mit Gimp öffnet. In diesem Fall werden die vom Angreifer gewünschten Befehle mit den Rechten des Anwenders ausgeführt.
Betroffen ist die Gimp-Version 2.6.11.

