# 探究Chrome V8引擎中Sentinel Value泄露导致的安全风险## 前言Sentinel value是算法中的一种特殊值,通常用作循环或递归算法中的终止条件。Chrome源码中广泛使用了这种特殊值。近期有研究人员通过泄露TheHole对象实现了CVE-2021-38003和CVE-2022-1364的沙箱内任意代码执行。谷歌团队随后迅速对这两个漏洞进行了修复。然而,除了TheHole对象外,V8中还存在其他不应泄露到JavaScript中的原生对象。本文将重点讨论Uninitialized Oddball对象,并介绍如何利用它绕过V8的HardenProtect机制。值得注意的是,这种绕过方法目前仍然适用于最新版V8,尚未被修复。## V8中的Sentinel ValueV8的大部分原生对象定义在v8/src/roots/roots.h文件中,这些对象在内存中依次相邻排布。一旦这些不应泄露到JavaScript中的原生对象被泄露出来,就可能导致沙箱内任意代码执行。为了验证这一点,我们可以通过修改V8的native函数,将Uninitialized Oddball泄露到JavaScript中。具体方法是修改%TheHole()函数中相对isolate的偏移,使其返回Uninitialized Oddball。## 绕过HardenType保护利用Uninitialized Oddball对象可以实现相对任意读写。在优化后的JavaScript代码中,read函数没有检查以obj.prop为key的Value,而是直接按照JavaScript语义计算偏移,获取数组的值。这导致了在计算时发生类型混淆,从而实现任意读。对于任意写操作,可以参考Issue1352549中的构造方法进行分析。建议的修复方案是在优化后的函数返回数组元素时,添加对数组map的检查,避免直接计算偏移返回数组值。## PatchGap警告分析Issue1352549后,我们发现一些软件可能存在PatchGap问题。值得注意的是,截至目前Skype仍未修复该漏洞。在x86环境下,任意读写的实现会有所不同,因为没有地址压缩,可以直接相对于整个进程进行操作。这次PatchGap问题不仅涉及Issue1352549,新的绕过方法的公开还大大降低了利用Issue1314616和Issue1216437等漏洞的难度。黑客几乎不需要任何研究成本,就可以完成以往任何泄露uninitialized_oddball漏洞的完整利用。## 总结本文简要讨论了通过泄露Sentinel value中的uninitialized_Oddball来实现任意读原语的方法。V8中还存在许多其他Sentinel value,它们也可能导致类似的安全问题。这给我们以下启示:1. 其他uninitialized_Oddball泄露是否也能轻易实现V8的远程代码执行。2. 此类问题是否应被视为正式的安全问题仍存在争议。3. 考虑在fuzzer中将%TheHole/uninitialized_Oddball等Sentinel value作为变量加入,以挖掘其他利用原语。无论这类问题是否被正式视为安全问题,它们都会显著缩短黑客实现完整利用的周期。
Chrome V8引擎Sentinel Value泄露探究与安全风险分析
探究Chrome V8引擎中Sentinel Value泄露导致的安全风险
前言
Sentinel value是算法中的一种特殊值,通常用作循环或递归算法中的终止条件。Chrome源码中广泛使用了这种特殊值。近期有研究人员通过泄露TheHole对象实现了CVE-2021-38003和CVE-2022-1364的沙箱内任意代码执行。谷歌团队随后迅速对这两个漏洞进行了修复。
然而,除了TheHole对象外,V8中还存在其他不应泄露到JavaScript中的原生对象。本文将重点讨论Uninitialized Oddball对象,并介绍如何利用它绕过V8的HardenProtect机制。值得注意的是,这种绕过方法目前仍然适用于最新版V8,尚未被修复。
V8中的Sentinel Value
V8的大部分原生对象定义在v8/src/roots/roots.h文件中,这些对象在内存中依次相邻排布。一旦这些不应泄露到JavaScript中的原生对象被泄露出来,就可能导致沙箱内任意代码执行。
为了验证这一点,我们可以通过修改V8的native函数,将Uninitialized Oddball泄露到JavaScript中。具体方法是修改%TheHole()函数中相对isolate的偏移,使其返回Uninitialized Oddball。
绕过HardenType保护
利用Uninitialized Oddball对象可以实现相对任意读写。在优化后的JavaScript代码中,read函数没有检查以obj.prop为key的Value,而是直接按照JavaScript语义计算偏移,获取数组的值。这导致了在计算时发生类型混淆,从而实现任意读。
对于任意写操作,可以参考Issue1352549中的构造方法进行分析。建议的修复方案是在优化后的函数返回数组元素时,添加对数组map的检查,避免直接计算偏移返回数组值。
PatchGap警告
分析Issue1352549后,我们发现一些软件可能存在PatchGap问题。值得注意的是,截至目前Skype仍未修复该漏洞。在x86环境下,任意读写的实现会有所不同,因为没有地址压缩,可以直接相对于整个进程进行操作。
这次PatchGap问题不仅涉及Issue1352549,新的绕过方法的公开还大大降低了利用Issue1314616和Issue1216437等漏洞的难度。黑客几乎不需要任何研究成本,就可以完成以往任何泄露uninitialized_oddball漏洞的完整利用。
总结
本文简要讨论了通过泄露Sentinel value中的uninitialized_Oddball来实现任意读原语的方法。V8中还存在许多其他Sentinel value,它们也可能导致类似的安全问题。这给我们以下启示:
其他uninitialized_Oddball泄露是否也能轻易实现V8的远程代码执行。
此类问题是否应被视为正式的安全问题仍存在争议。
考虑在fuzzer中将%TheHole/uninitialized_Oddball等Sentinel value作为变量加入,以挖掘其他利用原语。
无论这类问题是否被正式视为安全问题,它们都会显著缩短黑客实现完整利用的周期。