Der Web-Tausendsassa PHP kann auch Bilddateien bearbeiten, etwa auf gewünschte Dimensionen zurechtstutzen. Die zu diesem Zweck verwendete Grafikbibliothek GD lässt sich allerdings durch bösartig gewählte Größenangaben zum Absturz bringen.
Die Server-seitige Web-Skriptsprache PHP [1] vermag allerhand mit Grafikdateien anzustellen. Sie kann sie von Grund auf neu erzeugen, beschriften, drehen, beschneiden und vieles mehr. Einen ordentlichen Teil dieser Features verdankt sie der Open-Source-Bibliothek GD [2], die häufig als Komponente des PHP-Pakets mitgeliefert wird. Zwischen Dezember 2013 und Februar 2014 sind mehrere Sicherheitsprobleme in GD und damit auch in PHP aufgetaucht.
Schnipp, schnapp
Der Code in Listing 1 zeigt GD im Einsatz. Er legt zunächst ein leeres Bild von 100 mal 100 Pixel an, anschließend beschneidet er es mit fünf Pixeln x- und y-Versatz auf die Größe 10 mal 10 Pixel. Die C-Implementierung der hier verwendeten PHP-Funktion »imagecrop()« in Listing 2 überprüft den Typ des für »x« übergebenen Werts jedoch nicht und nimmt auch keine Typkonversion vor. Selbst wenn es sich um einen String oder ein Array handeln sollte, verarbeitet sie den Input, als wäre er ein Integer.
Listing 2
ext/gd/gd.c
01 [...]
02 gdRect rect;
03 [...]
04 if (zend_hash_find(HASH_OF(z_rect), "x", sizeof("x"), (void **)&tmp) != FAILURE) {
05 rect.x = Z_LVAL_PP(tmp);
06 } else {
07 [...]
Listing 1
Bild in PHP beschneiden
01 $img = imagecreatetruecolor(100, 100);
02 $img = imagecrop($img, array("x" => 5, "y" => 5, "width" => 10, "height" => 10));
Da diese Datentypen Pointer enthalten, kommt es zur Zugriffsverletzung (Segmentation Fault), wenn GD sie weiter verarbeitet. Das verursacht in jedem Fall einen Absturz des Prozesses, ein geschickter Angreifer könnte zudem Pointer auf Speicherbereiche verwenden, in denen er interessante Informationen vermutet. Weitere Spielarten, die GD-Schwäche auszunutzen, etwa via Null-Pointer-Dereferenzierung, beschreibt ein umfangreicher Eintrag im PHP-Bugtracker [3]. Aus diesem stammt auch Listing 3, das durch die Angabe einer großen Hexdezimalzahl für »x« einen Heap Overflow auslöst.
Listing 3
Heap Overflow
01 $img = imagecreatetruecolor(10, 10);
02 $img = imagecrop($img, array("x" => 0x7fffff00, "y" => 0, "width" => 10, "height" => 10));
Behebung
Diese Schwäche betrifft alle PHP-Versionen, die die Funktion »imagecrop()« enthalten – das sind PHP 5.5.0 bis einschließlich 5.5.8. Die Version 5.5.9 von Februar 2014 behebt das Problem. Einige Linux-Distributionen verwenden nicht die von PHP mitgelieferte, sondern die systemweit installierte GD-Bibliothek. Hier sind Admins mit der Libgd 2.1.0 auf der sicheren Seite. Sie stammt bereits vom Mai 2014.
Infos
- PHP Hypertext Processor: http://php.net
- Grafikbibliothek GD: http://www.libgd.org
- PHP-Security-Bug #66356: https://bugs.php.net/bug.php?id=66356





