0DAY复现/讲解—CVE-2026-85046
漏洞档案
| 字段 | 内容 |
|---|---|
| CVE 编号 | CVE-2026-85046 |
| 漏洞类型 | Type Confusion(类型混淆) |
| 影响组件 | Google Chrome V8 JavaScript/WebAssembly 引擎 |
| 影响版本 | Chrome 152.0.7977.82 之前版本 |
| CVSS 评分 | 8.8(高危) |
| 披露时间 | 2026 年 9 月 3 日 |
| 发现方 | Salvatore Gulizia(Serotav) |
| 在野利用 | 已确认,Google 明确表示 exploit 存在于野外 |
| 攻击前提 | 用户访问恶意网页 |
| 危害 | 渲染进程沙箱内任意代码执行,配合沙箱逃逸可完全控制系统 |
V8 与类型混淆
V8 是 Google 开发的 JavaScript 引擎,用于 Chrome、Node.js 等项目。为了让 JavaScript 这种动态类型语言跑得足够快,V8 采用了多层编译架构:解释器(Ignition)→ 基线编译器(Sparkplug)→ 优化编译器(Maglev / TurboFan)。
优化编译器的核心思路是”投机优化”:根据代码运行时收集的类型反馈(type feedback),假设变量在未来仍然保持相同类型,然后生成高度优化的机器码。如果假设成立,代码跑得飞快;如果假设不成立(发生了去优化,deoptimization),则回退到解释器执行。
类型混淆(Type Confusion)是 V8 漏洞中最常见的类型之一。当优化编译器在某些边界条件下错误地处理了对象的类型信息,导致一段内存被当作错误的类型来解释时,就会发生类型混淆。攻击者可以利用这种混淆来构造任意读写原语,最终实现代码执行。
CVE-2026-85046 就是这样一个漏洞。
根因分析
根据发现者 Salvatore Gulizia 的技术分析,漏洞出在 V8 优化编译器对数组元素类型(elements kind)的处理逻辑中。
V8 中的数组有多种 elements kind,用于描述数组中存储的元素类型:
PACKED_SMI_ELEMENTS:数组中存储的都是小整数(SMI,Small Integer)PACKED_ELEMENTS:数组中存储的是普通对象引用HOLEY_*:数组中存在空洞(未赋值的索引)
不同 elements kind 的数组在内存布局上完全不同。PACKED_SMI_ELEMENTS 数组直接存储整数值,而 PACKED_ELEMENTS 数组存储的是指向对象的指针。如果引擎错误地将一个 PACKED_ELEMENTS 数组当作 PACKED_SMI_ELEMENTS 来读取,就会把对象指针当作整数来解释——这就是类型混淆。
CVE-2026-85046 的具体触发条件是:V8 优化编译器在处理特定的数组操作序列时,错误地允许一个初始化为 PACKED_ELEMENTS 的数组接收 PACKED_SMI_ELEMENTS 的 Map(V8 中描述对象布局的元数据结构)。这个 Map 不匹配打破了内存安全:
读原语(信息泄露):当引擎从数组中读取元素时,它会参考当前 Map 来决定如何解释内存。如果一个 PACKED_ELEMENTS 数组被错误地标记为 PACKED_SMI_ELEMENTS,读取操作会把对象指针直接当作 SMI 整数返回。由于 V8 的 SMI 表示会去掉低位标签位,攻击者可以通过这个原语泄露堆上对象的地址,从而绕过 ASLR。
写原语(任意写入):反过来,写入操作会把攻击者提供的整数直接写入数组槽位,而不会进行对象指针的类型检查。攻击者可以利用这个原语向任意内存地址写入受控内容——通常是覆盖某个对象的虚函数表指针或代码指针,最终劫持控制流。
整个利用链的典型流程是:
- 构造触发类型混淆的 JavaScript 代码,让优化编译器生成错误的机器码
- 利用读原语泄露堆地址,确定关键对象在内存中的位置
- 利用写原语覆盖对象的元数据或函数指针
- 劫持控制流,在渲染进程中执行 shellcode
- (可选)配合沙箱逃逸漏洞突破渲染进程沙箱,获取系统级权限
在野利用情况
Google 在 2026 年 9 月 3 日发布 Chrome 稳定版安全更新时明确表示:”Google is aware that an exploit for CVE-2026-85046 exists in the wild.”(Google 已知晓 CVE-2026-85046 的 exploit 存在于野外。)
这是 2026 年 Chrome 修复的第 6 个零日漏洞。浏览器零日漏洞在野利用通常与水坑攻击(watering hole)或定向钓鱼攻击相关——攻击者在特定网站上植入恶意 JavaScript,当目标用户使用未修复的 Chrome 访问时,自动触发漏洞并执行恶意代码。
对于普通用户来说,这类漏洞的风险在于:不需要下载任何文件、不需要启用任何插件、甚至不需要点击任何按钮,只需要打开一个恶意网页就可能被入侵。
修复与缓解
Chrome 152.0.7977.82 及以上版本已修复此漏洞。修复的核心是在优化编译器中增加对数组 elements kind 转换的校验,确保 PACKED_ELEMENTS 数组不会错误地接收 PACKED_SMI_ELEMENTS 的 Map。
用户侧缓解措施:
- 立即更新 Chrome 到最新版本(设置 → 关于 Chrome,自动检查更新)
- 启用 Chrome 的站点隔离(Site Isolation,默认已启用)
- 不要访问不可信的网站,尤其是通过即时通讯软件收到的不明链接
- 保持操作系统更新,减少沙箱逃逸漏洞的可用攻击面
企业侧建议:
- 通过组策略或 MDM 强制 Chrome 自动更新
- 监控 Chrome 版本分布,确保没有终端长期停留在旧版本
- 部署网络层威胁检测,关注已知的浏览器漏洞利用工具包(exploit kit)流量特征








