该安全公告 CWA-2023-002 描述了 CosmWasm 中的一个栈溢出漏洞,攻击者可以通过构造恶意合约利用 Wasm 导入和导出之间的递归循环,导致虚拟机崩溃。已发布补丁以修复此问题,建议相关项目升级其 wasmvm 依赖。
受影响版本:
已修复版本:
这个Bug允许在 Guest 和 Host 之间使用 Wasm 导入和导出进行递归循环,导致 VM 的栈溢出崩溃。
一个恶意的合约可以以不同于标准库的方式实现导出,例如 extern "C" fn allocate(size: usize) -> u32
。 通过在 allocate
实现中调用诸如 addr_validate
的 Wasm 导入,循环看起来像
addr_validate
allocate
addr_validate
allocate
addr_validate
经过大约 140 次递归后,进程因栈溢出而崩溃。
非恶意的合约不能触发循环,因为通常使用 cosmwasm-std 的调用深度最大为 2。
调用深度限制可以解决这个问题。
明天,4 月 18 日星期二,柏林时间 17:00(UTC 时间 15:00 / 太平洋时间上午 8 点),Confio 将发布对 CosmWasm 中等严重程度安全问题的修复。 此问题的补丁将通过常规 CosmWasm 发布流程进行分发和沟通。
此问题会影响运行 CosmWasm 链的可用性,并可能允许恶意合约触发可能导致链停止的崩溃。 尽管使用具有许可上传或实例化的 CosmWasm 的链没有直接风险,但我们建议支持无需许可的合约实例化的链做好应用补丁的准备,并尽快协调网络升级,以完全修复该问题。
该补丁不是共识破坏性的安全修复,可以就地应用,并且明天将向所有维护者提供说明,作为发布过程的一部分。 我们预计该补丁对于链维护者来说是一个简单明了的修复,因为它只是替换一个 Go 依赖项并重建应用程序。
发布于 https://forum.cosmos.network/t/upcoming-cosmwasm-security-patch-codename-cherry/10474
实际的补丁是在 cosmwasm-vm 的代码库中完成的: https://github.com/CosmWasm/cosmwasm/commit/3795f5cd03288405335d4fb0c46c239dbf4c7e60
它包含在以下版本中:
该补丁以 wasmvm 版本的形式发布给链开发者。 你的链可能直接依赖于 wasmvm,或者通过 wasmd 作为传递依赖项。
升级路径如下:
当前 wasmvm 版本 | 升级路径 | 注意 |
---|---|---|
< 1.0.0 | 不支持 | ^1 |
1.0.0 | 将 wasmvm 升级到 1.0.1 | |
1.1.1 | 将 wasmvm 升级到 1.1.2 | |
1.2.0 | 首先升级到 1.2.2,然后升级到 1.2.3 | [^2] |
1.2.1 | 将 wasmvm 升级到 1.2.3 | [^3] |
1.2.2 | 将 wasmvm 升级到 1.2.3 |
[^2]: 有关所需的 wasmd 更改,请参见 https://github.com/CosmWasm/wasmvm/issues/419
[^3]: 没有笔误。 你可以跳过 1.2.2 并直接从 1.2.1 -> 1.2.3 升级。
go.mod
的 Go 项目。github.com/CosmWasm/wasmvm
依赖项,请将其更新为上面列出的 1.0.1、1.1.2 或 1.2.3。 运行 .wasmvm
作为 wasmd 的间接依赖项。 使用 go list -m github.com/CosmWasm/wasmvm
获取当前版本,然后使用 go mod edit -replace github.com/CosmWasm/wasmvm=github.com/CosmWasm/wasmvm@v<NEW WASMVM VERSIO>
,其中 <NEW WASMVM VERSION>
是上面列出的 1.0.1、1.1.2 或 1.2.3 之一。go mod tidy
下载依赖项并更新 go.sum
go list -m github.com/CosmWasm/wasmvm
。构建链后,你可以使用以下命令检查运行时加载的 libwasmvm 版本
## 将 <node> 替换为你的节点名称
<node> query wasm libwasmvm-version
如果你从 wasmvm 1.2.{0,1} 升级到 wasmvm 1.2.{2,3},请注意, 编译后的 Wasm 模块的机器格式很可能已更改, 在运行新二进制文件时可能会导致段错误。
为避免此问题,请指示你的验证器删除缓存文件夹
<node home>/wasm/wasm/cache/
(替换为你项目使用的位置)
在他们停止节点后。
参见 https://github.com/CosmWasm/wasmvm/issues/426
- 原文链接: github.com/CosmWasm/advi...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!