PHP php_stream_filter_create()函数缓冲区溢出漏洞

CNNVD-ID编号 CNNVD-200704-003
CVE编号 CVE-2007-1824
发布时间 2007-03-31
更新时间 2007-04-27
漏洞类型 缓冲区溢出
漏洞来源 Stefan Esser※ s.esser@ematters.de
危险等级 中危
威胁类型 远程
厂 商 php

漏洞介绍

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

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

当php_stream_filter_create()函数创建过滤器时,首先在哈希表中通过名称搜索过滤器,如果不成功的话就检查是否存在支持所请求过滤器的通配符过滤器。这个操作由以下代码处理:

if (SUCCESS == zend_hash_find(filter_hash, (char*)filtername, n, (void**)&factory)) {

filter = factory->create_filter(filtername, filterparams, persistent TSRMLS_CC);

} else if ((period = strrchr(filtername, \'\'.\'\'))) {

/* try a wildcard */

char *wildname;

wildname = estrdup(filtername);

period = wildname + (period - filtername);

while (period && !filter) {

*period = \'\'\0\'\';

strcat(wildname, \".*\");

if (SUCCESS == zend_hash_find(filter_hash, wildname, strlen(wildname), (void**)&factory)) {

filter = factory->create_filter(filtername, filterparams, persistent TSRMLS_CC);

}

*period = \'\'\0\'\';

period = strrchr(wildname, \'\'.\'\');

}

efree(wildname);

}

可见这个函数假设字符串的末尾不会出现句号(\".\"),因为根本就没有保存这种情况下所需的额外内存字节,因此如果所创建的过滤器名称末尾包含有句号的话就会导致单字节溢出,用\"\0\"字符覆盖内存中之后的字节。

漏洞补丁

目前厂商已经发布了升级补丁以修复这个安全问题,补丁下载链接:

参考网址

受影响实体

信息来源