未授权资金从锁定账户转移 | HackerOne报告 #2976481
影响摘要
攻击者可以从其不拥有的锁定账户转移资金(如果账户有解锁资金,可能在锁定期间结束后)。概念验证(POC)针对周期性锁定账户完成,但由于问题似乎存在于SendCoins函数中,且被所有锁定账户使用,因此更多锁定账户可能受到影响。
当调用函数时,它从消息msg.Sender传递发送者,在checkSender中检查发送者是否等于所有者。但问题在于msg.Sender未在任何地方验证,因为此消息被打包到MsgExecute中。执行时,它将原始发送者设置到上下文中。对于多签名账户,它正确地从ctx中获取。但锁定账户从消息中获取,而消息可以是任何内容。
POC场景
- 首先在受害者处创建周期性锁定账户,锁定周期较短以避免长时间等待
- 等待锁定周期结束并将资金转移给攻击者
重现步骤
需要Go和Rust环境
- 检出最新版本的cosmos-sdk并运行make build。注意二进制文件路径,完成后在setup_chain中替换路径
- 使用附带的Cargo.toml创建Rust项目。下载所有附带的*.rs文件并放入src文件夹
- 确保setup_chain具有执行权限。运行./setup_chain,等待启动,然后运行Rust项目。参见POC视频
规避措施
似乎没有任何规避措施
支持材料/参考资料
- setup_chain - 设置和启动链的脚本
- main.rs, types.rs, client.rs, func.rs, msg.rs和Cargo.toml - 攻击本身
- attack.mov - POC视频
影响
攻击者可以接管某人在锁定账户上锁定然后解锁的资金。POC特别演示了周期性锁定账户,但有理由相信更多锁定账户受到影响。
时间线更新
- 2025年2月6日:漏洞提交,团队确认为高危
- 2025年2月7日:团队发布修复补丁(GitHub PR #23621)
- 2025年2月25日:漏洞修复完成,发放奖励
- 2025年6月29日:报告公开披露
技术细节
漏洞根本原因在于SendCoins函数中msg.Sender参数缺乏充分验证,导致攻击者可以伪造发送者身份。修复方案通过正确处理上下文中的原始发送者信息来解决此问题。
该漏洞被评级为严重级别(9-10分),涉及不当访问控制弱点,直接影响用户资金安全。