PHP "spl_object_storage_attach()"释放后使用漏洞

漏洞起因
设计错误
危险等级

 
影响系统
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 条评论。

发表评论