Cosmos SDK锁定账户未授权资金转移漏洞分析

本文详细分析了Cosmos SDK中存在的锁定账户安全漏洞,攻击者可在锁定期满后从未授权账户转移资金。漏洞源于SendCoins函数中msg.Sender验证缺失,影响多种锁定账户类型。文章包含完整的POC复现步骤和修复方案。

未授权资金转移漏洞分析报告

漏洞影响摘要

攻击者能够从非其所有的锁定账户中转移资金(如果账户存在已解锁资金,可能在锁定期结束后)。概念验证(POC)针对周期性锁定账户完成,但由于问题似乎存在于SendCoins函数中,且被所有锁定账户使用,因此更多锁定账户可能受到影响。

技术细节

当调用函数时,它从消息msg.Sender传递发送者,在checkSender中检查发送者是否等于所有者。但问题在于msg.Sender未在任何地方验证,因为此消息被打包到MsgExecute中。执行时,它将原始发送者设置到上下文中。对于多签账户,它正确地从ctx中获取。但锁定账户从消息中获取,而该消息可以是任何内容。

POC场景

  1. 首先在受害者处创建周期性锁定账户,锁定期较短以避免长时间等待
  2. 等待锁定期结束并将资金转移给攻击者

复现步骤

需要Go和Rust环境:

  1. 检出最新版cosmos-sdk并运行make build。注意二进制文件路径,完成后在setup_chain中替换路径
  2. 使用附带的Cargo.toml创建Rust项目。下载所有附件的*.rs文件并放入src文件夹
  3. 确保setup_chain具有执行权限。运行./setup_chain,等待启动后运行Rust项目

缓解措施

目前似乎没有可行的缓解措施

影响评估

攻击者可以接管某人在锁定账户上锁定后解锁的资金。POC特别演示了周期性锁定账户的情况,但有理由相信更多锁定账户受到影响。

时间线

  • 2025年2月6日:漏洞报告提交
  • 2025年2月7日:团队发布修复补丁(https://github.com/cosmos/cosmos-sdk/pull/23621)
  • 2025年2月25日:漏洞奖励发放,报告状态改为已解决
  • 2025年6月29日:报告公开披露

严重性评级

最终评级为严重(Critical,9-10分),弱点分类为"不当的访问控制-通用"


comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计