CertiK2021-05-21 13:46:13
5 月 20 日,CertiK安全技术团队发现币安智能链 DeFi 收益聚合器 PancakeBunny (BUNNY)遭到闪电贷攻击,发生代币闪崩事件。
此次事件共损失 114,631 枚 BNB 和 697,245 枚 BUNNY,按当时价格计算约合约 4200 万美元。
经 CertiK 安全团队调查得出,由于该协议是使用 PancakeSwap AMM 来进行资产价格计算的,因此黑客恶意利用了闪电贷来操纵 AMM 池的价格,并利用 Bunny 在铸造代币的时候计算上的问题成功完成攻击。
攻击是如何发生的?
本次攻击,攻击者总共进行了8 笔闪电贷。其中 7 笔闪电贷来自 PancakeSwap 流动性池的 BNB,另外一笔则来自 ForTube Bank 的 USDT。
技术细节分析
在文中, CertiK 安全专家添加了地址标签(如下图所示),使代币的流向更加清晰。
攻击者的地址:https://bscscan.com/address/0xa0acc61547f6bd066f7c9663c17a312b6ad7e187
攻击者使用的合约地址:https://bscscan.com/address/0xcc598232a75fb1b361510bce4ca39d7bc39cf498
交易一:
https://bscscan.com/tx/0x88fcffc3256faac76cde4bbd0df6ea3603b1438a5a0409b2e2b91e7c2ba3371a
在第一笔交易中,攻击者完成了两件事:
①将 BNB 转换成 "USDT-BNB FLIP"。
②将 "USDT-BNB FLIP " 存入 BUNNY 的池子。
攻击者将 FLIP 存入资金池,这样当其在后期调用 VaultFlipToFlip 合约中的 Withdraw() 或 getReward() 函数时,资金池将铸造 BUNNY 代币。
①"Zap" 所做的是将所提供的代币的一半换成一对中的另一个代币,并将两个代币提供给相应的 PancakeSwap 池。这也可以通过 BUNNY 的 Dapp 前端来完成。
②将 USDT-BNB FLIP 存入池中。
交易二:
https://bscscan.com/tx/0x897c2de73dd55d7701e1b69ffb3a17b0f4801ced88b0c75fe1551c5fcce6a979
在完成第一笔交易将 "USDT-BNB FLIP " 存入 BUNNY 资金池之后,攻击者进行了第二笔交易,这也是大多数人最关注的交易。
接下来把第二笔交易中的发生的所有代币的转移分解成多个部分:
①攻击者从 7 个不同的 PancakeSwap 流动性池中利用闪电贷共借了 232 万 BNB,从 ForTube 用闪电贷款借了 296 万 USDT。
然后攻击者向 "USDT-BNB'' 池提供了 7700 枚 BNB 和 296 万 USDT 的流动性,获得了 14.4 万 LP 代币。
②攻击者将从闪电贷中获得的 232 万 BNB 在 PancakeSwap V1 池中换取了 383 万 USDT。
由于 V1 池的 BNB 和 USDT 储备远少于 V2 池,V1 池的价格更容易被操纵,在将 BNB 换成 USDT 后,BNB 价格急剧下降。
③上文提到攻击者在 " 交易一 " 中把 "USDT-BNB FLIP " 存到 BUNNY 池,现在攻击者可以调用 "getReward() " 函数来铸造 BUNNY。
在调用 "VaultFlipToFlip " 合约中的 "getReward() " 函数时产生了大量代币转移记录,如截图所示。
上图中这个函数发生的细节如下:
❷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)函数计算得出的。
在函数valueOfAsset中,valueInBNB 的计算方法是:valueInBNB = amount.mul(reserve0).mul(2).p(IPancakePair(asset).totalSupply())
因为在 BNB-BUNNY 池中有大量的 BNB (正如上图标记❸、❹中解释的那样),变量 "reserve0" 是一个非常大的值,使 "valueInBNB " 变得很大,所以它最终会增加铸造的 BUNNY 数量。
④在收到 700 万的 BUNNY 后,攻击者在 PancakeSwap BNB-BUNNY V1 池和 V2 池中将 BUNNY 换成 BNB。
⑤最后,攻击者向 ForTube 和 PancakeSwap 的 7 个流动性池偿还闪电贷,并将 69.7 万枚 BUNNY 和 11.4 万枚 BNB 转移到攻击者的地址。
这种攻击奏效的原因之一是 "ZapBSC " 合约(https://bscscan.com/address/0xf4c17e321a8c566d21cf8a9f090ef38f727913d5#code)使用 PancakeSwap V1 流动性池,通过 V1 PancakeSwap Router 进行代币交换。
很多 DeFi 项目无法从 PancakeSwap V1 过渡到 V2,因为它们在合约中把 PancakeSwap Router 和池子的地址写死为 V1 的地址。
由于 V1 流动性池已经被放弃,它们的池子中代币的储备量很低,这使得攻击者更容易操纵其中的代币价格。
写在最后
当前的加密世界中,这样的闪电贷攻击和恶意价格操纵必然不会是最后一次。
CertiK 建议 DeFi 项目将其 PancakeSwap 集成从 V1 迁移到 V2。
同时也可使用时间加权平均价格(TWAP)来避免价格异常波动所带来的损失,以此防范黑客利用闪电贷攻击价格预言机。
以太坊Layer 2必知必会2023-04-26 15:03:27
浅析NFT未来:仅少数项目上涨 出圈项目会成赢家2023-04-26 14:15:26
E-CNY时代来临:当你的工资成为数字人民币2023-04-26 12:43:48
浅谈为什么MEV搜索者矿池并不可行?2023-04-26 12:08:40
"庄家"互撕 曝出加密巨头拉的那些"帮派"2023-04-26 11:59:08
怎样到达Web3世界:使用Web3技术的公司及集成到业务的步骤2023-04-26 11:53:15
稳定币项目 HAI、Starknet 2023 路线图2023-04-26 11:46:35
ChatGPT类产品安全隐患解决?英伟达发布开源工具包2023-04-26 11:26:24
蚂蚁集团发布HOU、AntChainBridge、Web3开放联盟链等多个Web3产品2023-04-26 11:24:46
ChatGPT背后的算力博弈 中国企业亟待打破美国桎梏2023-04-26 10:59:28
简析DWF Labs:出手频繁 颇具争议的加密做市商2023-04-26 10:48:45
NFT 交易平台生存现状研究:后版税战争时代下的龙头之争2023-04-26 09:20:51
以太坊提款功能开启后的带宽使用情况2023-04-26 08:30:24
上海升级提款效应:数据揭示 LSD 项目们的表现2023-04-26 07:28:37
3分钟读懂基于LayerZero的多链抗MEV DEX聚合器Cashmere2023-04-25 20:05:34
对话去中心化流动性质押协议Rocket Pool:如何促进以太坊Staking民主化?2023-04-25 19:02:21
Bankless:欧美都想监管稳定币 他们怎么做?2023-04-25 17:43:44
Coinbase起诉SEC全文:请在合理时间内回应加密规则请愿书2023-04-25 16:43:34
慢雾:Web3 假钱包第三方源调查分析2023-04-25 15:43:36
Binance Sensei介绍:您的Web3 AI导师2023-04-25 13:20:55