CWA-2023-002:栈溢出崩溃(代号:Cherry)

  • CosmWasm
  • 发布于 2024-08-02 13:38
  • 阅读 14

该安全公告 CWA-2023-002 描述了 CosmWasm 中的一个栈溢出漏洞,攻击者可以通过构造恶意合约利用 Wasm 导入和导出之间的递归循环,导致虚拟机崩溃。已发布补丁以修复此问题,建议相关项目升级其 wasmvm 依赖。

CWA-2023-002: 栈溢出崩溃 (代号 Cherry)

受影响版本:

  • cosmwasm-vm < 1.0.1, < 1.1.10, < 1.2.4
  • wasmvm < 1.0.1, < 1.1.2, < 1.2.3

已修复版本:

  • wasmvm 1.0.1 (cosmwasm-vm 1.0.1)
  • wasmvm 1.1.2 (cosmwasm-vm 1.1.10)
  • wasmvm 1.2.3 (cosmwasm-vm 1.2.4)

Bug描述

这个Bug允许在 Guest 和 Host 之间使用 Wasm 导入和导出进行递归循环,导致 VM 的栈溢出崩溃。

一个恶意的合约可以以不同于标准库的方式实现导出,例如 extern "C" fn allocate(size: usize) -> u32。 通过在 allocate 实现中调用诸如 addr_validate 的 Wasm 导入,循环看起来像

  • 合约调用导入 addr_validate
  • Host 调用导出 allocate
  • 合约调用导入 addr_validate
  • Host 调用导出 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 升级。

应用补丁

  1. 进入包含 go.mod 的 Go 项目。
  2. 以下操作之一:
    • 如果已经列出了直接的 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&lt;NEW WASMVM VERSIO>,其中 &lt;NEW WASMVM VERSION> 是上面列出的 1.0.1、1.1.2 或 1.2.3 之一。
  3. 运行 go mod tidy 下载依赖项并更新 go.sum
  4. 检查替换后的结果版本 go list -m github.com/CosmWasm/wasmvm
  5. 根据你项目的已建立流程进行构建、测试和部署。

构建链后,你可以使用以下命令检查运行时加载的 libwasmvm 版本

## 将 &lt;node> 替换为你的节点名称
&lt;node> query wasm libwasmvm-version

Wasm 模块缓存问题

如果你从 wasmvm 1.2.{0,1} 升级到 wasmvm 1.2.{2,3},请注意, 编译后的 Wasm 模块的机器格式很可能已更改, 在运行新二进制文件时可能会导致段错误。

为避免此问题,请指示你的验证器删除缓存文件夹 &lt;node home>/wasm/wasm/cache/(替换为你项目使用的位置) 在他们停止节点后。

参见 https://github.com/CosmWasm/wasmvm/issues/426

时间线

  • 2023-02-27: Confio 收到来自 Jump Crypto 的 Felix Wilhelm 的详细漏洞报告,包括如何滥用它的说明
  • 2023-03-13: Confio 向报告者确认
  • 进行了进一步的研究并制定了部署策略
  • 2023-04-12: 创建补丁
  • 2023-04-12: 通过 CosmWasm 安全通知列表 宣布补丁发布
  • 2023-04-12 至 2023-04-17: 部署协调
  • 2023-04-17: 在 Cosmos 论坛中 发布了补丁公告
  • 2023-04-18 14:30 UTC: 发布咨询
  • 2023-04-18 15:00 UTC: 发布补丁
  • 2023-04-18 16:15 UTC: 构建并标记所有计划的 wasmvm 版本
  • 2023-06-01: 有关漏洞的详细说明,包括攻击说明 由 Jump Crypto 的 Felix Wilhelm 发布
  • 2023-06-19: Bug 描述已添加到 CWA-2023-002
  • 原文链接: github.com/CosmWasm/advi...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
CosmWasm
CosmWasm
江湖只有他的大名,没有他的介绍。