【Rust日报】2026-10-23 Wasmtime 修复 CVSS 9.3 沙箱逃逸
内容提要
Wasmtime修复了component-model-async回调返回类型校验错误导致的沙箱逃逸漏洞(CVSS 9.3),访客可向宿主栈写入约16KB数据覆盖返回地址,影响39.0.0至48.0.4及49.0.0至49.0.2版本,已修复。另有文章复测Tov基准未复现其“比Rust快”的结果,Gitoxide对象库提速约1.33倍,作者还比较了egui与Freya实现同一计算器,认为Freya开发更快、内存更低。
延伸解读
沙箱逃逸的根因与影响
漏洞源于 wasmparser 对 async-lifted 回调返回类型校验的笔误,只检查参数而未检查返回类型,导致 Wasmtime 在生成 trampoline 时按错误元数分配栈空间。访客可向宿主栈写入约 16KB 数据并覆盖返回地址,CVSS 9.3 属严重级别。尽管 ASLR 和不可执行栈能增加利用难度,嵌入方仍应按沙箱逃逸处理,不能因缓解措施存在而降低警惕。
修复与临时缓解措施
受影响版本为 Wasmtime 39.0.0 至 48.0.4 之前,以及 49.0.0 至 49.0.2 之前,修复版本是 48.0.4 和 49.0.2。若无法立即升级,可关闭 component-model-async 特性,此时使用 async 特性的组件会被拒绝;也可先用 wasmparser 1.260.0 或更高版本校验组件再交给 Wasmtime。评论指出现有 SAST 和 semgrep 规则未能捕获该错误,说明静态检查对此类校验缺陷存在盲区。
基准复测的方法论启示
Tov 宣称比 Rust 快,但复测在三台机器上均未复现其 bigint_fib 的差距,Rust 反而快 1.34 至 1.35 倍。dispatch 和 map_insert 的对比也显示原 Rust 基准与 Tov 版本并不等价:前者使用 Vec<Box<dyn Shape>> 和 format! 造键,改写为 enum 加内联或 AHashMap 并预生成键后,Rust 侧显著提速。这提醒读者,跨语言基准需核对实现是否等价,否则结论可能失真。
Gitoxide 与 GUI 框架的进展
Gitoxide 借助 Sirocco 解压库,提交遍历从 18.7 万次/秒升至 25.9 万次/秒,约 1.33 倍,pack 索引约快 1.27 倍,启用方式是添加 zlib-sirocco feature。同一篇还提到 linked worktree 的创建删除、锁定解锁等接口进展,但稳定 gix API 的前置改动尚未合入。另一篇文章比较 egui 与 Freya 实现同一计算器,作者称 Freya 开发时间少约 80%,release 模式内存低于 270 MB,而 egui 版超过 320 MB。
Q&A
Wasmtime 最近修复的沙箱逃逸漏洞严重程度如何?影响哪些版本?
该漏洞 CVSS 评分为 9.3,严重级别为 Critical。受影响版本为 Wasmtime >= 39.0.0 且 < 48.0.4,以及 >= 49.0.0 且 < 49.0.2。修复版本是 48.0.4 和 49.0.2。
Wasmtime 这个沙箱逃逸漏洞是怎么产生的?攻击者能做什么?
漏洞源于 component-model-async 回调函数的返回类型未被正确校验。wasmparser 0.259.0 及更早版本中,async-lifted 导出的回调本应接收 3 个 i32 参数并返回 1 个 i32,但由于笔误,校验只检查了参数是 3 个 i32 或 1 个 i32,没有检查返回类型。Wasmtime 在记录回调索引时也未再断言返回类型和元数。生成 trampoline 时,参数和结果缓冲区没有运行时边界检查。访客因此可以向宿主进程的原生栈写入最多约 16KB 自选数据,覆盖返回地址,将控制流转到任意宿主代码或导致进程崩溃。
如果无法立即升级 Wasmtime,有什么临时缓解措施?
可以关闭 component-model-async 特性,这样使用 async 特性的组件会被拒绝。也可以先用 wasmparser 1.260.0 或更高版本校验组件,再交给 Wasmtime 处理。
Tov 语言宣称比 Rust 快,复测结果如何?
复测文章检查了 bigint_fib、dispatch、map_insert 三个基准,未能复现 Tov 官方宣称的“比 Rust 快 10 倍以上”的结果。在多数测试中,Rust 经过合理优化后反而更快,例如 bigint_fib 在部分机器上 Rust 快 1.34 倍,dispatch 使用 enum 优化后比 Tov 快 6.12 倍,map_insert 使用 AHashMap 后比 Tov 快 1.25 倍。文章指出原 Rust 基准与 Tov 版本并不等价。
Gitoxide 对象数据库性能提升了多少?如何启用?
Gitoxide 对象数据库性能提升了约 1.33 倍(提交遍历速度从 18.7 万次/秒升到 25.9 万次/秒),pack 索引大约快 1.27 倍。加速来自纯 Rust 解压库 Sirocco。启用方式是给 gix 依赖加上 zlib-sirocco feature。
用 Freya 和 egui 实现同一个计算器,开发体验和资源占用有什么差异?
作者用 Freya 重写同一计算器后,达到相同进度大约少用了 80% 的时间。release 模式下,egui 版占用 320 MB 以上内存,而 Freya 版低于 270 MB。Freya 的 retained mode 布局更直接,use_state 和 use_memo 减少了样板代码,状态默认响应式。