Belt Finance事件分析
事件总结与影响
- 本次一共通过8次交易,每次交易循环同样的流程7次
- 导致beltBUSD的价格从1.018262跌到0.800687,beltBUSD金库损失了21.36%的存款
- 导致4Belt LP 的价格从1.017904跌到0.961767,4Belt LP 的持有者损失了5.51%
事件信息
Belt Finance的审计由SOOHO和HAECHI AUDIT提供
涉及到的合约
TAG | 解释 |
---|---|
BF-Attacker | Belt Finance事件交易发起人地址 |
BF-A-Contract | Belt Finance事件交易发起人使用的合约地址 |
PCS-USDC/BUSD | Pancake Swap的USDC/BUSD交易对 |
PCS-BUSDT/BUSD | Pancake Swap的BUSDT/BUSD交易对 |
PCS-DAI/BUSD | Pancake Swap的DAI/BUSD交易对 |
PCS-UST/BUSD | Pancake Swap的UST/BUSD交易对 |
PCS-VAI/BUSD | Pancake Swap的VAI/BUSD交易对 |
PCS-ALPACA/BUSD | Pancake Swap的ALPACA/BUSD交易对 |
BF-Attacker-2 | Belt Finance事件最终收款地址 |
beltBUSD | |
bVenusBUSD | |
vBUSD | Token Venus BUSD |
交易:
本次事件Attacker使用相同的方式进行了8次交易:
https://bscscan.com/tx/0x50b0c05dd326022cae774623e5db17d8edbc41b4f064a3bcae105f69492ceadc
https://bscscan.com/tx/0xc4d4156aab1fca85c99e85352b836274d3c53bafe98a2c9867b68950e1eafde9
https://bscscan.com/tx/0xb57acfeab13d52664416aa2ada9b490e340292731fced049fc8c4a730b7af700
https://bscscan.com/tx/0xcca1ebf01e694bb4c447f6018eebb34a3b829cff9ea1ec5fce236eb3cc2ef99c
https://bscscan.com/tx/0x7719e1bae25dbe80539edea37c962e941ec4141145e6eabe63540b7178ffd0d0
https://bscscan.com/tx/0xd790026feda9a16646647e9df0779dc4a7b173053369847691b8f3f678da1f66
https://bscscan.com/tx/0xf598e092ab82ce08798f9dab7ea6ade64f152aa91db897f3449b23ab591baa1d
https://bscscan.com/tx/0x7b3b727a56d1649ee325c42416a1199f4a9b4f4eb024a60b5848a7b1485953b1
事件分析
与AutoShark和BurgerSwap一样,本次攻击也是始于从PancakeSwap的闪电贷。0xf598…91baa1d交易的攻击过程如下:
- 从PancakeSwap的多个流动池借出大量(390,379,325)BNB
- 将200,379,325个BUSD铸造成235,391,847个beltBUSD
- 使用190,000,000个BUSD兑换168,535,055个BUSDT
- 这次兑换导致Ellipsis.fi的3pool增值了3%
- burn掉235,391,847个beltBUSD,然后获得了201,383,385个BUSD
- 注意此步骤使用的beltBUSD是第二部铸造的,铸造时使用了200,379,325个BUSD,此时burn之后却获得了201,383,385个BUSD,多了1,004,060 BUSD
- 使用第三步兑换出的168,535,055个BUSDT兑换出189,339,377个BUSD
- 这一步兑换出了189,339,377个BUSD比第三步使用的190,000,000个BUSD少了660,623个BUSD
- 但是第四步额外获得的1,004,060个BUSD比660,623个BUSD多了343,437个BUSD(即通过2-5步获利了343,437个BUSD)
- 继续重复2-5步骤的交易(数字不完全一样,但是逻辑一样),最终额外获得7,132,461个BUSD
- 还闪电贷(闪电贷因为还有手续费还的必须比借的多)
- 获利离场,最终转移了1,320,605个BUSD
涉及到的代码
第二步是调用beltBUSD合约的deposit
方法:
1 |
|
第四步是调用beltBUSD合约的withdraw
方法:
1 |
|
提现时计算Eps3pool的稳定币数量的方法
此方法是导致攻击成功的关键因素,在计算各个稳定币的数量时,直接使用了稳定币合约的balanceOf方法会使计算的值变大,因此再burn掉bBUSD时才能获得较多的BUSD。
1 |
|
事件处理结果
- 修改获取Eps3Pool中稳定币的方法,使用池中的方法获取而不是使用外部的ERC20代币的balanceOf方法
2、 在计算Eps3Pool对应的稳定币数量的方法中增加校验,校验的具体实现如上图,主要是校验“三个稳定币的最大的数量和最小的数量相差不能太多”。校验不成功就不允许提现