Open Source im professionellen Einsatz
Linux-Magazin 07/2016

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

Fataler Überlauf

Verschiedene Formen von Pufferüberläufen sind keine seltenen Schwachstellen, diesmal wurden sie in Methoden der PHP-Zip-Klasse entdeckt.

451

Die PHP-Zip-Archive-Klasse stellt einem Entwickler verschiedene Funktionen zum Umgang mit Zip-Dateien bereit. Der kann so beispielsweise sehr einfach im Zip-Archiv enthaltene 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 [1], die es einem entfernten Angreifer erlauben, Befehle mit höheren Rechten auf dem System auszuführen. Hierzu muss er eine speziell konstruierte Zip-Datei erzeugen und sie an sein Opfer weiterleiten. Das lässt sich beispielsweise über eine Web-Upload-Funktion erreichen. Die von dem Angreifer gewünschten Befehle führt der Host dann mit den Rechten der PHP-Applikation aus.

Der verantwortliche Programmierfehler befindet sich in einer Speicherallokation in der »php_zip_get_from()« -Funktion. Die ruft unter anderem folgende Befehle auf:

PHP_ZIP_STAT_PATH(intern, ZSTR_VAL(filename), ZSTR_LEN(filename), flags, sb);
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 auf dem Heap alloziert. Die Größe dieses Puffers richtet sich nach dem Wert der Variable »len« , der auf »sb.size« gesetzt wird. Bei »sb.size« handelt es sich um eine nicht mit Vorzeichen behaftete 64-Bit-Integer-Variable, die aus dem Zip-Archiv gelesen wird. 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 dadurch die Möglichkeit, in der Zip-Datei eine Länge zu spezifizieren, die zu einem Überlauf der »len« -Variablen führt. Kritisch ist, dass der Programmcode keine Kontrolle eingebaut hat, um diesen Fall abzufangen. Da somit eventuell zu wenig Speicher auf dem Heap alloziert wird, kann der Angreifer damit einen Heap-Overflow-Fehler auslösen. Der Overflow tritt demnach auf, sobald das Programm aus der Zip-Datei liest.

Fehler dieser Art lassen sich ausnutzen, um den Programmablauf zu ändern, da der Angreifer dadurch Zugriff auf kritische Speicherbereiche des Programms hat, die es ihm erlauben, eigene Befehle auszuführen. Das Problem besteht hier immer darin, dass der allozierte Speicher nicht der eigentlichen Länge der Daten entspricht. Ein in Python geschriebener entsprechender Exploit [2] ist bereits entwickelt:

python exploit.py --bind-port 5555 http://1.2.3.4/upload.php

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

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 1 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Einführung

    Charly Kühnast kann sich noch gut an die Zeit erinnern, als das Einbinden und die Funktionsprüfungen eines SSL-Zertifikats eine einfache Sache war. Jetzt hat er ein Shellskript gefunden, das trotz des Wirrwarrs an Schlüsselprotokollen und Ciphers klare Auskünfte erteilt.

  • Zodiac FX

    Weil White-Label-Switches mit Picos für das Heimlabor fast unerschwinglich sind, trat Northbound Networks mit einer Kickstarter-Kampagne an, um diese Lücke zu schließen – heraus kam der Zodiac FX.

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

    Mit Open Flow und entsprechenden Controllern lassen sich DDoS-Angriffe auch innerhalb des eigenen Netzwerks entdecken und bekämpfen. Das hilft Cloudanbietern und Hostern gleichermaßen.

  • Swagger API

    Ein REST-API nützt einem Entwickler vor allem dann, wenn der API-Anbieter die Methoden ausführlich dokumentiert. Genau dabei hilft das Toolpaket Swagger. Dessen Werkzeuge generieren nicht nur halbautomatisch eine API-Referenz, sondern auch ein passendes Client-SDK für zahlreiche Programmiersprachen.

comments powered by Disqus

Ausgabe 06/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

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