近期,於幣安智能鏈(BSC)似乎是特別受到 Defi 駭客們青睞似的,接連受到攻擊。而最經典且嚴重的案例,莫過於 PancakeBunny 及其另外三個分叉項目 AutoShark、Merlin Labs 和 PancakeHunny 的連環爆事件。今天,將由 Amber Group 區塊鏈安全團隊負責人 Chiachih Wu 博士,將模擬重回事發情境,步步剖析帶您了解這三種攻擊的背後細節與手法。
(前情提要:打臉現場!分叉項目 Merlin 重演 PancakeBunny 遭遇,駭客 240 枚 ETH 入袋)
(前情提要: BSC官方:8起閃電貸攻擊恐為「同一駭客組織」所為!)
本文源自於知名數位資產投資集團 Amber Group 的投稿《BSC Flash Loan Attack: The Three Copycats》,作者為該集團區塊鏈安全專家吳家志博士(Chiachih Wu),該博士曾任英特爾(Intel)、奇虎360 高級研究員,同時於幣圈為名於共同創辦了區塊鏈安全公司派頓(Pechshield)。
以下為吳博士撰文,將詳細闡述這三個 PancakeBunny 模仿者的攻擊背後細節:
5 份以來,幣安智能鏈(BSC)上的 Defi 項目們便開始接連受到 Defi 駭客攻擊。在 PancakeBunny 驚爆遭駭之後,PancakeBunny 的三個分叉項目——AutoShark、Merlin Labs 和 PancakeHunny——也相繼遭遇類似的技術手法遭人毒手。
其中 PancakeBunny 在這四次攻擊中是損失規模最高的項目,總損失金額接近 4,500 萬美元。
模仿者 Copycats
AutoShark 是在 PancakeBunny 遭到攻擊後五天也被釘上,接著是 Merlin Labs 和 PancakeHunny。 下面將對這三個分叉項目已存在的問題和可能的攻擊技術進行分析。
在 SharkMinter.mintFor() 函數中,我們可以假設在第 1492 行收到的代幣數量等於移動餘額的數量。要鑄造的獎勵 SHARK 代幣的數量(即 mintShark)來自於第 1494 行中由 tokenToSharkBNB() 計算的 sharkBNBAmount。
然而,tokenToSharkBNB() 引用了當前的移動餘額,產生了一個漏洞。
儘管如此,駭客可以透過 getReward() 函數調用之前發送的代幣並間接破壞 tokenToSharkBNB() 的邏輯,以輕易操縱餘額。
在 tokenToSharkBNB() 的底層執行層序中,還存在另一個攻擊面。 如上面的程式碼片段表示,_flipToSharkBNBFlip() 從 ApeSwap(第 1243 行)或 PantherSwap(第 1262 行)中移除流動性,並將 LP 代幣轉換為 SHARK+WBNB。
接著,調用 generateFlipToken() 將 SHARK+WBNB 轉換為 SHARK-BNB LP 代幣。
在 generateFlipToken() 裡頭,SharkMinter 目前的 SHARK 和 WBNB 餘額(amountADesired,amountBDesired)用於生成 LP 代幣,並將 LP 代幣的數量返還給 sharkBNBAmount 的 mintFor()。
於此來說,駭客或入侵者可以將 SHARK+WBNB 轉移到 SharkMinter 以操縱要鑄造的 SHARK 代幣數量。
PancakeHunny 中的漏洞與 AutoShark 中發現的漏洞相同,代表駭客可以使用 HUNNY 和 WBNB 代幣操縱 HUNNY 鑄造獎勵。
與 AutoShark 和 PancakeHunny 相比 ,Merlin Labs 的 _getReward() 有一個更明顯的漏洞。
上面的程式碼片段表明,performanceFee 可以透過 CAKE 的餘額來操縱,間接影響了 MERL 獎勵的鑄造。 不過,nonContract 這個改良裝置擺脫了閃電貸。
就算合約上沒有漏洞,駭客仍然可以透過多次調用而獲利。
再現 Autoshark 攻擊
要重現 AutoShark 攻擊,我們首先需要從 PantherSwap 獲取一些 SHARK-BNB-LP 代幣。 具體來說,我們將 0.5 WBNB 交換到 SHARK(第 58 行),並將剩餘的 WBNB 與 SHARK 代幣一起轉移到 PantherSwap 中以鑄造 SHARK-BNB-LP 代幣(第 64 行)。
稍後,我們再將這些 LP 代幣存入 AutoShark 的 StrategyCompoundFLIP 合約(第 69 行)以獲得獎勵。 注意我們在第 69 行只故意存入一半的 LP 代幣。
第二步是讓 getReward() 進入 SharkMinter 合約。在上面的程式碼片段中,我們知道獎勵可以透過 created() 函數(第 1658 行)。
此外,30% 的獎勵(即 performanceFee)應大於 1,000(即 DUST)以觸發第 1668 行中的 SharkMinter.mintFor()。
因此,在我們的漏洞利用程式碼中,我們在第 76 行將一些 LP 代幣轉移到 StrategyCompoundFLIP 合約,以繞過 performanceFee > DUST 檢查並觸發 mintFor() 調用。
由於我們需要大量 WBNB+SHARK 來操作 SharkMinter,因此我們須透過第 81 行的 flash-swap 調用 PantherSwap 的 100k WBNB。
在閃貸回調 pancakeCall() 中,我們將一半的 WBNB 交換為 SHARK,並將剩餘 50,000 WBNB 的 SHARK 發送到 SharkMinter 合約以操縱獎勵鑄造。
下一步則是在當 SharkMinter 收到 WBNB+SHARK 代幣時觸發 getReward() 以對調用方鑄造大量 SHARK 代幣。
最後一步是將 SHARK 轉換為 WBNB,支付閃貸,然後帶走剩餘的 WBNB 代幣。
我們這次的實驗中,駭客如果從 1 WBNB 開始。 在閃貸的協助下,他可以從一筆交易中返還了 1,000 多個 WBNB 中並獲利。
再現 PancakeHunny 攻擊
PancakeHunny 攻擊背後的理論類似於 AutoShark 攻擊。 簡而言之,在觸發 getReward() 之前,我們需要向 HunnyMinter 發送大量 HUNNY+WBNB。
但是,HUNNY 代幣合約有一個稱為 antiWhale 的保護機制,可以防止大量轉移。 因此,閃貸在這裡不會起作用。
為了避開 antiWhale,我們創建了多個子合約並透過這些合約發起多個 CakeFlipVault.deposit() 調用。
在上面的漏洞利用程式碼片段中,在第 116 行收集的 LP 代幣被分為 10 個部分,並在第 122 行轉移到 10 個 Lib 合約,然後讓每個合約調用 Lib.prepare()。
在 Lib.prepare() 中,我們准許 () CakeFlipVault 使用 LP 代幣並調用 CakeFlipVault.deposit() 以啟用稍後的 getReward() 調用來鑄造獎勵 HUNNY 代幣。
準備好 10 個 Lib 合約後,主合約對每個合約進行迭代:
- 將 WBNB 換成 HUNNY 的最大允許數量
- 將WBNB+HUNNY 轉給 HunnyMinter
- 透過 lib.trigger() 觸發 getReward()
- 將 HUNNY 轉換回 WBNB。
最後,有 10 WBNB 的駭客透過 10 次運行 10 個 Lib 合約操作中可賺取大約 200 個 WBNB。
重現 Merlin Labs 攻擊
如前所述,Merlin Labs 具有 noContract 改良裝置來擺脫閃貸攻擊。
但是,我們可以使用腳本來觸發 EOA(外部擁有帳戶)地址發起的多筆交易的攻擊。 唯一的區別是有人可以先行搶走駭客的交易並從中竊取利潤。
與 AutoShark 攻擊類似,我們需要準備足夠的 LINK 和 WBNB(第 23 行),使用它們來鑄造 WBNB-LINK-LP 代幣(第 34 行),並將 LP 代幣存入 VaultFlipCake 合約(第 38 行)。
接下來的動作是:
- 將 WBNB 交換為 CAKE(第 42 行)。
- 透過將 CAKE 發送到 VaultFlipToCake 合約(第 50 行)來操縱 MERL 鑄造。
- 在第 55 行觸發 getReward()(鑄造了大量的 MERL 代幣)。
- 將 MERL 交換回 WBNB 並多次重複上述步驟。
- 如前所述,如果有人在第 2 步之後立即執行第 3 步,則該人可能會移除大量的 MERL。
在這次的實驗中,駭客從 10 WBNB 開始,然後透過將四個步驟重複 10 次,可獲利大約 165 WBNB 。
📍相關報導📍
BSC上閃電貸攻擊再現!BurgerSwap 被駭技術分析 — 我竟騙了我自己?
BSC 項目 PancakeBunny 遭閃電貸攻擊!估遭駭 2 億美元,BUNNY 暴跌 99%
BSC首現閃電貸攻擊/技術解析 Spartan Protocol 遭駭手法,造成 3 千萬美元損失
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務