Archive for 一月, 2017

PHP垃圾回收机制UAF漏洞分析

作者:天择实验室wuhj@jowto.com
转载请注明出处:http://blog.jowto.com

1.PHP垃圾回收机制简介

因为PHP当中存在循环引用,仅以refcount计数器作为垃圾回收机制是不够的,因此在PHP5.3中引入了新的垃圾回收机制。
<?php
$a = array('one');
$a[] = &$a;
unset($a);
?>

在PHP5.2及以前的版本中,无法回收变量$a的内存。

在PHP5.3以后的新垃圾回收机制算法,以颜色标记的方法来判断垃圾:

  1. 将所有数组和对象zval节点放入gcrootbuffer,并标记为紫色(潜在垃圾,已放入缓冲区)。当节点缓冲区被塞满(默认为10000)或调用gccollectcycles()时,开始进行垃圾回收。
  2. 以深度优先对zval及其子节点所包含的zval进行refcount减1操作,并标记为灰色(已减一)。
  3. 再次以深度优先判断每一个节点包含的zval的值,如果zval的refcount等于0,那么将其标记成白色(垃圾)。如果zval的refcount大于0,那么将对此zval以及其子节点进行refcount加1还原,同时将这些zval的颜色变成黑色(正常)。
  4. 遍历zval节点,将C中标记成白色的节点zval释放掉。

垃圾回收算法代码如下:
Zend/zend_gc.c
ZEND_API int gc_collect_cycles(TSRMLS_D)
{
[...]
gc_mark_roots(TSRMLS_C);
gc_scan_roots(TSRMLS_C);
gc_collect_roots(TSRMLS_C);
[...]
/* Free zvals */
p =
阅读全文

Posted on 一月 10, 2017 at 下午3:12 by admin · Permalink · Comments Closed
In: Web安全, 漏洞分析
友情链接