Wasmtime 竞争条件可能导致 WebAssembly 控制流完整性和类型安全违规(CVE-2024-47813)
CVE编号
CVE-2024-47813利用情况
暂无补丁情况
N/A披露时间
2024-10-10漏洞描述
Wasmtime是一个用于WebAssembly的开源运行时。在某些并发事件的顺序下,由于竞争条件,`wasmtime::Engine`的内部类型注册表容易受到双重注销错误的影响,导致恐慌和潜在的类型注册表损坏。这种注册表损坏可能在附加的特定并发事件序列之后,导致WebAssembly的控制流完整性(CFI)和类型安全受到侵犯。不使用`wasmtime::Engine`进行多线程操作的用户不会受到影响。仅随时间在不同线程上创建新模块的用户也不会受到影响。要复现此错误,需要在多个线程上并发创建并删除多个类型实例(如`wasmtime::FuncType`或`wasmtime::ArrayType`),所有这些类型都与同一个`wasmtime::Engine`相关联。Wasm客人无法触发此错误。请参阅下面的“参考”部分,以获取受影响的Wasmtime类型相关API列表。Wasmtime在`wasmtime::Engine`内部维护一个类型注册表,并且引擎可以在线程之间共享。可以通过创建`wasmtime::Module`、创建`wasmtime::FuncType`或通过主机创建函数的一系列其他API(请参阅下面的“参考”部分)来创建和引用类型。每种情况都与引擎进行交互,以重复利用类型信息并管理用于实现WebAssembly的`call_indirect`函数中的类型检查的类型索引。此错误是一个管理过程中的竞争条件,会导致内部类型注册表损坏,从而触发断言或包含无效状态。Wasmtime的类型的内部表示(例如每个主机函数一个)会维护一个使用计数,以了解该类型已被使用多少次。类型在引擎内部还有一个状态,例如查找/去重信息,该状态位于读写锁后面。这里的竞争条件是一个时间检查与使用(TOCTOU)错误,其中一个线程原子地减少类型条目的注册计数,观察到零注册,然后获取锁以注销该条目。但是,在第一个线程观察到零注册计数和它获取锁之间的时间,另一个线程可能会执行以下事件序列:重新注册该类型的另一个副本,该副本去重到同一条目,使其复活并增加其注册计数;然后删除类型并减少其注册计数;观察到注册计数现在为零;获取类型注册表锁;最后注销该类型。现在,当原始线程最终获取锁并注销条目时,这是该条目第二次被注销。这个错误最初是在Wasmtime 19开发WebAssembly GC提案时引入的。但是,这个错误影响了即使禁用GC提案也在默认配置下使用Wasmtime的用户。使用19.0.0及以后版本的Wasmtime用户都受此问题影响。我们已经发布了以下Wasmtime版本,所有这些版本都修复了此错误:* 21.0.2 * 22.0.1 * 23.0.3 * 24.0.1 * 25.0.2。如果您的应用程序在多个线程上并发创建和删除Wasmtime类型,目前没有已知的解决方法。鼓励用户升级到已修复的发布版本。解决建议
"将组件 wasmtime 升级至 22.0.1 及以上版本""将组件 wasmtime 升级至 21.0.2 及以上版本""将组件 wasmtime 升级至 23.0.3 及以上版本""将组件 wasmtime 升级至 24.0.1 及以上版本""将组件 wasmtime 升级至 25.0.2 及以上版本"
参考链接 |
|
---|---|
https://github.com/bytecodealliance/wasmtime/pull/7969 | |
https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-7qmx-3fpx-r45m |
- 攻击路径 N/A
- 攻击复杂度 N/A
- 权限要求 N/A
- 影响范围 N/A
- 用户交互 N/A
- 可用性 N/A
- 保密性 N/A
- 完整性 N/A
CWE-ID | 漏洞类型 |
CWE-367 | 检查时间与使用时间(TOCTOU)的竞争条件 |
Exp相关链接

版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论