Safari DFG编译器未初始化变量漏洞分析与利用
概述
2023年2月,Exodus Intelligence研究人员在Safari使用的WebKit浏览器引擎的Data Flow Graph(DFG)编译器中发现了一个漏洞。该漏洞被标记为CVE-2024-44308,苹果于2024年11月修复。在漏洞存在期间,其利用链与Apple Silicon上的PAC和APRR绕过技术结合,可在macOS和iOS上实现渲染器远程代码执行能力。
漏洞分析
背景介绍
该漏洞是DFG编译器中的一个未初始化变量使用漏洞,具体存在于负责向TypedArray索引存储数据的代码中。DFG是WebKit JavaScriptCore(JSC)引擎中的一个中间层编译器,位于Baseline和Faster Than Light(FTL)编译器之间,旨在快速生成机器代码并进行计算成本较低的优化。
漏洞原理
漏洞源于在生成跳转到慢路径的代码后不当分配寄存器。将现有值溢出到堆栈的代码从未被调用,但寄存器分配器认为该值仍存储在堆栈上。因此,未来的IR操作将访问现在未初始化的值。
触发条件
该漏洞需要满足特定条件才能触发:
- 代码必须将double值存储到可调整大小或共享的整数TypedArray中
- 存储的值无法截断为int32
- 必须存在寄存器被溢出到堆栈的场景
利用技术
控制堆栈布局
通过堆栈喷洒技术控制未初始化的堆栈槽值。创建一个喷洒函数,在触发函数之前调用,确保两个函数使用相同的堆栈帧。
类型混淆
利用DFG编译器优化特性,通过消除不必要的CheckStructure节点,实现对象类型混淆。通过混淆具有不同内联属性数量的对象,可以覆盖相邻 victim 对象的butterfly指针。
获取利用原语
通过覆盖victim对象的butterfly指针,使其指向write对象,从而获得地址泄露(addrOf)、任意读取和任意写入能力。
代码执行
利用获得的读写原语,结合Pointer Authentication(PAC)绕过技术,最终实现完整的远程代码执行能力。
修复方案
苹果通过将scratch2寄存器的分配提前到可能通过慢路径进行反优化之前来修复此漏洞。现在,任何堆栈溢出都会在代码跳转到慢路径之前发生,确保状态能够正确保存和恢复。
该漏洞的完整利用链展示了现代浏览器JIT编译器中的微妙漏洞如何被利用来实现强大的攻击能力。