CVE-2024-3833:Chrome 渲染器中的远程代码执行漏洞原理解析

295 阅读4分钟

漏洞简介

CVE-2024-3833 是 Chrome 浏览器 V8 JavaScript 引擎中的一个对象损坏漏洞。攻击者可以利用该漏洞,通过诱使用户访问恶意网站,实现在 Chrome 渲染器沙箱中执行任意代码(RCE)。简单来说,就是黑客可以通过一个网页,控制你的 Chrome 浏览器。

技术原理

该漏洞的根源在于 V8 引擎在处理 JavaScript 对象属性时,没有正确处理重复属性。当一个对象中存在重复属性时,V8 引擎可能会出现类型混淆,从而导致内存破坏,最终允许攻击者执行任意代码。

漏洞细节

  1. Origin Trials(源试用)机制

    Chrome 为了让开发者提前体验新功能,引入了 Origin Trials 机制。开发者可以通过注册自己的网站,获得一个 Token,然后在网页中通过 <meta> 标签启用某些实验性功能。

  2. 漏洞触发点

    在 WebAssembly 的 JavaScript Promise Integration 功能中,当 Origin Trial Token 被检测到时,V8 引擎会在 WebAssembly 对象上添加 SuspenderFunction 属性。但是,V8 引擎在添加这些属性之前,没有充分检查 WebAssembly 对象是否已经被用户 JavaScript 代码修改过。

  3. 漏洞利用

    攻击者可以先通过 JavaScript 代码修改 WebAssembly 对象,例如添加一个 Suspender 属性。然后,通过 <meta> 标签激活 JavaScript Promise Integration Origin Trial。由于 V8 引擎没有正确处理,就会在 WebAssembly 对象上创建两个重复的 Suspender 属性。

  4. 对象克隆

    当使用展开语法复制对象时,会创建一个原始对象的浅拷贝:

    const clonedObj = { ...obj1 };
    

    在 V8 中,这被实现为 CloneObject 字节码。

    当一个函数包含字节码第一次运行时,会生成内联缓存代码,并在后续调用中使用,内联缓存代码也会收集输入对象的信息,并为相同类型的输入生成优化的内联缓存处理程序,当代码第一次运行,没有之前输入对象信息和缓存,因此会检测到内联缓存未命中,并使用 CloneObjectIC_Miss 来处理字节码,

  5. 利用思路

    • 创建带重复属性的“字典对象”:利用漏洞,在字典对象中创建重复的 type 属性。
    • 将字典对象转换为“快对象”:通过 MakePrototypesFast 函数,将字典对象转换为快对象。
    • 对象克隆触发漏洞:克隆带有重复属性的快对象,触发 PropertyArray 越界写入漏洞。
    • 操控内存,实现任意代码执行:通过越界写入,修改对象的属性,最终实现任意代码执行。

实际应用例子

假设你正在开发一个在线游戏,使用了 WebAssembly 技术来提高性能。如果你的网站启用了 JavaScript Promise Integration Origin Trial,并且用户访问了包含恶意代码的网页,那么攻击者就可以利用这个漏洞,控制用户的浏览器,甚至窃取用户的游戏账号信息。

Demo 代码

由于漏洞利用代码比较复杂,这里只提供一个简化版的 Demo,用于演示如何在 WebAssembly 对象上创建重复属性:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="origin-trial" content="YOUR_ORIGIN_TRIAL_TOKEN">
  <title>CVE-2024-3833 Demo</title>
</head>
<body>
  <script>
    // 修改 WebAssembly 对象
    WebAssembly.Suspender = {};

    // 激活 JavaScript Promise Integration Origin Trial
    var meta = document.createElement('meta');
    meta.httpEquiv = 'Origin-Trial';
    meta.content = 'YOUR_ORIGIN_TRIAL_TOKEN'; // 替换为你的 Origin Trial Token
    document.head.appendChild(meta);

    // 打印 WebAssembly 对象,查看是否创建了重复属性
    console.log(WebAssembly);
  </script>
</body>
</html>

请注意:

  • 你需要将 YOUR_ORIGIN_TRIAL_TOKEN 替换为你自己的 Origin Trial Token。
  • 这个 Demo 只是演示了漏洞的触发,并不能直接实现代码执行。完整的漏洞利用需要更复杂的代码。

漏洞修复

该漏洞已经在 Chrome 124.0.6367.60/.61 版本中修复。建议用户及时更新 Chrome 浏览器到最新版本。

总结

CVE-2024-3833 是一个严重的 Chrome 远程代码执行漏洞。攻击者可以利用该漏洞,控制用户的浏览器,甚至窃取用户的敏感信息。建议广大开发者和用户提高安全意识,及时更新浏览器版本,避免受到攻击。