By:Kong@慢霧安全團隊
據慢霧區情報,幣安智能鏈上DeFi 收益聚合器PancakeBunny 項目遭遇閃電貸攻擊,慢霧安全團隊第一時間介入分析,並將結果以簡訊的形式分享,供大家參考:
攻擊過程分析
1. 攻擊者先發起一筆交易,使用0.5 個WBNB 與約189 個USDT 在PancakeSwap 中添加流動性並獲取對應的LP,隨後將LP 抵押至PancakeBunny 項目的VaultFlipToFlip 合約中。
2. 在LP 抵押完成後,攻擊者再次發起另一筆交易,在這筆交易中攻擊者先從PancakeSwap 的多個流動性池子中閃電貸借出巨量的WBNB 代幣,並從Fortube 項目的閃電貸模塊借出一定數量的USDT 代幣。隨後使用借來的全部USDT 代幣與部分WBNB 代幣在PancakeSwap 的WBNB-USDT 池子添加流動性,並把獲得的LP 留在WBNB-USDT 池子中。
3. 由於在步驟1 攻擊者已經在VaultFlipToFlip 合約中進行了抵押,因此攻擊者在添加完流動性後直接調用VaultFlipToFlip 合約的getReward 函數來獲取BUNNY 代幣獎勵並取回先前抵押的流動性。
4. 在進行getReward 操作時,其會調用BunnyMinterV2 合約的mintForV2 函數來為調用者鑄造BUNNY 代幣獎勵。
5. 在mintForV2 操作中,其會先將一定量(performanceFee) 的LP 轉至WBNB-USDT 池子中移除流動性,但由於在步驟2 中攻擊者把大量的LP 留在了池子中,因此BunnyMinterV2合約將會收到大量的WBNB 代幣與USDT 代幣。
6. 在完成移除流動性後會調用zapBSC 合約的zapInToken 函數分別把步驟5 中收到的WBNB 與USDT 代幣轉入zapBSC 合約中。
7. 而在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 數量會大量增加。
8. 在完成zapInToken 操作後會計算BunnyMinterV2 合約當前收到的WBNB-BUNNY LP 數量,並將其返回給mintForV2。隨後將會調用PriceCalculatorBSCV1 合約的valueOfAsset 函數來計算這些LP 的價值,這裡計算價值將會以BNB 結算(即單個LP 價值多少個BNB)。
9. 在valueOfAsset 計算中,其使用了WBNB-BUNNY 池子中WBNB 實時的數量乘2 再除以WBNB-BUNNY LP 總數量來計算單個LP 的價值(valueInBNB)。但經過步驟7,我們可以發現WBNB-BUNNY 池子中的WBNB 非預期的數量大量變多了,這就導致了在計算單個LP 的價值會使得其相對BNB 的價格變得非常高。
10. 隨後在mintForV2 中,合約會以在步驟9 中計算出的LP 價值來通過amountBunnyToMint 函數計算需要給攻擊者鑄造多少BUNNY 代幣。但由於價格計算方式的缺陷導致最終LP 的價格被攻擊者惡意的操控抬高了,這就導致了BunnyMinterV2 合約最終給攻擊者鑄造了大量的BUNNY 代幣(約697 萬枚)。
11. 在拿到BUNNY 代幣後,攻擊者將其分批賣出成WBNB 與USDT 以歸還閃電貸。完成整個攻擊後拿錢走人。
總結
這是一次典型的利用閃電貸操作價格的攻擊,其關鍵點在於WBNB-BUNNY LP 的價格計算存在缺陷,而BunnyMinterV2 合約鑄造的BUNNY 數量依賴於此存在缺陷的LP 價格計算方式,最終導致攻擊者利用閃電貸操控了WBNB-BUNNY 池子從而拉高了LP 的價格,使得BunnyMinterV2 合約鑄造了大量的BUNNY 代幣給攻擊者。
慢霧安全團隊建議,在涉及到此類LP 價格計算時可以使用可信的延時餵價預言機進行計算或者參考此前Alpha Finance 團隊研究的LP 價格計算方式,以避免被惡意操控的事故再次發生。