首页 网络安全 正文
  • 本文约2015字,阅读需10分钟
  • 18
  • 0

Wasmtime中的安全漏洞CVE-2025-61670

摘要

栋科技漏洞库关注到 Wasmtime 受影响版本中存在一个安全漏洞,该漏洞现在已经被追踪为CVE-2025-61670,漏洞CVSS 4.0评分为1.0。

Wasmtime 是一个 WebAssembly 运行时环境,由Bytecode Alliance开发的WebAssembly运行时,支持在非浏览器环境中执行WASM代码,

Wasmtime能够在Linux、macOS、Windows等操作系统上运行,通过WASI(WebAssembly System Interface)标准来实现系统资源访问。

一、基本情况

Wasmtime支持Rust、C、C++、Go编译WASM代码,采用即时编译技术(JIT)提升运行效率,适用于嵌入式开发、服务器端应用等场景。

Wasmtime中的安全漏洞CVE-2025-61670

Wasmtime 通过内存映射文件技术优化磁盘数据读写,适用于高性能数据场景,提供内存安全保障和模糊测试,确保代码在受控环境运行。

栋科技漏洞库关注到 Wasmtime 受影响版本中存在一个安全漏洞,该漏洞现在已经被追踪为CVE-2025-61670,漏洞CVSS 4.0评分为1.0。

二、漏洞分析

CVE-2025-61670是Wasmtime版本37.0.0和37.0.1在C/C++API时内存泄漏,出现与当使用anyref或externaref WebAssembly值的绑定时。

具体而言,该内存泄露漏洞是是由Wasmtime版本在37.0.0开发过程中引入的回归引起的,所有先前版本的Wasmtime均不受漏洞的影响。

如果不通过 C/C++ API 使用 anyref`或 externref,则嵌入式应用不会受到泄漏行为的影响,wasmtime Rust crate 未受到此次泄漏的影响。

Wasmtime 37.0.0 的开发包括在Rust中被进行重构,其将旧的ManuallyRooted<T>类型进行了替代,变更为新的OwnedRooted<T>类型。

该更改已集成到Wasmtime的C API中,但使C API处于内存泄漏状态。此外该类型的新所有权语义并未反映在 C++ API 中,使其容易泄漏。

简而言之,这一变化意味着之前 ManuallyRooted<T>类型如其名称所示,而以前的ManuallyRooted<T>则需要手动调用 unroot 进行操作。

如果忘记了这一点,那么当 wasmtime_store_t 本身最终被销毁时,内存仍然被清理干净。

关于何时 unroot 的文档很少,而且在 37.0.0 之前就已经存在这样的情况,即直到存储被销毁时,内存才会泄漏。

然而,所有的内存始终受到存储的约束,销毁存储将保证没有内存泄漏

迁移到OwnedRooted<T>后,Rust中类型用法发生变化而无需手动unroot操作,作为Rust本身中OwnedRooted<T>类型析构函数自然发生。

这些新的资源所有权语义并未完全集成到 Wasmtime 现有 C/C++ API 的现有语义中。

OwnedRooted<T>与ManuallyRooted<T>的一个关键区别是,OwnedRooted<T>类型在存储之外分配主机内存。

这意味着,如果OwnedRooted<T>泄漏,则销毁存储并不会释放此内存,而是会在主机上造成永久内存泄漏。

这导致了一些独特但相关的问题:

1、C API 中 wasmtime_valunrot 函数中的一个拼写错误,意味着它实际上并未执行任何 unroot 操作。

这意味着,即使嵌入者忠实地调用函数,内存也会泄漏。

2、如果主机定义的函数返回wasmtime_{externref,anyref}_t值,则该值从未被 unroot。

C/C++API无法访问该值,且 Rust 实现并未对其进行 unroot 操作,这意味着以这种方式返回的任何值都从未被 unroot。

3、Wasmtime的C++API的目标是在类型系统中对自动内存管理进行编码,但当添加OwnedRooted<T>时,C++API没有更新。

这意味着由于缺少对值析构函数的调用,C++ API 的惯用用法会由于缺少值的析构函数而导致内存泄漏。

上述这些问题都已经在 Wasmtime 的 37.0.2 版本中得到了修复。C和C++API的实现已相应地分别更新,以适应此处所有权的变更。

例如,wasmtime_val_nrot 已修复为固定以执行 unroot 操作,Rust 侧实现调用嵌入器定义的函数的Rust-side将自动取消 unroot 返回值。

而 C++API 现在在ExternRef、AnyRef和val类型上具有析构函数。上述这些更改是以非破坏 API 的方式对37.0.x发布分支进行的。

而对于 38.0.0 发布分支(以及 Wasmtime 存储库中的main分支)的更改包括轻微 API 更新,以更好地适应 API 语义的更改。

Wasmtime 37.0.2已经发布,修复了这些问题,建议使用37.0.0和37.0.1版本的用户升级。36.0.x及之前版本的用户则不受影响,无需升级。

目前唯一的解决方案是避免在 Wasmtime 的 C/C++ API 中使用 externref 和 anyref,若无法避免使用这些,用户必须更新以缓解泄漏问题。

三、影响范围

Wasmtime < 37.0.2

四、修复建议

Wasmtime >= 37.0.2

五、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接