Wasmtime 两枚 CVSS 9.9 沙箱逃逸漏洞预警:CVE-2026-115889/115893

WebAssembly 运行时最核心的那句承诺,10 月被打破两次。Bytecode Alliance 为 Wasmtime 默认编译器 Cranelift 发布两则紧急公告,CVE-2026-115889 与 CVE-2026-115893 双双评为 CVSS 9.9,攻击者自己构造的 Wasm 模块能在编译阶段越出沙箱,在宿主进程里拿到任意代码执行。修复版已出,但 Wasmtime 是库不是服务,宿主程序必须重新编译。

事件概述

两则公告由 Bytecode Alliance 于 10 月 19 日发布,修复版本在 10 月 19 日至 20 日陆续释出,CVE 记录于 10 月 23 日进入 NVD。两枚漏洞都落在 Cranelift 上——Wasmtime 默认用来把 WebAssembly 翻成机器码的编译器。攻击者必须先让一个有漏洞的 Wasmtime 构建去编译他写的模块,这是两枚漏洞共同的前置条件。截至 10 月 26 日,维护方没有收到任何在野利用报告,两枚都不在 CISA KEV 里,EPSS 评分均低于 0.5%,也没有公开的利用代码。

公告本身没有点名任何受影响的下游服务。但 Fastly 公开表示其 Compute 平台用 Wasmtime 跑客户代码,这个组合正好落在最危险的那一类。

技术细节

把 Cranelift 想成一个翻译:它把模块改写成 CPU 认识的指令,沙箱是这些指令不许越过的墙。翻译一旦出错,墙还在,但指令不再指向所有人以为的那个位置。

CVE-2026-115889:全架构,值编号溢出

Cranelift 用固定位宽打包函数内部的值编号。在 release 构建下,一个超大函数、或一个刻意造出海量值的模块,会让这个编号静默溢出;编译器随后引用错误的值、把代码编译错,攻击者可以把它导向类型混淆,最终完成沙箱逃逸。43.0.0 起该数据结构的位宽已调整,这条路径不复存在。报告人署名为 jaydns,公告注明有 AI 辅助。

CVE-2026-115893:只打 ARM64,跳转表指错目标

第二条只在 aarch64 上成立。一条目标数超过约 25.6 万的 br_table 跳转表会被编译出错误的分支目标,越界索引让跳转落到攻击者控制的偏移上,等于让用户提供的 Wasm 模块跳到任意代码。该缺陷自 2020 年 Wasmtime 首次支持 ARM64 起就存在,报告人为 ilyas-mallah。Bytecode Alliance 的原话是:ARM64 上任意使用默认配置的 Wasmtime 引擎,都可以被用户控制的 Wasm 模块强制跳转到任意代码。

CVE-2026-115889(全架构)    受影响:36.0.19 之前;37.0.0 至 43.0.0
CVE-2026-115893(仅 ARM64)  受影响:36.0.19 之前;37.0.0 至 48.0.7;49.0.0 至 49.0.4
修复版本:36.0.19 / 48.0.7 / 49.0.4 / 50.0.0

还有两个容易踩的细节。第一,Wasmtime 常以库的形式被编进别的程序,只升命令行工具没有意义,每个内嵌它的程序都要用修复版重新构建,两则公告都没有给 workaround。第二,GitHub Advisory 数据库里只有 CVE-2026-115889 建了已审阅条目,用 Dependabot 的团队可能收不到 115893 的告警,ARM64 机器必须手工核对。

影响评估

CVSS 9.9,向量里带 scope changed,意味着越界之后影响的不只是 Wasmtime 自己。风险高低完全取决于谁能把模块递进来:

  • 最低:单租户、只编译自己内部模块的部署。攻击者要先有代码执行能力才能递模块,这更像提权链的一环,而不是入口。
  • 最高:接受客户上传 Wasm 的 serverless 与 FaaS 平台,多租户下一旦逃逸就是跨租户。
  • 次高:边缘计算节点。ARM64 正是边缘与物联网设备的主流架构,而 115893 只打 ARM64,Graviton、Ampere 云实例和 Apple Silicon 构建机都在射程内。
  • 易漏:允许第三方模块的插件系统(CMS、游戏引擎、开发工具),以及用 WASM 做隔离的 AI 推理平台。
  • 无解:还停在 24.x LTS 的实例。该分支支持已于 2026 年 8 月 20 日结束,本次不提供任何修复,只能迁走。

另一个被低估的点是时间窗。4 月刚为另一枚 ARM64 Cranelift 逃逸升到 36.0.7、42.0.2、43.0.1 的机器,这次仍然中招——安全判断不能靠一句我升过了。修复提交是公开的,从已修到被研究透的距离,通常比厂商的公告节奏短得多。

修复建议

  • 按分支升级到 36.0.19、48.0.7、49.0.4 或 50.0.0;50.0.0 于 10 月 20 日发布,两枚都修。
  • 清点所有内嵌的 Wasmtime:serverless 框架、CDN 工具链、容器运行时自带副本、CI 镜像里锁死的版本,这类最容易漏。
  • 用 cargo-audit 对 RustSec 做一次全量扫描,同时人工核对 ARM64 主机的实际版本号。
  • 纵深防御:在 Wasmtime 外面再套一层——seccomp、namespace 隔离,或直接把它关进容器,让沙箱逃逸不等于主机失守。
  • 检测方向:监控宿主进程发出的异常系统调用。Wasm 模块正常运行时不该产生某些提权相关的调用。
  • 对接受外部 Wasm 的业务,先审一遍模块来源与审核流程,这比追版本号更能降低实际风险。

参考来源