回到2018年2月,Google的Project Zero公开了一个Redmond无法及时修复它的微软Edge漏洞。现在,谷歌研究员Ivan Fratric已经提供了有关该问题的详细技术说明,并称微软的解决方案可能不够靠谱。
Fratric 发现 Just -in-time 的JavaScript编译,Edge的Chakra JavaScript引擎和Arbitrary Code Guard之间的交互作用给了攻击者一个执行任意代码的漏洞。
任意代码保护(ACG)旨在防止代码被动态修改,并在2017年3月进行了最新增强更新。
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字节码通过包含可用于读取和写入堆栈的操作码来满足这一要求“。
在我们进入到白皮书中阐述的攻击场景之前,有各种内存映射和进程交互的完整介绍:
UnmapViewOfFile()
;VirtualAlloc()
回收内存,但这次有PAGE_READWRITE
权限;情况经常如此,这个问题并没有微软所担心的那么严重:雷德蒙德不得不解除VirtualAllocEx()
通话。
这里有一个概念验证,它唯一的假设是“攻击者已经设法通过一个不相关的漏洞在内容过程中获得内存读/写原语”。
领取专属 10元无门槛券
私享最新 技术干货