研究员发布Google Chrome远程代码执行漏洞POC

释放双眼,带上耳机,听听看~!

在看github地址前,咱们先来看段视频

具体分析


Chrome发布计划

Chrome有一个相对紧张的发布周期,每隔6周推出一个新的稳定版本,如果有关键问题需要保持稳定的刷新由于其开源开发模型,虽然安全修复程序在源代码树中立即可见,但它们需要时间在Chrome 的非稳定版本通道进行测试,然后才能通过自动更新机制将其推出大多数用户群的稳定版本的一部分。

实际上,攻击者有一个机会窗口,从几天到几周不等,其中漏洞详细信息几乎是公开的,但大多数用户都很脆弱,无法获得补丁。

开源补丁分析

通过v8的git log查看可能是一种压倒性的体验。然而,有一个变化立即引起了我的注意。修复程序具有以下提交消息:

[TurboFan] Array.prototype.map wrong ElementsKind for output array.

相关的铬问题跟踪器进入受到限制,可能会持续数月。但是,它具有可能允许攻击者快速产生攻击的所有成分,这是最终目标:TurboFan是v8的优化JIT编译器,最近已成为热门目标。数组漏洞总是充满希望,这暗示了元素类型之间的类型混淆,这可能相对简单易用。该补丁还包括一个有效触发漏洞的回归测试,这也有助于缩短漏洞利用开发时间。

唯一的修改的方法是在 src/compiler/js-call-reducer.cc的JSCallReducer::ReduceArrayMap 

JSCallReducer在TurboFan的InliningPhase期间运行,其ReduceArrayMap方法尝试用内联代码替换对Array.prototype.map的调用。注释是描述性的,添加的行插入一个检查以验证数组的长度是否低于kMaxFastArrayLength(32 MiB)。此长度传递给CreateArray,后者返回一个新数组。

v8引擎对具有特定特征的阵列的存储具有不同的优化例如,PACKED_DOUBLE_ELEMENTS是用于仅具有双元素且没有孔的数组的元素种类。它们作为连续的数组存储在内存中,可以为map等操作生成高效的代码不同元素种类之间的混淆是安全漏洞的常见来源。

那么,如果长度高于kMaxFastArrayLength,为什么会出现问题呢?因为CreateArray将返回一个具有这种长度的字典元素种类的数组字典用于大型和稀疏数组,基本上是哈希表。但是,通过为其提供正确的类型反馈,TurboFan将尝试为连续数组生成优化代码。这是许多JIT编译器漏洞的常见属性:编译器根据类型反馈进行优化,但是一个极端情况允许攻击者在生成的代码的运行时期间中断假设。

由于字典和连续元素种类具有截然不同的后备存储机制,因此这允许内存损坏。实际上,输出数组将是一个小的(考虑它在内存中的大小,而不是它的长度属性)字典,它将被优化的代码访问,好像它是一个大的(再次,考虑它在内存中的大小)连续区域。

查看修复中包含的回归测试,它为映射函数提供反馈,用于具有连续存储的数组(第6-13行),然后在通过Turbofan优化之后,使用足够大的数组调用它,以便map的输出最终将以字典元素类型结束。

开发

由于map操作会将大约3200万个元素写入输出数组,因此回归测试实际上会触发一个wild memcpy。为了使挖掘成为可能,需要停止映射循环这可以通过提供一个回调函数来实现,该函数在所需的迭代次数之后引发异常。另一个问题是它在没有跳过的情况下线性地覆盖所有内容,而理想情况下我们只想选择性地覆盖特定偏移处的单个值,例如相邻数组的长度属性。通过阅读Array.prototype.map文档,可以看到以下内容:

map按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组。仅对已分配值的数组的索引(包括undefined)调用回调。它不会被调用缺少数组的元素(即,从未设置过的索引,已删除的索引或从未赋值的索引)。

因此,跳过未设置的元素(空洞),并且映射不会向这些索引的输出数组写入任何内容。下面的PoC代码利用这两种行为来覆盖与地图输出数组相邻的数组的长度。

此时,我们有一个float数组,可用于越界读写。该漏洞利用了堆上的以下对象布局来利用它:

[output of Array.map][packed float array][typed array][obj]

损坏的float数组用于修改类型化数组的后备存储指针,从而实现任意读/写。最后的obj用于泄漏任意对象的地址,方法是将它们设置为内联属性,然后通过float数组读取它们的地址。从那时起,该漏洞就遵循我在一篇文章中描述的步骤,通过WebAssembly创建一个RWX页面来实现任意代码执行,遍历JSFunction对象层次结构以在内存中找到它并将shellcode放在那里。

可以在我们的github上找到适用于最新稳定版本(截至2019年4月3日的v73.0.3683.86)的完整漏洞利用代码,它可以在上面的视频的操作中看到。它非常可靠,也可以与基于站点隔离的粗暴程序集成,正如我们之前的博文中所讨论的那样。请注意,完整链需要沙箱转义。

发现

该漏洞利用不依赖于任何不常见的功能或在渲染器进程中导致异常行为,这使得区分恶意代码和良性代码变得困难而没有误报结果。

减轻

通过“设置/高级”设置/“隐私和安全/内容”设置菜单禁用JavaScript执行可有效缓解此漏洞。

结论

在修复程序可用之前开发1天漏洞利用漏洞的想法并不新鲜,这个问题绝对不是Chrome独有的尽管针对此类漏洞开发的漏洞利用寿命很短,但恶意攻击者可能会利用它们,因为它们可以避免浪费0天的风险。及时了解供应商的补丁/更新或依赖公共建议是不够的。人们需要深入研究补丁,以了解它是否适用于可利用的安全漏洞。

报告地址:

https://blog.exodusintel.com/2019/04/03/a-window-of-opportunity/

POC下载地址:

https://github.com/exodusintel/Chromium-941743/

要明确的是,Kurucsai今天发布的漏洞是一个远程代码执行,它会让攻击者在用户的系统上运行代码。但是,该漏洞利用目前的形式有点无害,因为它缺少沙盒逃逸漏洞,无法成为完整的漏洞利用链,并且能够在底层操作系统上运行代码。

尽管如此,攻击者可以使用较旧的Chrome沙箱逃逸漏洞以及Kurucsai当前的RCE漏洞来攻击运行未修补的Chrome浏览器的用户(容易受到旧版沙箱漏洞的攻击)。

此代码的使用案例将作为恶意广告活动或水坑攻击的一部分。

更多干货欢迎持续关注黑鸟威胁情报中心。

老板看爽了,可以再看看今天推送的两外两篇哦!

顺便点个赞关注转发再走吧!

本文源自微信公众号:黑鸟

人已赞赏
安全工具

2016年TeamViewer曾被黑客组织入侵事件曝光

2019-10-16 10:47:55

安全工具

​五眼联盟又双标:为监听要求科技公司"开后门"以访问加密数据

2019-10-16 10:48:02

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索