📚 PHP bis 7.0.5 ZIP Archive Handler zend_string.h getFromIndex() Pufferüberlauf
💡 Newskategorie: Sicherheitslücken
🔗 Quelle: vuldb.com
Eine kritische Schwachstelle wurde in PHP bis 7.0.5 gefunden. Davon betroffen ist die Funktion ZipArchive::getFromIndex()
der Datei zend_string.h der Komponente ZIP Archive Handler. Durch die Manipulation mit einer unbekannten Eingabe kann eine Pufferüberlauf-Schwachstelle (Heap-based) ausgenutzt werden. Die Auswirkungen sind bekannt für Vertraulichkeit, Integrität und Verfügbarkeit.
Die Schwachstelle wurde am 28.04.2016 durch Hans Jerry Illikainen herausgegeben. Eine Veröffentlichung wurde in Zusammenarbeit mit dem Projektteam angestrebt. Die Verwundbarkeit wird mit der eindeutigen Identifikation CVE-2016-3078 gehandelt. Die Schwachstelle ist relativ beliebt, und dies trotz ihrer hohen Komplexität. Umgesetzt werden kann der Angriff über das Netzwerk. Das Ausnutzen erfordert keine spezifische Authentisierung. Es sind technische Details sowie ein öffentlicher Exploit zur Schwachstelle bekannt. Der folgende Code ist die Ursache des Problems:
static zend_always_inline zend_string *zend_string_alloc(size_t len, int persistent) { zend_string *ret = (zend_string *)pemalloc(ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent); // (4) ... ZSTR_LEN(ret) = len; // (5) return ret; }Das Advisory weist darauf hin:
The `size' argument to the `pemalloc' macro is aligned/adjusted in (4) whilst the *original* value of `len' is stored as the size of the allocated buffer in (5). No boundary checking is done in (4) and it may thus wrap, which would lead to a heap overflow during the invocation of `zip_fread()' in (3) as the `toread' argument is `ZSTR_LEN(buffer).
Ein öffentlicher Exploit wurde durch Hans Jerry Illikainen in Python entwickelt und direkt nach dem Advisory veröffentlicht. Er wird als proof-of-concept gehandelt. Der Preis als 0-Day war auf dem Schwarzmarkt etwa $25k-$50k. Der durch den Exploit genutzte Code gestaltet sich wie folgt:
$zip = new ZipArchive(); if ($zip->open($_FILES["file"]["tmp_name"]) !== TRUE) { echo "cannot open archive\n"; } else { for ($i = 0; $i < $zip->numFiles; $i++) { $data = $zip->getFromIndex($i); } $zip->close();
Ein Aktualisieren auf die Version 7.0.6 vermag dieses Problem zu lösen.
Mitunter wird der Fehler auch in der Verwundbarkeitsdatenbank von SecurityTracker (ID 1035701) dokumentiert.
CVSS
Base Score: 6.8 (CVSS2#AV:N/AC:M/Au:N/C:P/I:P/A:P) [?]
Temp Score: 5.3 (CVSS2#E:POC/RL:OF/RC:C) [?]
CPE
- cpe:/a:php:php:7.0.0
- cpe:/a:php:php:7.0.1
- cpe:/a:php:php:7.0.2
- cpe:/a:php:php:7.0.3
- cpe:/a:php:php:7.0.4
- cpe:/a:php:php:7.0.5
Exploiting
Klasse: Pufferüberlauf
Lokal: Nein
Remote: Ja
Verfügbarkeit: Ja
Zugang: öffentlich
Status: Proof-of-Concept
Programmiersprache: Python
Autor: Hans Jerry Illikainen
Aktuelle Preisschätzung: $25k-$50k (0-day) / $1k-$2k (Heute)
Gegenmassnahmen
Empfehlung: Upgrade
Status: Offizieller Fix
0-Day Time: 0 Tage seit gefunden
Exploit Delay Time: 0 Tage seit bekannt
Upgrade: PHP 7.0.6
Timeline
28.04.2016Advisory veröffentlicht
28.04.2016Exploit veröffentlicht
28.04.2016SecurityTracker Eintrag erstellt
02.05.2016VulDB Eintrag erstellt
02.05.2016VulDB Eintrag aktualisiert
Quellen
Person: Hans Jerry Illikainen
Status: Bestätigt
Koordiniert: Ja
CVE: CVE-2016-3078 (mitre.org) (nvd.nist.org) (cvedetails.com)
SecurityTracker: 1035701 - PHP Heap Overflow in ZipArchive in Reading zip Files Lets Remote Users Execute Arbitrary Code
Eintrag
Erstellt: 02.05.2016
Eintrag: 82% komplett
...