谷歌将解释如何做到打破微软Edge浏览器的垄断

回到2018年2月,Google的Project Zero公开了一个Redmond无法及时修复它的微软Edge漏洞。现在,谷歌研究员Ivan Fratric已经提供了有关该问题的详细技术说明,并称微软的解决方案可能不够靠谱。

Fratric 发现 Just -in-time 的JavaScript编译,Edge的Chakra JavaScript引擎和Arbitrary Code Guard之间的交互作用给了攻击者一个执行任意代码的漏洞。

任意代码保护(ACG)旨在防止代码被动态修改,并在2017年3月进行了最新增强更新。

谷歌揭示了微软在修复时遇到的Edge漏洞

Fratric在上周四的这篇文章中解释了这个问题:“当ACG应用于Microsoft Edge Content Process时,它不可能在进程中分配新的可执行内存或修改现有的可执行内存。这样做的目标是让已经获得一些浏览器内容进程的攻击者执行任意代码变得更困难“

本白皮书(PDF)更详细地解释了Fratric的攻击:他的攻击向量与ACG存在时JavaScript如何即时编译有关。

由于JIT(just-in-time)与ACG不兼容,因此Microsoft并未将JIT作为边缘内容进程的一部分运行,而是将JIT引擎引入自己的进程。

如果Chakra JavaScript引擎遇到需要JIT编译的函数,它会将字节码传递给JIT服务器,JIT服务器“编译字节码并使用共享内存将结果可执行代码写回调用进程。”

白皮书解释说,这可以让内容进程在不违反动态代码策略的情况下执行JIT代码。

攻击面的另一个关键是旨在预防内存损坏漏洞的控制流保护(CFG)。Fratric公司的论文指出,这里的一个向量是“返回不受保护,因此覆盖返回地址是成功绕过CFG所需的全部。通常,为了能够覆盖堆栈上的返回地址,攻击者首先需要知道堆栈的位置。Chakra字节码通过包含可用于读取和写入堆栈的操作码来满足这一要求“。

在我们进入到白皮书中阐述的攻击场景之前,有各种内存映射和进程交互的完整介绍:

  • 攻击者观察JIT分配的地址并预测下一个地址;
  • 攻击者取消映射相应的JIT部分UnmapViewOfFile();
  • 攻击者调用VirtualAlloc()回收内存,但这次有PAGE_READWRITE权限;
  • 攻击者将其有效载荷写入新分配的位置;
  • 攻击者等待JIT服务器使内存区域可执行。在此之后,攻击者可以简单地将控制流程转移到步骤4中编写的代码。

情况经常如此,这个问题并没有微软所担心的那么严重:雷德蒙德不得不解除VirtualAllocEx()通话。

这里有一个概念验证,它唯一的假设是“攻击者已经设法通过一个不相关的漏洞在内容过程中获得内存读/写原语”。

  • 发表于:
  • 原文链接http://www.theregister.co.uk/2018/05/15/microsoft_acg_mitigation_missed_memory_bug
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券