WebAssembly 常被当成一道墙:不信任的代码扔进沙箱,它在里面怎么折腾,也碰不到外面。这个说法大体成立,前提是沙箱本身没漏。Wasmtime 这次漏了两处,都在编译器后端,分数都到了 9.9。
两条分别是 CVE-2026-115893 和 CVE-2026-115889。
前一条在 aarch64 上。当一个 Wasm 模块里的 br_table 指令目标超过大约 25.6 万个,Cranelift 后端会把条件跳转的目标算错,分支可能落到一段偏移由用户控制的代码上。本该在沙箱里跑的模块,就从编译器生成出来的那段代码里翻了出去。这条只影响 aarch64。
后一条跟架构无关。Cranelift 在把自己的 SSA 值编号做位打包时,碰到特别大、或者刻意构造的、SSA 值特别多的函数,release 构建下会静默溢出;溢出之后编译器引用到错误的 IR 值,编译出来的就是错的东西——类型混淆,加一串攻击者能借力的副作用,最后同样指向逃出 Wasm 沙箱。
两条的共同点,是它们都出在后端,跟 Wasm 的语义没关系,是「把 Wasm 翻成本机代码」这一步翻错了。这也解释了为什么这种洞不像业务代码的洞那么好防:沙箱的边界,是靠这段编译器代码守的。它自己漏了,沙箱里再干净的模块也没意义。
影响版本:CVE-2026-115893 影响 36.0.19、48.0.7、49.0.4 之前的对应分支;CVE-2026-115889 影响 36.0.19 和 43.0.0 之前的版本。
修复版本:36.0.19、43.0.0、48.0.7、49.0.4,按自己所在的分支取。
一条自查:wasmtime --version;把 Wasmtime 当运行时用、或者嵌进服务里跑插件 / 多租户代码的,版本对不上就得升。
这类「运行时自己出的洞」,我们前面写过两个近亲:Node.js 那个 Brotli 解码器的越界写(CVE-2026-111497,社区叫 Node2Shell),一样是应用代码没毛病、坏在运行时底层那段;还有 PHP2Shell 那两个不需要登录就能打的 RCE,也是同一回事——大家盯着自己的业务代码,真正能进的攻击面却常常在那层之下。
升级 Wasmtime 一般不用重启周边服务,比内核那种折腾省事。前提是你得先知道自己到底有没有在用它——很多项目是当依赖嵌进去的,装的人未必记得这一层。
官方公告:GHSA-mghf-wjfp-p5xm(https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-mghf-wjfp-p5xm);修复版发布记录:https://github.com/bytecodealliance/wasmtime/releases/tag/v36.0.19

评论