# 通过泄露Sentinel Value绕过Chrome v8 HardenProtect## 前言Sentinel value是算法中的一个特殊值,通常在循环或递归算法中作为终止条件存在。Chrome源码中有很多Sentinel value。之前有研究介绍了如何通过泄露TheHole对象实现沙箱内任意代码执行。谷歌团队随后迅速更新了相关修复。除了TheHole对象外,v8中还有很多其他不应泄漏到JS中的原生对象。本文将讨论Uninitialized Oddball对象,该方法目前仍可用于最新版V8。值得注意的是,这种方法具有一定的通用性,曾在多个漏洞中出现。## V8中的Sentinel Valuev8的大部分原生对象定义在v8/src/roots/roots.h文件中,这些对象在内存中依次相邻排布。一旦将不应泄露的原生对象泄露到Javascript中,即可实现沙箱内任意代码执行。为验证该方法,我们可以通过修改v8的native函数,将Uninitialized Oddball泄漏到JavaScript中。具体可以修改%TheHole()函数中相对isolate的偏移。## 绕过HardenType利用Uninitialized Oddball可以实现相对任意读写。关键在于优化后的JavaScript read函数中,只检查了obj的prop属性是否正确,但没有检查以obj.prop为key的Value,而是直接按JavaScript语义计算偏移,求取数组的数值。这导致在计算时造成类型混淆,实现任意读。由于Uninitialized Oddball在v8内存中排序靠前且更原始,相比TheHole对象更易于伪造,是TheHole缓解绕过修复后的首选方法。建议修复方案是在优化后的函数返回数组元素时,添加对数组map的检查,避免直接计算偏移返回数值。## PatchGap风险提示除了关注历史漏洞,还要注意厂商在基础组件中悄悄修复的漏洞。目前Skype仍未修复该漏洞。x86和x64下利用方式略有不同,但都可实现任意读写。这次PatchGap不仅涉及Issue1352549,新方法的公开也大大降低了类似漏洞的利用难度。黑客几乎不需研究即可完成以往任何泄露Uninitialized Oddball漏洞的完整利用。## 总结v8中还有很多其他Sentinel value,可能存在类似问题。这给我们一些启示:1. 其他Uninitialized Oddball泄露是否也易于实现v8 RCE。2. 此类问题是否应被正式视为安全问题仍存在争议。3. fuzz测试时或许应考虑将各种Sentinel value作为变量加入。无论如何,这类问题都会大大缩短黑客的完整利用周期。我们应对此保持警惕。
Chrome v8漏洞利用新方法:泄露Uninitialized Oddball实现沙箱逃逸
通过泄露Sentinel Value绕过Chrome v8 HardenProtect
前言
Sentinel value是算法中的一个特殊值,通常在循环或递归算法中作为终止条件存在。Chrome源码中有很多Sentinel value。之前有研究介绍了如何通过泄露TheHole对象实现沙箱内任意代码执行。谷歌团队随后迅速更新了相关修复。
除了TheHole对象外,v8中还有很多其他不应泄漏到JS中的原生对象。本文将讨论Uninitialized Oddball对象,该方法目前仍可用于最新版V8。值得注意的是,这种方法具有一定的通用性,曾在多个漏洞中出现。
V8中的Sentinel Value
v8的大部分原生对象定义在v8/src/roots/roots.h文件中,这些对象在内存中依次相邻排布。一旦将不应泄露的原生对象泄露到Javascript中,即可实现沙箱内任意代码执行。
为验证该方法,我们可以通过修改v8的native函数,将Uninitialized Oddball泄漏到JavaScript中。具体可以修改%TheHole()函数中相对isolate的偏移。
绕过HardenType
利用Uninitialized Oddball可以实现相对任意读写。关键在于优化后的JavaScript read函数中,只检查了obj的prop属性是否正确,但没有检查以obj.prop为key的Value,而是直接按JavaScript语义计算偏移,求取数组的数值。这导致在计算时造成类型混淆,实现任意读。
由于Uninitialized Oddball在v8内存中排序靠前且更原始,相比TheHole对象更易于伪造,是TheHole缓解绕过修复后的首选方法。
建议修复方案是在优化后的函数返回数组元素时,添加对数组map的检查,避免直接计算偏移返回数值。
PatchGap风险提示
除了关注历史漏洞,还要注意厂商在基础组件中悄悄修复的漏洞。目前Skype仍未修复该漏洞。x86和x64下利用方式略有不同,但都可实现任意读写。
这次PatchGap不仅涉及Issue1352549,新方法的公开也大大降低了类似漏洞的利用难度。黑客几乎不需研究即可完成以往任何泄露Uninitialized Oddball漏洞的完整利用。
总结
v8中还有很多其他Sentinel value,可能存在类似问题。这给我们一些启示:
其他Uninitialized Oddball泄露是否也易于实现v8 RCE。
此类问题是否应被正式视为安全问题仍存在争议。
fuzz测试时或许应考虑将各种Sentinel value作为变量加入。
无论如何,这类问题都会大大缩短黑客的完整利用周期。我们应对此保持警惕。