漏洞简述
- 漏洞名称:Chromium 远程代码执行漏洞 (CVE-2024-3833)
- 影响:打开恶意网页可能导致Chrome渲染器中的对象损坏,最终导致远程代码执行(RCE).
- 原因:在WebAssembly的
InstallTypeReflection函数中,为某些对象(如wasm_table_constructor等)安装type属性时,没有检查该属性是否已存在,导致可以创建重复属性.
技术细节
-
重复属性的产生
- Chrome在初始化WebAssembly环境时,会安装一些内置属性。
InstallTypeReflection函数负责安装这些属性,但对某些对象,它会忽略是否已存在同名属性。- 攻击者可以通过JavaScript代码提前创建同名属性,再触发
InstallTypeReflection,从而创建重复属性。
-
如何利用重复属性实现RCE
- 属性转移与不一致性:首先,将重复的属性转移到对象内部的
PropertyArray中,导致对象内部的PropertyArray和map之间的不一致。 - 越界写入(OOB Write):这种不一致性会进一步导致
PropertyArray的越界写入。 - 类型混淆:利用越界写入,可以改变JavaScript对象的类型,例如将一个
Object变成一个Array。 - 控制Array长度:通过类型混淆,可以重写
Array的length属性,实现任意地址的读写。 - V8堆利用:在V8堆中,通过越界读写,可以获得任意V8对象的地址,并修改其他对象的属性。
- 代码执行:通过修改WebAssembly导入函数的跳转目标,使其指向攻击者控制的shellcode,从而实现任意代码执行。
- 属性转移与不一致性:首先,将重复的属性转移到对象内部的
实际应用例子
假设一个在线代码编辑器,允许用户运行WebAssembly代码。攻击者可以上传包含恶意JavaScript代码的网页,当用户打开这个网页时,就会触发漏洞,导致攻击者可以在用户的浏览器中执行任意代码,例如窃取用户的代码、安装恶意插件等。
代码示例
以下是一个简化的PoC(Proof of Concept)代码,用于演示如何创建重复属性:
// 创建一个WebAssembly.Tag.prototype对象
var x = WebAssembly.Tag.prototype;
// 提前设置type属性
x.type = {};
// 模拟Origin Trial激活
meta = document.createElement('meta');
meta.httpEquiv = 'Origin-Trial';
meta.content = token; // 替换为有效的token
document.head.appendChild(meta); // 触发漏洞,创建重复的type属性
解释:
- 首先,我们获取
WebAssembly.Tag.prototype对象。 - 然后,我们手动为该对象添加
type属性。 - 最后,我们模拟Origin Trial激活的过程,这会触发Chrome的内部逻辑,尝试再次添加
type属性,从而导致重复属性的产生。
修复方案
- 在
InstallTypeReflection函数中,添加对属性是否已存在的检查,避免重复添加. - 升级Chrome浏览器到124.0.6367.60/.61或更高版本.
总结
CVE-2024-3833是一个典型的由于疏忽导致的漏洞,攻击者通过利用Chrome内部的WebAssembly初始化逻辑,成功实现了远程代码执行。这个漏洞提醒我们,即使在内存安全的语言中,细微的错误也可能导致严重的后果。同时,也展示了现代浏览器漏洞利用的复杂性,需要深入理解JavaScript、WebAssembly和V8引擎的内部机制。