- A+
雍和比特币 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).div(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)来防止价格反常动摇所带来的丢失,以此防备黑客运用闪电贷进犯价格预言机。迄今为止,CertiK已进行了超越700次的审计,维护了超越300亿美元的数字财物与软件体系免受安全丢失。
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-






2021年6月2日 下午1:16 沙发
国家互联网信息办公室2019年1月10日发布《区块链信息服务管理规定》,自2019年2月15日起施行。