Crosswise攻击事件分析:“一两拨千金”

本文约970字,阅读全文需要约2分钟
2022年1月18日,BSC上Crosswise遭遇攻击,此次攻击导致协议损失87.9万美元。

前言

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地址。

Crosswise攻击事件分析:“一两拨千金”

2.Crosswisefi 项目方对MasterChef的_msgSender()函数并未采取openzepplin的标准写法且存在漏洞,导致攻击者能够通过构造恶意的calldata实现绕过onlyOwner限制完成合约Owner的获取。

Crosswise攻击事件分析:“一两拨千金”

下图为攻击者绕过onlyOwner权限构造的恶意payload:

Crosswise攻击事件分析:“一两拨千金”

MasterChef池攻击

1.攻击者在CrosswiseRouter中用0.01 个WBNB兑换出3.71个CRSS

2.攻击者调用deposit将1个CRSS质押到Crosswise MasterChef

3.由于上一阶段攻击者已经获取到MasterChef的Owner权限,此时攻击者调用set函数对MasterChef的pid为0的池子重新部署了一个未开源的策略合约:0xccddce9f0e241a5ea0e76465c59e9f0c41727003

Crosswise攻击事件分析:“一两拨千金”

4.攻击者调用MasterChef的withdraw函数从池子中获取692K 的 CRSS

Crosswise攻击事件分析:“一两拨千金”

5.最后攻击者把 692K 的 CRSS 通过 CrosswiseRouter 合约 swap 兑换出 547 个 BNB完成攻击,获利超87.9万美元。

策略合约

猜想

由于攻击者部署的策略合约并未开源,我们只能反向推导猜想策略合约的主要逻辑:

1.根据下图第18行代码可以推断出合约中lockedAmount应该是一个极大值才能支撑攻击者692k的代币转出;又根据第7-11行可以推导出攻击者部署的strategy合约的LockeTotal()函数返回值极大、sharesTotal()返回值极小。

Crosswise攻击事件分析:“一两拨千金”

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。

Crosswise攻击事件分析:“一两拨千金”

反编译

为了证实我们的猜想是否正确,我们将攻击者部署的策略合约进行反编译。

Crosswise攻击事件分析:“一两拨千金”

反编译后我们可以发现存在一个极大值和一个较小值的常量,即对应猜想1中LockeTotal和sharesTotal值,猜想1正确。

对于猜想2,经过反编译后我们可以看到策略合约的withdraw最后的返回值为0,猜想2正确

总结

这次攻击产生的主要原因是项目方使用错误的方法去获取msgSender,导致合约的Owner权限更改能被绕过。知道创宇区块链安全实验室 在此提醒,任何有关合约权限问题的操作都需要慎重考虑,合约审计、风控措施、应急计划等都有必要切实落实。

原创文章,作者:创宇区块链安全实验室。转载/内容合作/寻求报道请联系 report@odaily.email;违规转载法律必究。

ODAILY提醒,请广大读者树立正确的货币观念和投资理念,理性看待区块链,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。

推荐阅读
星球精选