“一两拨千金”:Crosswise攻击事件分析_虚拟币交易所平台,数字货币,NFT
前言
foreword 比特币今日价格行情网_okx交易所app_永续合约_比特币怎么买卖交易_虚拟币交易所平台
2022 年 1 月 18 日,知道创宇区块链安全实验室监测到 BSC 上 Crosswise 遭遇攻击,此次攻击导致协议损失 87.9 万美元。
攻击者仅用 1 个 CRSS token 便获取 Crosswise MasterChef 池中价值 87.9 万美元的 692K 个 CRSS。实验室将对本次事件深入跟踪并进行分析。
基础信息
攻击交易哈希:
0xd02e444d0ef7ff063e3c2cecceba67eae832acf3f9cf817733af9139145f479b
攻击者地址:
0x748346113B6d61870Aa0961C6D3FB38742fc5089
攻击合约:
0x530B338261F8686e49403D1b5264E7a1E169F06b
MasterChef:
0x70873211CB64c1D4EC027Ea63A399A7d07c4085B
CrosswiseRouter:
0x8B6e0Aa1E9363765Ea106fa42Fc665C691443b63
CRSS:
0x99FEFBC5cA74cc740395D65D384EDD52Cb3088Bb
攻击核心
此次攻击的核心在于,Crosswise 中的 MasterChef 合约 Owner 地址设置即 transferOwnership 函数能够被攻击者绕过,使得攻击者能够成为新的 Owner 并对 MasterChef 池子进行攻击利用。
我们将本次攻击过程分为两个阶段进行分析:获取 Owner 权限攻击和 MasterChef 池攻击。
获取 Owner 权限攻击
1.由于在 MasterChef 合约中 setTrustedForwarder 函数为公开可见性且未作权限设置,攻击者先将自己的地址设置为 TrustedForwarde 地址。
2.Crosswisefi 项目方对 MasterChef 的 _msgSender() 函数并未采取 openzepplin 的标准写法且存在漏洞,导致攻击者能够通过构造恶意的 calldata 实现绕过 onlyOwner 限制完成合约 Owner 的获取。
下图为攻击者绕过 onlyOwner 权限构造的恶意 payload:
MasterChef 池攻击
1.攻击者在 CrosswiseRouter 中用 0.01?个 WBNB 兑换出 3.71 个 CRSS
2.攻击者调用 deposit 将 1 个 CRSS 质押到 Crosswise MasterChef
3.由于上一阶段攻击者已经获取到 MasterChef 的 Owner 权限,此时攻击者调用 set 函数对 MasterChef 的 pid 为 0 的池子重新部署了一个未开源的策略合约:
0xccddce9f0e241a5ea0e76465c59e9f0c41727003
4.攻击者调用 MasterChef 的 withdraw 函数从池子中获取 692K 的 CRSS
5.最后攻击者把 692K 的 CRSS 通过 CrosswiseRouter 合约 swap 兑换出 547 个 BNB完成攻击,获利超 87.9 万美元。
策略合约
猜想
由于攻击者部署的策略合约并未开源,我们只能反向推导猜想策略合约的主要逻辑:
1.根据下图第 18 行代码可以推断出合约中 lockedAmount 应该是一个极大值才能支撑攻击者 692k 的代币转出;又根据第 7-11 行可以推导出攻击者部署的 strategy 合约的 LockeTotal() 函数返回值极大、sharesTotal() 返回值极小。
2.在上图代码 23 行当 _amount>0 时,会先计算出 user的shareRemoved,然后在执行 user.amount = user.amount.sub(shareRemoved);
此时若 shareRemoved 大于 user.amount 则代码执行不会通过,可以推导出 26 行的 shareRemoved 值很小,又 shareRemoved 是调用攻击者部署 strategy 合约中 withdraw 获取,所以此时的 strategy 合约中 withdraw 的返回值会很小,小于之前质押的 1 个 CRSS 数量;
再结合链上数据可推导攻击者部署 strategy 合约中的 withdraw 调用返回值为 0。
反编译
为了证实我们的猜想是否正确,我们将攻击者部署的策略合约进行反编译。
反编译后我们可以发现存在一个极大值和一个较小值的常量,即对应猜想 1 中 LockeTotal 和 sharesTotal 值,猜想1正确。
对于猜想 2,经过反编译后我们可以看到策略合约的 withdraw 最后的返回值为 0,猜想 2 正确。
总结
这次攻击产生的主要原因是项目方使用错误的方法去获取 msgSender,导致合约的 Owner 权限更改能被绕过。
知道创宇区块链安全实验室 在此提醒,任何有关合约权限问题的操作都需要慎重考虑,合约审计、风控措施、应急计划等都有必要切实落实。
查看更多
注册有任何问题请添加 微信:MVIP619 拉你进入群
打开微信扫一扫
添加客服
进入交流群
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。