Chrome v8漏洞利用新方法:泄露Uninitialized Oddball实现沙箱逃逸

通过泄露Sentinel Value绕过Chrome v8 HardenProtect

前言

Sentinel value是算法中的一个特殊值,通常在循环或递归算法中作为终止条件存在。Chrome源码中有很多Sentinel value。之前有研究介绍了如何通过泄露TheHole对象实现沙箱内任意代码执行。谷歌团队随后迅速更新了相关修复。

除了TheHole对象外,v8中还有很多其他不应泄漏到JS中的原生对象。本文将讨论Uninitialized Oddball对象,该方法目前仍可用于最新版V8。值得注意的是,这种方法具有一定的通用性,曾在多个漏洞中出现。

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

V8中的Sentinel Value

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

为验证该方法,我们可以通过修改v8的native函数,将Uninitialized Oddball泄漏到JavaScript中。具体可以修改%TheHole()函数中相对isolate的偏移。

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

绕过HardenType

利用Uninitialized Oddball可以实现相对任意读写。关键在于优化后的JavaScript read函数中,只检查了obj的prop属性是否正确,但没有检查以obj.prop为key的Value,而是直接按JavaScript语义计算偏移,求取数组的数值。这导致在计算时造成类型混淆,实现任意读。

由于Uninitialized Oddball在v8内存中排序靠前且更原始,相比TheHole对象更易于伪造,是TheHole缓解绕过修复后的首选方法。

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

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

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

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

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

PatchGap风险提示

除了关注历史漏洞,还要注意厂商在基础组件中悄悄修复的漏洞。目前Skype仍未修复该漏洞。x86和x64下利用方式略有不同,但都可实现任意读写。

这次PatchGap不仅涉及Issue1352549,新方法的公开也大大降低了类似漏洞的利用难度。黑客几乎不需研究即可完成以往任何泄露Uninitialized Oddball漏洞的完整利用。

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

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

总结

v8中还有很多其他Sentinel value,可能存在类似问题。这给我们一些启示:

  1. 其他Uninitialized Oddball泄露是否也易于实现v8 RCE。

  2. 此类问题是否应被正式视为安全问题仍存在争议。

  3. fuzz测试时或许应考虑将各种Sentinel value作为变量加入。

无论如何,这类问题都会大大缩短黑客的完整利用周期。我们应对此保持警惕。

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

SENC-0.5%
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 5
  • 分享
评论
0/400
Gas_FeeTerapistvip
· 08-05 17:35
v8又玩砸了啊 安全性越来越拉了
回复0
绿蜡烛收集家vip
· 08-05 17:34
这漏洞还挺硬核的吧
回复0
闪电丢包侠vip
· 08-05 17:32
这bug又被搞定了 我们的机房得赶紧修啊
回复0
链上吃瓜群众vip
· 08-05 17:32
啊这...打洞哥又发新活了
回复0
无常损失爱好者vip
· 08-05 17:31
我擦 v8竟然还有这种漏洞
回复0
交易,随时随地
qrCode
扫码下载 Gate APP
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)