2022 年 1 月 18 日,知道创宇区块链安全实验室 监测到 BSC 上 Crosswise 遭遇攻击,此次攻击导致协议损失 87.9 万美元。
攻击者仅用 1 个 CRSS token 便获取 Crosswise MasterChef 池中价值 87.9 万美元的 692K 个 CRSS。实验室将对本次事件深入跟踪并进行分析。
此次攻击的核心在于,Crosswise 中的 MasterChef 合约 Owner 地址设置即 transferOwnership 函数能够被攻击者绕过,使得攻击者能够成为新的 Owner 并对 MasterChef 池子进行攻击利用。
我们将本次攻击过程分为两个阶段进行分析:获取 Owner 权限攻击和 MasterChef 池攻击。
1.由于在 MasterChef 合约中 setTrustedForwarder 函数为公开可见性且未作权限设置,攻击者先将自己的地址设置为 TrustedForwarde 地址。
2.Crosswisefi 项目方对 MasterChef 的 _msgSender() 函数并未采取 openzepplin 的标准写法且存在漏洞,导致攻击者能够通过构造恶意的 calldata 实现绕过 onlyOwner 限制完成合约 Owner 的获取。、
下图为攻击者绕过 onlyOwner 权限构造的恶意 payload:
1.攻击者在 CrosswiseRouter 中用 0.01 个 WBNB 兑换出 3.71 个 CRSS
2.攻击者调用 deposit 将 1 个 CRSS 质押到 Crosswise MasterChef
3.由于上一阶段攻击者已经获取到 MasterChef 的 Owner 权限,此时攻击者调用 set 函数对 MasterChef 的 pid 为 0 的池子重新部署了一个未开源的策略合约
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 权限更改能被绕过。
知道创宇区块链安全实验室 在此提醒,任何有关合约权限问题的操作都需要慎重考虑,合约审计、风控措施、应急计划等都有必要切实落实。
声明:本文系金色财经原创稿件,版权属金色财经所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:金色财经",违者将依法追究责任。
提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。
Web3项目动态
陀螺财经
SevenUp DAO