慢雾团队称,这是一次典的利用闪电贷操作价格的攻击,其关键点在于 WBNB-BUNNY LP 的价格计算存在缺陷,而 BunnyMinterV2 合约铸造的 BUNNY 数量依赖于此存在缺陷的 LP 价格计算方式,最终导致攻击者利用闪电贷操控了 WBNB-BUNNY 池子从而拉高了 LP 的价格,使得 BunnyMinterV2 合约铸造了大量的 BUNNY 代币给攻击者。
撰文:慢雾
今日 6 点 35 分左右开始,币安智能链上 DeFi 收益聚合器 PancakeBunny 从 240 美元闪崩,一度跌破 2 美元,很高跌幅一度超 99%。
对此 PancakeBunny 回应称,遭到来自外部人员的闪电贷攻击,共损失 114,631 枚 BNB 和 697,245 枚 BUNNY,按当时价格计算约合 4200 万美元。
简单来说,黑客使用 PancakeSwap 借入了大量 BNB,之后继续操纵 USDT/BNB 以及 BUNNY/BNB 价格,从而获得大量 BUNNY 并进行抛售,导致 BUNNY 价格闪崩,**黑客通过 PancakeSwap 换回 BNB。
慢雾安全团队也对此次被黑事件进行了详细分析,具体如下:
-
攻击者先发起一笔交易,使用 0.5 个 WBNB 与约 189 个 USDT 在 PancakeSwap 中添加流动性并获取对应的 LP,随后将 LP 抵押至 PancakeBunny 项目的 VaultFlipToFlip 合约中。
-
在 LP 抵押完成后,攻击者再次发起另一笔交易,在这笔交易中攻击者先从 PancakeSwap 的多个流动性池子中闪电贷借出巨量的 WBNB 代币,并从 Fortube 项目的闪电贷模块借出一定数量的 USDT 代币。随后使用借来的全部 USDT 代币与 部分 WBNB 代币在 PancakeSwap 的 WBNB-USDT 池子添加流动性,并把获得的 LP 留在 WBNB-USDT 池子中。
-
由于在步骤 1 攻击者已经在 VaultFlipToFlip 合约中进行了抵押,因此攻击者在添加完流动性后直接调用 VaultFlipToFlip 合约的 getReward 函数来获取 BUNNY 代币奖励并取回先前抵押的流动性。
-
在进行 getReward 操作时,其会调用 BunnyMinterV2 合约的 mintForV2 函数来为调用者铸造 BUNNY 代币奖励。
-
在 mintForV2 操作中,其会先将一定量 (performanceFee) 的 LP 转至 WBNB-USDT 池子中移除流动性,但由于在步骤 2 中攻击者把大量的 LP 留在了池子中,因此 BunnyMinterV2 合约将会收到大量的 WBNB 代币 与 USDT 代币。
-
在完成移除流动性后会调用 zapBSC 合约的 zapInToken 函数分别把步骤 5 中收到的 WBNB 与 USDT 代币转入 zapBSC 合约中。
-
而在 zapInToken 操作中,其会在 PancakeSwap 的 WBNB-USDT 池子中把转入的 USDT 兑换成 WBNB。随后再将合约中半数 WBNB 在 PancakeSwap 的 WBNB-BUNNY 池子中兑换成 BUNNY 代币,并将得到的 BUNNY 代币与剩余的 WBNB 代币在 WBNB-BUNNY 池子中添加流动性获得 LP,并将此 LP 转至 mintForV2 合约中。而由于步骤 5 中接收到的非预期的大量的 WBNB,并且进行 WBNB 兑换成 BUNNY 代币的操作,因此 WBNB-BUNNY 池子中的 WBNB 数量会大量增加。
-
在完成 zapInToken 操作后会计算 BunnyMinterV2 合约当前收到的 WBNB-BUNNY LP 数量,并将其返回给 mintForV2。随后将会调用 PriceCalculatorBSCV1 合约的 valueOfAsset 函数来计算这些 LP 的价值,这里计算价值将会以 BNB 结算 (即单个 LP 价值多少个 BNB)。
-
在 valueOfAsset 计算中,其使用了 WBNB-BUNNY 池子中 WBNB 实时的数量乘 2 再除以 WBNB-BUNNY LP 总数量来计算单个 LP 的价值 (valueInBNB)。但经过步骤 7,我们可以发现 WBNB-BUNNY 池子中的 WBNB 非预期的数量大量变多了,这就导致了在计算单个 LP 的价值会使得其相对 BNB 的价格变得非常高。
-
随后在 mintForV2 中,合约会以在步骤 9 中计算出的 LP 价值来通过 amountBunnyToMint 函数计算需要给攻击者铸造多少 BUNNY 代币。但由于价格计算方式的缺陷导致最终 LP 的价格被攻击者恶意的操控抬高了,这就导致了 BunnyMinterV2 合约最终给攻击者铸造了大量的 BUNNY 代币 (约 697 万枚)。
-
在拿到 BUNNY 代币后,攻击者将其分批卖出成 WBNB 与 USDT 以归还闪电贷。完成整个攻击后拿钱走人。
慢雾团队称,这是一次典的利用闪电贷操作价格的攻击,其关键点在于 WBNB-BUNNY LP 的价格计算存在缺陷,而 BunnyMinterV2 合约铸造的 BUNNY 数量依赖于此存在缺陷的 LP 价格计算方式,最终导致攻击者利用闪电贷操控了 WBNB-BUNNY 池子从而拉高了 LP 的价格,使得 BunnyMinterV2 合约铸造了大量的 BUNNY 代币给攻击者。慢雾安全团队建议,在涉及到此类 LP 价格计算时可以使用可信的延时喂价预言机进行计算或者参考此前 Alpha Finance 团队。
文章标题:慢雾简析 PancakeBunny 被黑:由 WBNB-BUNNY LP 价格计算存在缺陷被攻击者利用所致
文章链接:https://www.btchangqing.cn/261872.html
更新时间:2021年05月20日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。