Safari DFG编译器未初始化变量漏洞分析与利用

本文详细分析了Safari浏览器WebKit引擎中DFG编译器存在的未初始化变量漏洞(CVE-2024-44308),包括漏洞原理、利用技术栈布局控制、类型混淆和最终实现任意读写原语的全过程。

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编译器中的微妙漏洞如何被利用来实现强大的攻击能力。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计