收藏本站 网站导航 开放平台 Saturday, April 20, 2024 星期六
  • 微信

首发 | PancakeBunny闪崩事件最全技术细节剖析

来源 中金网 05-21 13:32
摘要: ③上文提到攻击者在 "交易一 "中把 "USDT-BNB FLIP "存到BUN

  ③上文提到攻击者在 “交易一 ”中把 “USDT-BNB FLIP ”存到BUNNY池,现在攻击者可以调用 “getReward() ”函数来铸造BUNNY。

  在调用“VaultFlipToFlip ”合约中的 “getReward() ”函数时产生了大量代币转移记录,如截图所示。

640?wx_fmt=png

  上图中这个函数发生的细节如下:

  ❷BUNNYMinterV2从USDT-BNB v2池中取出流动性——从池中取出296万USDT和7744枚BNB。

  ❸将USDT换成BNB。在ZapBSC合约中使用的是V1 PancakeSwap Router 而不是V2。

  由于V1池的价格已经被操纵(见步骤②),攻击者能够将296万USDT换成231万BNB。

  然后,一半的BNB(115.6万)被换成BUNNY,另一半的BNB(115.6万)和换来的BUNNY被添加到BNB-BUNNY池中。

  现在,大量的BNB被加入到BNB-BUNNY池中,这增加了BNB(reserve0)的数量。

  当之后计算要铸造的BUNNY数量时,这将被用来操纵 “valueInBNB ”变量。

  ZapBSC 合约地址 https://bscscan.com/address/0xf4c17e321a8c566d21cf8a9f090ef38f727913d5#code

  ❹把标记❷中移除流动性获得的7700BNB交换一半到BUNNY,并将另一半BNB与BUNNY配对,以提供 “BNB-BUNNY ”池中的流动性。

  注意标记❷、❸和❹发生在 “BUNNYMinterV2 ”合约的 “mintForV2 ”函数中的“_zapAssetsToBUNNYBNB ”函数调用。

  BunnyMinterV2合约地址:https://bscscan.com/address/0x819eea71d3f93bb604816f1797d4828c90219b5d#code

  ❺从标记❸和❹产生的所有LP代币都被送到PancakeSwap的BUNNY池中,这是BunnyMinterV2合约中 “mintForV2 ”函数中的这行代码所执行的结果:

  “IBEP20(BUNNY_BNB).safeTransfer(BUNNY_POOL, bunnyBNBAmount);”

  如标记❺所示,该合约继续执行,铸造了700万的BUNNY(基于之前的BUNNY价格价值可达约10亿美元)。

  那么,是什么原因导致合约铸造了这么多的BUNNY?呢?

  在bunnyMinterV2合约中,要铸造的BUNNY数量与 “valueInBNB ”变量有关,该变量是通过`priceCalculator.valueOfAsset(BUNNY_BNB, bunnyBNBAmount)`函数计算得出的。

ks1coy4f1sp5hptc

  在函数`valueOfAsset`中,valueInBNB的计算方法是:`valueInBNB = amount.mul(reserve0).mul(2).div(IPancakePair(asset).totalSupply())`

  因为在BNB-BUNNY池中有大量的BNB(正如上图标记❸、❹中解释的那样),变量 “reserve0”是一个非常大的值,使 “valueInBNB ”变得很大,所以它最终会增加铸造的BUNNY数量。

2h1qj0s6knb4nfqq

  ④在收到700万的BUNNY后,攻击者在PancakeSwap BNB-BUNNY V1池和V2池中将BUNNY换成BNB。

3i0d318wxkh4xuxu

  ⑤最后,攻击者向ForTube和PancakeSwap的7个流动性池偿还闪电贷,并将69.7万枚BUNNY和11.4万枚BNB转移到攻击者的地址。

f0af8ecl5zc3iygw

  这种攻击奏效的原因之一是“ZapBSC ”合约(https://bscscan.com/address/0xf4c17e321a8c566d21cf8a9f090ef38f727913d5#code)使用PancakeSwap V1流动性池,通过V1 PancakeSwap Router进行代币交换。

  很多DeFi项目无法从PancakeSwap V1过渡到V2,因为它们在合约中把PancakeSwap Router和池子的地址写死为V1的地址。

  由于V1流动性池已经被放弃,它们的池子中代币的储备量很低,这使得攻击者更容易操纵其中的代币价格。

w9yoxbp7mydtcjs8

  写在最后

  当前的加密世界中,这样的闪电贷攻击和恶意价格操纵必然不会是最后一次。

  CertiK建议DeFi项目将其PancakeSwap集成从V1迁移到V2。

  同时也可使用时间加权平均价格(TWAP)来避免价格异常波动所带来的损失,以此防范黑客利用闪电贷攻击价格预言机。

  迄今为止,CertiK已进行了超过700次的审计,保护了超过300亿美元的数字资产与软件系统免受安全损失。

免责声明:中金网发布此信息目的在于传播更多信息,与本网站立场无关。中金网不保证该信息的准确性、真实性、完整性、有效性等。相关信息并未经过本网站证实,不构成任何投资建议,据此操作,风险自担。