分你所享、信息共享、轻松分享
来自民间的思想 | 送人玫瑰,手有余香。

详解Pwn2Own中价值5万美金的Firefox浏览器漏洞

在最近的Pwn2Own 2018比赛中,Richard Zhu仅仅使用一个漏洞就成功攻破了Mozilla Firefox。在比赛中他将错误交给Mozilla后,在不到24小时内他们迅速进行了更新。在本文中我将仔细分析一下Richard Zhu在比赛中使用的漏洞。

漏洞分析

这个越界写入漏洞位于libvorbis,这是参考Vorbis音频编解码器解码实现的。此漏洞被命名为ZDI-18-263(CVE-2018-5146),位于库音频合成过程的深处。该漏洞只能由具有1型残留编码的音频文件触发,并且在残差计算过程中出现超出范围的写入。让我们看看易受攻击的函数vorbis_book_decodev_add():

1.png

该漏洞的核心是由于407行内部for循环中的数组边界检查不足造成的(上图)。使用精心制作的Vorbis音频文件指定足够大的book-> dim,可以使i大于n,并在408行内部for循环的界限以外访问a []数组。在Richard制作的Vorbis文件中,他已将book – > dim设置为96,n(未显示)设置为1.这允许他通过a [] C数组并覆盖进程内存的其他部分。

2.png

为了利用这个漏洞,Richard用交错的Javascript Arrays和ArrayBuffers来验证堆。他加载制作的Vorbis文件触发超出边界写入漏洞以覆盖阵列的长度。在损坏的Array中,Richard可以从损坏的Array中自由读取和写入ArrayBuffer。从那里他构建了一个假的Javascript对象并劫持了vtable,使用ROP获得代码执行,并启动了利用链的第二阶段。

从受害者的角度来看,他们都是浏览了一个网站,最终受到了攻击。从Richard的角度来看,他在Pwn2Own上的成功示范,使他获得了5万美元的收入。此漏洞的补丁很简单,这也是响应速度如此之快的原因之一。 Xiph团队在内部循环中增加了额外的检查来防止出界限制访问条件,还取消了手动循环展开优化,并在不同的残差解码函数中修正了类似的错误。

3.png