安全研究

安全漏洞
PHP str_replace()函数整数溢出漏洞

发布日期:2007-03-31
更新日期:2007-04-02

受影响系统:
PHP PHP 5 < 5.2.1
PHP PHP 4 < 4.4.5
描述:
BUGTRAQ  ID: 23233
CVE(CAN) ID: CVE-2007-1885

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

PHP的str_replace()函数实现上存在整数溢出漏洞,本地攻击者可能利用此漏洞提升自己的权限。

在调用PHP的str_replace()函数时代码会切换到两个不同的代码路径,具体取决于搜索字符串的长度。单字符搜索字符串是由不同函数来处理的,以提高效率,但这种方法的以下代码中存在整数溢出漏洞:

    Z_STRLEN_P(result) = len + (char_count * (to_len - 1));
    Z_STRVAL_P(result) = target = emalloc(Z_STRLEN_P(result) + 1);
    Z_TYPE_P(result) = IS_STRING;

如果char_count和to_len都大于65537的话就会导致32位长度计数器的整数溢出,因此emalloc()不会分配足够的内存,在执行替换时会导致溢出所分配的缓冲区。如果要成功利用这个漏洞必须在攻击对象之前分配目标缓冲区,以便溢出攻击对象,这样拷贝在崩溃之前停止。

<*来源:Stefan Esser (s.esser@ematters.de
  
  链接:http://www.php-security.org/MOPB/MOPB-39-2007.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

<?php

  str_replace("A", str_repeat("B", 65535), str_repeat("A", 65538));

?>

建议:
厂商补丁:

PHP
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.php.net/downloads.php#v4
http://www.php.net/downloads.php#v5

浏览次数:3840
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障