CVE-2025-61670CVE-2025-61670是Wasmtime WebAssembly运行时中的一个内存泄漏漏洞,影响37.0.0和37.0.1版本。该漏洞源于37.0.0版本开发过程中的一次重构,将Rust内部的`ManuallyRooted<T>`类型替换为新的`OwnedRooted<T>`类型,但这一变更在集成到C/C++ API时未正确处理所有权语义,导致在使用`anyref`或`externref` WebAssembly值时出现内存泄漏。Wasmtime的Rust crate不受此漏洞影响。该漏洞的CVSS评分为3.3,属于低危级别,攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性影响为低(C:L),对完整性无影响(I:N),对可用性影响为低(A:L)。值得注意的是,`OwnedRooted<T>`类型分配的宿主内存位于store之外,因此即使销毁wasmtime_store_t也无法释放泄漏的内存,造成永久性内存泄漏。
该漏洞的技术根源在于Wasmtime 37.0.0版本中Rust内部从`ManuallyRooted<T>`到`OwnedRooted<T>`的类型重构。旧类型`ManuallyRooted<T>`需要手动调用unroot操作来释放资源,但即使忘记unroot,内存仍会在wasmtime_store_t销毁时被清理。然而新类型`OwnedRooted<T>`具有不同的所有权语义——它在Rust析构函数中自动unroot,且分配的宿主内存位于store之外,这意味着泄漏的内存无法通过销毁store来恢复。具体存在三个相关问题:1)C API中`wasmtime_val_unroot`函数存在拼写错误(typo),导致该函数实际上并未执行unroot操作,即使嵌入者正确调用该函数,内存仍会泄漏;2)当宿主定义的函数返回`wasmtime_{externref,anyref}_t`值时,该值永远不会被unroot,因为C/C++ API不再持有该值的访问权,而Rust实现也未对其进行unroot;3)C++ API在添加`OwnedRooted<T>`时未更新类型系统来编码自动内存管理,导致`ExternRef`、`AnyRef`和`Val`类型缺少析构函数,符合惯用法的C++ API使用方式都会泄漏内存。