币妈妈

下载
币妈妈>资讯>正文

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

CertiK2021-05-21 13:46:13

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

5 月 20 日,CertiK安全技术团队发现币安智能链 DeFi 收益聚合器 PancakeBunny (BUNNY)遭到闪电贷攻击,发生代币闪崩事件。

此次事件共损失 114,631 枚 BNB 和 697,245 枚 BUNNY,按当时价格计算约合约 4200 万美元。

经 CertiK 安全团队调查得出,由于该协议是使用 PancakeSwap AMM 来进行资产价格计算的,因此黑客恶意利用了闪电贷来操纵 AMM 池的价格,并利用 Bunny 在铸造代币的时候计算上的问题成功完成攻击。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

攻击是如何发生的?

本次攻击,攻击者总共进行了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 代币。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

①"Zap" 所做的是将所提供的代币的一半换成一对中的另一个代币,并将两个代币提供给相应的 PancakeSwap 池。这也可以通过 BUNNY 的 Dapp 前端来完成。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

②将 USDT-BNB FLIP 存入池中。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

交易二:

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 代币。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

②攻击者将从闪电贷中获得的 232 万 BNB 在 PancakeSwap V1 池中换取了 383 万 USDT。

由于 V1 池的 BNB 和 USDT 储备远少于 V2 池,V1 池的价格更容易被操纵,在将 BNB 换成 USDT 后,BNB 价格急剧下降。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

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

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

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

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

❷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)函数计算得出的。

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

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

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

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

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

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

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

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

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

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

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

PancakeBunny 闪崩事件:最全技术细节剖析,DeFi 应用再敲警钟

写在最后

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

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

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

声明:该文观点仅代表作者本人,币妈妈信息发布平台,币妈妈仅提供信息存储空间服务。

相关阅读