LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > “一两拨千金”:Crosswise攻击事件分析

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

2022-01-21 创宇区块链安全实 来源:区块链网络

前言

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 权限更改能被绕过。

知道创宇区块链安全实验室 在此提醒,任何有关合约权限问题的操作都需要慎重考虑,合约审计、风控措施、应急计划等都有必要切实落实。

查看更多

—-

编译者/作者:创宇区块链安全实

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...