| 字段 | 值 |
|---|---|
| CVE | CVE-2026-9999 |
| 厂商 / 产品 | Google Chrome |
| 受影响版本 | Chrome < 148.0.7778.216,仅限 macOS [1] |
| 修复版本 | 148.0.7778.216 [1] |
| 影响 | 通过特制 HTML 页面在沙箱内执行任意代码 [1] |
| Chromium 严重级别 | 高 [1] |
| CVSS 3.1(CISA-ADP) | 8.8 高危 — CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H [1] |
| NVD(NIST)CVSS 评估 | 尚未提供 [1] |
| CWE | CWE-269 — 权限管理不当(由 CISA-ADP 补充)[1] |
| CISA SSVC(2026-05-29) | exploitation: none,automatable: no,technicalImpact: total [1] |
| 发布时间 / 最后修改 | 2026-05-28 / 2026-07-21 [1] |
| 根本原因 | 未公开 — Chromium issue 513364480 显示“需要权限”[1] |
攻击链含义: [1] 中“在沙箱内”执行代码意味着攻击者可以控制一个沙箱化进程(最可能是 GPU 进程)。完整的浏览器接管还需要一次单独的沙箱逃逸,而该逃逸不属于本 CVE 的范畴。
以下内容是基于公开记录的推断,并非已确认的事实:
因此,该工具专门针对这些模式进行测试,然后大规模变异 GLSL,以寻找渲染器端的崩溃(WebGL 上下文丢失 = GPU 进程崩溃或被看门狗杀死)。
| 文件 | 用途 |
|---|---|
cve-2026-9999-poc.html | 自包含 PoC 工具(无依赖):构建指纹识别、8 个精选的翻译器压力着色器、带崩溃产物捕获的 GLSL 模糊器 |
README.md | 本文档 |
Google 的 Chrome for Testing 归档提供了固定版本的构建,不会自动更新。找到最新的受影响构建(所有低于 148.0.7778.216 的版本均受影响 [1]):
import json, urllib.request
data = json.load(urllib.request.urlopen(
"https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"))
key = lambda v: tuple(int(x) for x in v.split('.'))
fix = (148, 0, 7778, 216)
cands = sorted((v["version"] for v in data["versions"]
if "chrome" in v.get("downloads", {}) and key(v["version"]) < fix), key=key)
print(cands[-5:]) # pick the last (newest vulnerable) entry
针对你的架构(uname -m)下载:
# Apple Silicon
https://storage.googleapis.com/chrome-for-testing-public/<VERSION>/mac-arm64/chrome-mac-arm64.zip
# Intel
https://storage.googleapis.com/chrome-for-testing-public/<VERSION>/mac-x64/chrome-mac-x64.zip
解压到实验文件夹(例如 ~/lab/,不要放到 /Applications),并从那里启动。
如果 Chrome for Testing 中缺少某个特定构建,可使用 Chromium 快照归档(Intel 为 commondatastorage.googleapis.com/chromium-browser-snapshots/Mac/,Apple Silicon 为 .../Mac_Arm/),按提交位置索引——通过 chromium-history 将受影响版本映射到分支位置,然后拉取最近的快照。快照同样不会自动更新。
杀掉 Keystone 更新程序代理并屏蔽 googleupdate.googleapis.com,否则测试构建会在夜间静默自我修补。Chrome for Testing 构建不需要此步骤。
如果没有 Metal,Chrome 会用软件方式(SwiftShader)渲染 WebGL,永远不会触及 ANGLE Metal 后端。在 PoC 页面的控制台中运行:
const c = document.createElement('canvas'), g = c.getContext('webgl2');
const x = g.getExtension('WEBGL_debug_renderer_info');
console.log(g.getParameter(x.UNMASKED_RENDERER_WEBGL));
// Good: contains "ANGLE Metal Renderer"
// Bad: contains "SwiftShader" -> the vulnerable path is NOT being exercised
你也可以在 chrome://gpu 中确认。支持 GPU 虚拟化的 Parallels/VMware Fusion 虚拟机通常可以正常工作;最小的 QEMU/UTM 环境通常会回退到 SwiftShader。
cd <repo dir>
python3 -m http.server 8000
# then browse to http://localhost:8000/cve-2026-9999-poc.html
1) Run curated triggers(运行精选触发器)。 八个着色器对 §2 中描述的翻译器模式进行压力测试(越界常量索引、整数溢出数组大小、动态矩阵索引、循环展开压力、数组的数组、discard/swizzle、预处理器边界、超大 UBO)。留意 [!!] 结果和上下文丢失事件。2) Fuzz(模糊测试)。 变异的 GLSL 着色器会被循环编译、链接、绘制并读回。留意日志中的 CONTEXT LOST。localStorage。取回它:
localStorage.getItem("cve20269999_poc_fs"); // crashing fragment shader
localStorage.getItem("cve20269999_crashes"); // crash event log
可疑运行的实时快照也可以在
chrome://gpu和 macOS 控制台(GPU 进程崩溃报告)中查看。
WEBGL_context_lost ≠ 漏洞。 Chrome 的 GPU 看门狗会杀死长时间运行的着色器(loop-unroll-dos 触发器和具有巨大循环计数的模糊迭代被有意设计为运行缓慢)。消除噪音:减小 SH_ITER,或确认任何候选崩溃都能快速复现(每次迭代 < 1 秒)。EXC_BAD_ACCESS),而不是看门狗终止。使用 AddressSanitizer 构建一个受影响的 Chromium 版本:
fetch chromium
cd src
git checkout tags/148.0.7778.215 # last tag before the fix
gn gen out/asan --args='is_asan=true is_debug=false symbol_level=1 dcheck_always_on=true'
autoninja -C out/asan chrome
然后在启用 Metal API 验证的情况下运行最小化的崩溃着色器:
MTL_DEBUG_LAYER=1 out/asan/Chromium.app/Contents/MacOS/Chromium poc.html
ASAN 跟踪将指出确切的 ANGLE/Metal 函数,并确认崩溃是否与该 CVE 的组件匹配 [1]。
(后续:一旦 148.0.7778.216 的修复提交可见,对 third_party/angle/src/libANGLE/renderer/metal/ 执行 diff,以定位真正的根本原因,并用确定性触发器取代模糊测试方法。)
exploitation: none [1]。仅在你拥有或明确授权测试的机器上进行测试。该工具故意编译对抗性着色器以使图形进程崩溃——预期会出现 GPU 进程被杀。让受影响浏览器构建远离生产网络。
[1] NVD — CVE-2026-9999:https://nvd.nist.gov/vuln/detail/CVE-2026-9999 * 厂商公告(Chrome 发布博客,稳定版渠道更新): https://chromereleases.googleblog.com/2026/05/stable-channel-update-for-desktop_0877304591.html * Chromium issue 513364480(访问受限): https://issues.chromium.org/issues/513364480