攻击事件分析|BEVO 代币deliver攻击事件分析

  • Ellen
  • 更新于 2023-02-14 16:33
  • 阅读 2141

北京时间2023年1月31日,BEVO代币被攻击,总共损失45000美元,导致BEVO代币的价格下跌了99%。有趣的是,这个事件中还出现了抢跑。被攻击的原因在于deliver方法。

一、事件背景

北京时间2023年1月31日,在twitter上看到这样一条消息:

image.png

BEVO 代币被攻击,总共损失45000美元,导致BEVO 代币的价格下跌了 99%。

有趣的是,这个事件中还出现了抢跑。

twitter:https://twitter.com/peckshield/status/1619996999054667784

成功交易链接:https://bscscan.com/tx/0xb97502d3976322714c828a890857e776f25c79f187a32e2d548dda1c315d2a7d

被抢跑交易:https://bscscan.com/tx/0x581c7674a6adfaa4351422781f6b674e2b7ac0fab0db9d46bfcb559ddd96cff8

分析工具:

https://phalcon.blocksec.com/tx/bsc/0xb97502d3976322714c828a890857e776f25c79f187a32e2d548dda1c315d2a7d

https://dashboard.tenderly.co/tx/bsc/0xb97502d3976322714c828a890857e776f25c79f187a32e2d548dda1c315d2a7d

二、事件分析

原因

被攻击的原因在于deliver方法,当调用该合约的deliver方法时,会减少代币的总价值,导致计算余额出现了误差,造成储备量与余额的不平衡,攻击者通过skim获利。

攻击步骤

image-20230213143457009.png

  1. 攻击者通过闪电贷获得了192.5 WBNB,并通过Pancake交换出来3,028,774,323,006,137,313 BEVO代币。

  2. 调用deliver方法,减少总额_rTotal数量。

    function deliver(uint256 tAmount) public {
           address sender = _msgSender();
           require(!_isExcluded[sender], "Excluded addresses cannot call this function");
           (uint256 rAmount,,,,,,) = _getValues(tAmount);
           _rOwned[sender] = _rOwned[sender].sub(rAmount);
           _rTotal = _rTotal.sub(rAmount);
           _tFeeTotal = _tFeeTotal.add(tAmount);
       }

3.调用skim方法,在skim中要查询池子中BEVO的余额,过程中会根据_getRate()方法计算BEVO的价值比率,然后计算出当前余额。

先看_getRate(),计算公式是rSupply.div(tSupply)

function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

image-20230213150214342.png

而从_getCurrentSupply()方法中得出的rSupply就和_rTotal有关,由于deliver导致_rTotal减少,所以rSupply.div(tSupply)的比值currentRate也随之减小。

image-20230213151242277.png

image-20230213151328359.png

image-20230213151311939.png

最终的余额是rAmount.div(currentRate)计算出来的,rAmount在执行过程中没有被改变过,所以分子不变分母减小,自然导致了余额变大了。

计算出来余额:6844218532359160336,储备量:2298813336114922094,多出的4545405196244238242就被发给了攻击者。

4.攻击者又调用了一次deliver,将_rototal再减少4545405196244238242,使余额与储备量不一致。然后调用了swap方法获利了337个BNB。除去闪电贷192.5个BNB,攻击者最终获得144.5个BNB,总计45000美元。

三、总结

这起事件后风波没有停止,后来还出现了其他类似的攻击手法,有的攻击者在bsc链上批量扫描符合要求的代币并实施攻击。

从这次攻击事件来看,金额计算模型设计需要谨慎,避免出现参数可控导致的问题,这是保证项目安全及其重要的部分。

  • 原创
  • 学分: 6
  • 分类: 安全
  • 标签:
点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Ellen
Ellen
江湖只有他的大名,没有他的介绍。