一个并不精致的复现。基线部分需要一些调整。
Mozilla 将此问题描述为 WebAssembly 释放后使用(use-after-free)。公开修复
9823b5c86ffa 在 JitActivation 中保持精确捕获的 wasm::Code 存活。
该测试执行了一次错误签名的跨实例尾调用。当引擎处理陷阱时,一个 Debugger 展开钩子清除了表中最后一个目标引用,并强制进行收缩式 GC。在进入尾调用之前,Wasm 调用了一个打印标记的普通 JavaScript 导入。
9b564f641a42:状态 139(SIGSEGV)。9823b5c86ffa:打印 PASS: trap handled after target release 并
以 0 退出。poc-controlled.js 通过 144 个导入扩展了目标的共享桩分配。其过期的抛出延续落在四个可执行页面之一内。一个预先创建的惰性分层载体在四页优化代码段中嵌入了 6,000 个唯一的 SIMD 常量。在异常展开期间,GC 释放目标,同步分层重用该空洞。每 64 字节一个系统调用跑道打印 并调用 。
UAF NACHOSexit_group(0)运行:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
在源码构建的 Linux x86-64 修复前 shell 上观察到的可靠性:3/3
次运行打印了标记并以 0 退出。匹配的已修复 shell 会引发正常的
RuntimeError: indirect call signature mismatch 且不打印该标记。
受控 PoC 使用仅限 shell 的 Debugger 和 GC 函数使竞争 具有确定性。它在 jsshell 中建立了原生控制,而非从网页投递或从 Firefox 内容沙箱逃逸。
使用等效的调试 shell 运行:
js --wasm-compiler=baseline --more-compartments poc.js
这是生命周期回归的证据,而非内存原语或漏洞利用。 该标记在两个构建上均出现,且并非由 UAF 导致。