Open Source im professionellen Einsatz

PHP Integer-Overflow lässt Angreifer Befehle ausführen

Die PHP-ZipArchive-Klasse stellt einem PHP-Entwickler verschiedene Funktionen zum Umgang mit komprimierten Zip-Dateien bereit. Der Programmierer kann so beispielsweise sehr einfach den Inhalt von in dem Zip-Archiv enthaltenen Dateien lesen:

<?php
   $zip = new ZipArchive;
   if ($zip->open('test1.zip') === TRUE) {
         echo $zip->getFromName('testfromfile.php');
         $zip->close();
   } else {
         echo 'Fehler';
   }
?>

In den »ZipArchive::getFromName()« und »ZipArchive::getFromIndex()« Methoden wurden nun kürzlich Schwachstellen entdeckt, die es einem entferntern Angreifer erlauben Befehle mit höheren Rechten auf dem System auszuführen. Hierzu muss er eine speziell konstruierte Zip-Datei erzeugen und diese an sein Opfer leiten. Das kann er beispielsweise über eine Web-Upload-Funktion erreichen. Die vom Angreifer gewünschten Befehle werden dann mit den Rechten der PHP-Applikation ausgeführt. Der hierfür verantwortliche Programmierfehler befindet sich in einer Speicherallokation in der »php_zip_get_from()«-Funktion. Hier werden unter anderem folgende Befehle aufgerufen:

PHP_ZIP_STAT_INDEX(intern, index, 0, sb);                                     len = sb.size;
buffer = zend_string_alloc(len, 0); 
n = zip_fread(zf, ZSTR_VAL(buffer), ZSTR_LEN(buffer)); 

Entscheidend ist dabei, dass die »zend_string_alloc()«-Funktion einen Puffer (buffer) auf dem Heap alloziiert, der für die Bearbeitung der Zip-Datei benötigt wird. Die Größe dieses Puffers richtet sich nach dem Wert der Variable »len«, welcher auf »sb.size« gesetzt wird. Bei »sb.size« handelt es sich um eine nicht vorzeichenbehaftete 64-Bit Integer-Variable (uint64). Das Problem besteht nun darin, dass die »len«-Variable als vorzeichenbehafteter Integer deklariert ist. Hinzu kommt noch, dass seine Länge je nach System entweder 32 oder 64 Bit beträgt. Der Angreifer hat nun hier die Möglichkeit in der Zip-Datei eine Länge zu spezifizieren, die zu einem Überlauf der »len«-Variablen führt. Dies hat dann zur Folge, dass unter Umständen unzureichender Speicherplatz für den Puffer alloziiert wird. Kritisch ist dabei, dass der Programmcode hier keine Kontrolle eingebaut hat, um diesen Fall abzufangen. Da somit eventuell zu wenig Speicher auf dem Heap alloziiert wird, kann der Angreifer damit einen Heap-Overflow-Fehler auslösen. Fehler dieser Art können ausgenutzt werden, um den Programmablauf zu ändern. Genau damit kann der Angreifer dann seine Befehle ausführen.

 Ein in Python geschriebener Exploit wurde ebenfalls für diese Schwachstelle entwickelt. Der Exploit wird einfach via »python exploit.py --bind-port 5555  http://1.2.3.4/upload.php« aufgerufen. Wobei die Port-Nummer und die Upload-URL angegeben werden müssen.

Betroffen von dieser Schwachstelle ist die Version 7.0.5, wobei möglicherweise auch ältere Versionen anfällig sein könnten. 

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.