【漏洞分析】关php(5和7)中发现的三个unserialize漏洞分析 2017-01-12 16:58:31 来源:blog.checkpoint.com 作者:不会逃跑的橙子
【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

翻译:不会逃跑的橙子

预估稿费:180RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

两个月前,Check Point Security发布了一篇关于开发PHP-7 unserialze漏洞以及三个相关0-day的论文。现在我们将证明这些猜测并且揭露这三个能让远程进攻者在所有版本PHP中拒绝服务以及在PHP 7中执行任何代码的漏洞。

在没有更多动态数据的情况下,我们将挖掘更多关于这些0-day的技术细节。


I. CVE-2016-7478—REMOTE DENIAL OF SERVICE

第一个漏洞允许攻击者远程unserialize一个源自本身的异常就像之前出现过的正常异常一样。当对这个异常执行_toSring 时,代码会迭代输出这个异常链。因为这个异常链只有一个指向它本身的对象构成,这个迭代将永远不会终止。

这个对象通过下面的这段代码进行unserialize创建:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

这将导致unserialize对第一个unserialize值进行实例化一个带有Exceptionprivious的异常对象——也就是异常本身。

下面是相关的PHP代码,这个无限循环也很容易发现:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

值得注意的是在unserialize过程中 PHP-7可能对每一个对象执行_toString。 这全由在Datelnterval对象中invoction of zval to string的unserialized值引起 。

如果我们unserialize这个string:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

我们执行 php_date_interval_initialize_from_hash:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

这些代码在days的值上运行了zval_get_string 方法,这也就是我们在本例中foo 类。如果这个foo类包含了一些有关的代码,那么攻击者就能利用他们。

调用 __toString本身在unserialize过程中不是一个漏洞。但是它打开了主要的攻击面,所以我们也将它作为bug向PHP的安全团队汇报。

利用这个行为,攻击者可以不依赖其他条件而通过unserialize在PHP-7中远程触发取消所有服务的bug。


II. CVE-2016-7479—UAF CODE EXECUTION

第二个漏洞更加的复杂一些并需要一些其他的准备条件。但是它能允许攻击者远程控制整个被攻击的进程。

这个漏洞可行的原因是一个对象的unserialized 属性是被储存于这个对象的属性hash表内。每一个unserialized值都有一个在var_hash结构中的引用去支持serialization形式的特征引用。

因为这个hash表是动态的,一旦新的值添加它就会增长。当这个hash表增长的时候,内部数组的值是被释放的,但是有一个更大的数组存了内部数组的备份值,它将会被分配使用。问题在于当重新定义长度时,没有任何代码会去更新var_hash。所以,如果任何一个对象的属性hash表在unserialize的过程中被重新定义长度,var_hash将包含一个指向被释放内存的指针。

有两种方法去触发这个漏洞。

第一种,如果有一个应用包含了一个可以动态创造属性的方法,在unserialize过程中这个方法被调用了,那么它可以触发这个bug。

例如:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

某个对象中的_wakeup方法在unserialize这个对象属性以后立刻被调用。这个过程符合我们的要求。这个未知的属性被动态创建并添加到属性hash表中。

unserialize这个string:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

用长度为8的数组去存储分配foo类的hash表。然后,当_wakeup方法被调用的时候,一个未知的值x被添加进hash表。因为这个hash表的内部数组在这之前已经满了,hash表尺寸将被重定义,释放这个内部数组并分配一个更大的数组。因此,这将触发漏洞并且导致在var_hash中的指针指向被释放的内存。

第二种方法更加复杂。它依赖于DateInterval对象中的一个特殊的行为。这个对象每次更新它的属性hash表,它的属性都将被使用(准确来说是每次它的get_properties handler被执行)。

这是get_properties handler代码:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

这段代码更新了内部属性hash表中相当多的值。如果这些值原先不存在,它们将被直接创建出来。

为了触发这个漏洞,我们需要在不提供属性的情况下去unserialize 一个DateInterval对象。

这里有个例子:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

var_dump内置函数在内部迭代被给对象所有属性。因此,用如下代码unserialize:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

触发漏洞

值得又提起的是_toString方法在unserialize中也是可使用的(在之前的漏洞中描述过)。如果_toString使用了一个对象的属性,它将在unserialize中被执行并触发漏洞。

利用

此漏洞允许攻击者伪造zvals,它能轻易导致代码执行。在PHP7 exploitation中也适用。但是这里有一个非常重要的片段——信息泄露。信息泄露不能在这使用,因为它依赖于分配器释放我们所选的对象并且需要一个指针指向堆顶(这种情况并不相符)。

当然攻击者可以使用其他的bug或者hash表欺骗来获取内存地址信息。当然更好的方法是去使用同一个bug去获取内存地址。

这个bug也可以用作信息泄露。攻击者可以将hash表最新的zval设置为sring,这意味着zval第一块作用域是指向zend_string的指针。之后,他触发这个bug,让hash表的数据数组slot做好被分配的准备。攻击者能捕捉这段被释放的slot,这将通过另一段被精确定义长度的string(null terminator重写指针的最少重要字节)。调零这个最小字节将移过指针一点——指向一个攻击者操控的内存。这样攻击者就能放置一个非常大的string从而能读取后面的堆顶的信息。

例如:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

输出结果为:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

这输出了一对相邻的slot的内容也就是我们指定并释放的列表的指针。


III. CVE-2016-7480—USE OF UNINITIALIZED VALUE CODE EXECUTION

第三个漏洞是典型的利用SplObjectStoarage对象中定制unserialize函数栈中未初始化的值。

让我们来测试下漏洞代码:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

inf参数在栈中被定义,但是没有被初始化。在特定条件下,一个指向这个参数的指针被传入php_var_unserialize(期望函数填充这个结构体)。

php_var_unserialize最后用rval参数存储指向inf的指针执行了php_var_unserialize_internal。如果被解析的值是个引用(例如*p==”r”),下面的代码将被执行:


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析

所以如果攻击者可以操作inf去存储一个被认为是引用的zval,他就能在unserialize中释放它。更重要的是,因为zval_ptr_dtor减少zval的引用计数作用域,它可能被滥用于去减少一些值例如指针。

根据过去的经验,我们知道这些足够导致任意代码执行。


【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析
【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析 本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://blog.checkpoint.com/wp-content/uploads/2016/12/PHP_Technical_Report.pdf

本文网络安全相关术语:网络安全工程师 网络信息安全 网络安全技术 网络安全知识

主题: PHP360TIUTCU数据UA常大中远
分页:12
转载请注明
本文标题:【漏洞分析】关于PHP(5和7)中发现的三个unserialize漏洞分析
本站链接:http://www.codesec.net/view/523085.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 网络安全 | 评论(0) | 阅读(69)