漏洞起因
设计错误
危险等级
低
影响系统
PHP 5.2 <= 5.2.13
PHP 5.3 <= 5.3.2
不受影响系统
危害
远程攻击者可以利用漏洞以应用程序权限执行任意代码。
攻击所需条件
攻击者必须访问使用"spl_object_storage_attach()"函数的应用程序。
漏洞信息
PHP是一款流行的网络编程语言。
"spl_object_storage_attach()"函数存在释放后使用错误,如果相同对象插入两次的情况下,spl_object_storage_attach()函数会删除之前插入的额外数据:
void spl_object_storage_attach(spl_SplObjectStorage *intern, zval *obj, zval *inf TSRMLS_DC) /* {{{ */
{
spl_SplObjectStorageElement *pelement, element;
pelement = spl_object_storage_get(intern, obj TSRMLS_CC);
if (inf) {
Z_ADDREF_P(inf);
} else {
ALLOC_INIT_ZVAL(inf);
}
if (pelement) {
zval_ptr_dtor(&pelement->inf);
pelement->inf = inf;
return;
}
Z_ADDREF_P(obj);
element.obj = obj;
element.inf = inf;
#if HAVE_PACKED_OBJECT_VALUE
zend_hash_update(&intern->storage, (char*)&Z_OBJVAL_P(obj), sizeof(zend_object_value), &element, sizeof(spl_SplObjectStorageElement), NULL);
#else
{
zend_object_value zvalue;
memset(&zvalue, 0, sizeof(zend_object_value));
zvalue.handle = Z_OBJ_HANDLE_P(obj);
zvalue.handlers = Z_OBJ_HT_P(obj);
zend_hash_update(&intern->storage, (char*)&zvalue, sizeof(zend_object_value), &element, sizeof(spl_SplObjectStorageElement), NULL);
}
#endif
} /* }}} */
由于额外数据附加到已经释放的前一个对象,重复的条目可用于释放后使用攻击。
在PHP 5.2.x中,只限在32位系统上可利用。
测试方法
厂商解决方案
目前没有详细解决方案提供:
http://www.php.net
漏洞提供者
Stefan Esser
0 条评论。