
Google Chrome CVE-2026-6307 PoC
对 Nebula 描述的 V8 JS-to-Wasm 去优化类型混淆的本地复现与武器化,最终在 Chrome for Testing 146.0.7680.165 的渲染进程中弹出 **xcalc**(该漏洞已于 147.0.7727.101` 版本修复)。
所有 payload 均为无害用途(计算器 / exit(0x42) / jmp $)。
所有操作均在本地实验室环境中针对一个故意过时的浏览器进行,
请勿将其指向任何人。
https://github.com/user-attachments/assets/d450f064-ba52-4f39-a88b-367f31217143
JSToWasmFrameStateFunctionInfo 的相等运算符忽略了 Wasm 签名的比较,因此 CSE/GVN 会将仅签名不同的帧状态合并。随后,惰性去优化(lazy deopt)会将 Wasm 的 i64 物化为带标签的 externref(反之亦然),从而获得完整的 64 位 addrof/fakeobj 原语——其指针并非笼压缩(cage-compressed)的(Wasm ref 使用带标签的寄存器表示,通过 kReturnRegister0 返回)。
以下所有内容均在 146.0.7680.165 上实时验证。每次加载的数据都是重复运行后测得的命中率(该混淆对 GC 敏感;每次页面在新构建上重新启动)。没有一次运行产生误报。
--allow-natives-syntax大多数 V8 漏洞 PoC 使用 %OptimizeFunctionOnNextCall 强制优化,这是一个仅用于测试的内建函数,受 --allow-natives-syntax 保护,实际用户不会启用。而本漏洞利用完全不带任何标志驱动,通过调整预热反馈(warmup feedback)使去优化混淆自然触发。每个地址都在运行时泄露——无需硬编码。无需任何标志即可无头运行。
rce-no-aslr/ 将其推进到代码执行:一个经过优化的 JS 函数 g 将 execve shellcode 编排为 JIT 双精度字面量(movabs 常量,每个以 eb rel8 结尾以链接下一个),混淆后的存储将 nop; jmp 修补到 g 的代码中,调用 g() 会使 RIP 滑入 shellcode。
此构建使用 --allow-natives-syntax(%Optimize 固定了 g 的 JIT payload,避免去优化 GC 将其刷新)和 --no-memory-protection-keys(这样混淆后的存储才能修补 JIT 页——否则 V8 的 PKU 会将其标记为只读)。ASLR 已关闭(randomize_va_space=0),因此地址是确定的(A_MAP = 0x5555bbc0128a)。渲染进程还需要 --disable-seccomp-filter-sandbox --no-zygote,因为 seccomp 会阻止 shellcode 的 execve。
原生 x86_64 Linux,ASLR 关闭,PATH 中存在 Chrome 146,:0 上运行 X 显示(Xvfb 或真实 X)。rce-no-aslr/run.sh 设置所有标志并通过 http 提供服务。
cd rce-no-aslr
./run.sh calc # 在 :0 上通过 http://127.0.0.1:8080 弹出真实 xcalc
./run.sh exit # 通过 strace 确认渲染进程的 exit(66)
./run.sh jmp # 通过 gdb 确认 RIP 位于注入的 shellcode 内部
./demo.sh calc # 干净状态 + 自动重试,全尺寸有头浏览器(用于录制)
./demo.sh msgbox # 同上,但弹出的是一个带有品牌标识的“0xSha :: pwned”对话框
pocmode.sh calc|msgbox 切换 RCE 的 execve("/usr/bin/xcalc") 启动的内容(真实计算器 vs 品牌标识对话框)。无标志原语只需浏览器即可:
chrome --headless=new --no-sandbox http://127.0.0.1:8080/flag-free/01-primitives-flagfree.html
flag-free/ 无标志贡献(无需 --allow-natives-syntax)
00-reachability 触发 + 补丁差异(漏洞 146 vs 已修补 147)
01-primitives addrof / fakeobj
02-store 笼外存储
03-arw 笼内 read64 / write64
rce-no-aslr/ 可见的 RCE(确定性,无 ASLR 实验环境构建)
exploit-calc.html / exploit-exit.html
run.sh, demo.sh, pocmode.sh, xcalc-msgbox.sh
漏洞及根本原因分析:Nebula Security(上方链接)。本仓库中的无标志触发、原语及可见成果均为在本地实验室中验证的复现/扩展。
| 文件 | 证明内容 | 验证结果 |
|---|
flag-free/00-reachability-flagfree.html | 触发混淆状态;在易受攻击的 146 版上触发,不会在已修补的 147 版上触发 | 每次加载 6/15 |
flag-free/01-primitives-flagfree.html | addrof / fakeobj(fakeobj(addrof(o))===o) | 8/12 |
flag-free/02-store-flagfree.html | 笼外存储(out-of-cage store)将选定值写入选定对象 | 12/12 |
flag-free/03-arw-flagfree.html | 笼内 read64 / write64(伪造 PACKED_DOUBLE 数组) | 2/12(不稳定,请重试) |
| 文件 | 证明内容 | 验证结果 |
|---|
rce-no-aslr/exploit-calc.html | 通过渲染进程的 execve 弹出真实的 xcalc 窗口 | 在干净状态下约 1 秒弹出 |
rce-no-aslr/exploit-exit.html | 渲染进程运行注入的 shellcode 以 exit(66) 退出;#jmp 使 RIP 在其内部循环 | exit(66) 8/8(strace 验证) |