Chrome V8引擎Sentinel Value漏洞利用分析:无需额外研究即可实现RCE

robot
摘要生成中

Chrome V8 引擎中 Sentinel Value 漏洞利用分析

Sentinel value 是算法中的一种特殊值,通常在循环或递归算法中作为终止条件使用。Chrome 源码中存在大量 Sentinel value。之前有研究表明,通过泄露 TheHole 对象可以实现 Chrome 沙箱内任意代码执行。谷歌团队随后对相关漏洞进行了修复。

然而,V8 中还存在其他不应泄露到 JS 中的原生对象。本文讨论的是 Uninitialized Oddball 对象,该对象泄露可导致的沙箱绕过方法目前仍可用于最新版 V8。

值得注意的是,这种方法具有一定通用性:

  1. CVE-2021-30551 最初的 PoC 就是泄露 internal uninitialized oddball。

  2. CVE-2022-1486 的 PoC 中也直接泄露了 UninitializedOddball。

  3. Issue1352549 (未分配 CVE) 中详细给出了利用方法。

这些案例表明,利用 Uninitialized Oddball 泄露进行攻击的可能性值得重视。

Sentinel Value in V8

V8 的大部分原生对象定义在 v8/src/roots/roots.h 文件中,它们在内存中依次相邻排布。一旦这些不应泄露的原生对象被泄露到 JavaScript 中,就可能实现沙箱内任意代码执行。

为验证这一点,可以通过修改 V8 的 native 函数 %TheHole() 的返回值为 Uninitialized Oddball。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

绕过 HardenType 保护

Issue1352549 中给出了完整的绕过代码。经简化后的核心逻辑如下:

javascript function read(obj, idx) { return obj[idx]; }

let uninitialized = %TheHole(); let arr = [1.1]; let res = read(uninitialized, 0x12345); %DebugPrint(res);

这段代码在最新的 V8 11.0.0 版本中仍可实现相对任意读。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

分析优化后的 read 函数汇编代码,可以发现它只检查了 obj 的 prop 属性是否正确,但没有检查 obj.prop 作为 key 的 Value。这导致在计算时发生类型混淆,实现了任意读。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

当传入 uninitialized_oddball 时,从特定指令开始以 obj 为起点计算,最终在 vmovsd xmm0,[r9+r11*8+0x7] 指令中完成任意读,数据保存在 xmm0 寄存器中。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

建议的修复方法是,在优化后的函数返回数组元素时,添加对数组 map 的检查,避免直接计算偏移返回数组数值。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

PatchGap 警告

在排查可能存在 PatchGap 的软件时发现,Skype 目前仍未修复该漏洞。在 x86 架构下,由于没有地址压缩,任意读写是直接相对于整个进程的。

虽然 Skype 开启了 ASLR,但由于其文件较大,直接放在 4GB 内存中,攻击者只需对某个固定地址进行读写,就有很大概率读写到 Skype 文件内容。结合 PE 解析等传统方法,可以完成整个漏洞利用链。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

这次 PatchGap 不仅涉及 Issue1352549,还导致了类似 Issue1314616 和 Issue1216437 的利用难度大幅降低。黑客几乎不需要额外研究就可以实现以往任何泄露 uninitialized_oddball 漏洞的完整利用。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

总结

本文介绍了通过泄露 Sentinel value 中的 uninitialized_Oddball 来实现任意读原语的方法。V8 中还存在其他 Sentinel value,可能导致类似问题。这给我们以下启示:

  1. 其他 uninitialized_Oddball 泄露是否也可轻松实现 V8 的 RCE。

  2. 此类问题是否应被正式当作安全问题对待仍存在争议。

  3. 在 fuzzer 中可考虑将 %TheHole/uninitialized_Oddball 等 Sentinel value 作为变量加入,以挖掘其他利用原语。

无论如何,这类问题都会大大缩短黑客实现完整利用的周期。

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

独家揭秘通过泄露Sentinel Value绕过Chrome v8 HardenProtect

SENC0.25%
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 5
  • 转发
  • 分享
评论
0/400
CoffeeNFTradervip
· 07-22 08:13
又一个安全漏洞 慌得一批
回复0
Hash_Banditvip
· 07-21 21:23
js引擎挖矿变得真实了...利用难度已达最大
查看原文回复0
ConsensusDissentervip
· 07-20 00:25
又一个代码黑洞出来了 太恐怖了
回复0
Blockblindvip
· 07-20 00:19
v8也有这么大漏洞?笑死
回复0
区块链Talkervip
· 07-20 00:12
实际上很惊讶 V8 仍然在这方面挣扎... p.s. 我的运行时隔离在哪里,家人们?
查看原文回复0
交易,随时随地
qrCode
扫码下载 Gate APP
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)