我竟騙了我自己?—— BurgerSwap 被黑分析

By:yudan@慢霧安全團隊 據慢霧區消息, 2021 年 05 月 28 日, 幣安智能鏈 (BSC) DeFi 項目 BurgerSwap 被黑,損失達 330 萬美元。 慢霧安全團隊第一時間介入分析,並將結果分享如下: 攻擊細節

By:yudan@慢霧安全團隊


我竟騙了我自己?—— BurgerSwap 被黑分析


據慢霧區消息,2021 年 05 月 28 日, 幣安智能鏈 (BSC) DeFi 項目 BurgerSwap 被黑,損失達 330 萬美元。慢霧安全團隊第一時間介入分析,並將結果分享如下:


攻擊細節分析


BurgerSwap 是一個仿 Uniswap AMM 項目,但是和 Uniswap 架構有所區別。BurgerSwap 架構總體分成【Delegate -> lpPlatForm -> Pair】。其中 Delegate 層管理了所有的 Pair 的信息,並負責創建 lpPlatForm 層。然後 lpPlatForm 層再往下創建對應的 Pair 合約。在整個架構中,lpPlatForm 層充當了 Uniswap 中 Router 的角色,負責將計算交易數據和要兌換的代幣轉發到 Pair 合約中,完成兌換。


我竟騙了我自己?—— BurgerSwap 被黑分析


本次事件的根本正是出在這種架構的問題上。通過一步步分析攻擊者的交易行為,我們來還原整個攻擊過程的核心:


我竟騙了我自己?—— BurgerSwap 被黑分析


本次攻擊開始於 Pancake 的閃電貸,攻擊者從 Pancake 中借出了大量的 WBNB,然後將這些 WBNB 通過 BurgerSwap 兌換成 Burger 代幣。在完成以上的操作后,攻擊者使用自己控制的代幣(攻擊合約本身) 和 Burger 代幣通過 Delegate 層創建了一個交易對並添加流動性,為後續攻擊做準備。


我竟騙了我自己?—— BurgerSwap 被黑分析


在完成代幣的創建和準備之後,攻擊者立馬通過 PaltForm 層的 swapExactTokensForTokens 函數發起了兌換,兌換路徑為【攻擊者自己控制的代幣 -> Burger -> WBNB】


我竟騙了我自己?—— BurgerSwap 被黑分析


接下來進行了最關鍵的一次操作。


由於先前攻擊者在創建交易對的時候使用的是自己控制的代幣,在代幣兌換過程中, _innerTransferFrom 函數會調用攻擊者控制的代幣合約,於是攻擊者可以 _innerTransferFrom 函數中重入 swapExactTokensForTokens 函數。為什麼攻擊者要這樣做呢?


我竟騙了我自己?—— BurgerSwap 被黑分析


通過對 PlatForm 層的 swapExactTokensForTokens 函數進行代碼分析,我們不難發現,合約在調用 _innerTransferFrom 函數時首先計算了用戶的兌換數據,然後在 _innerTransferFrom 函數的操作后使用預先計算的數據來轉發到底層進行真正的代幣兌換。從這個函數層面來看,就算攻擊者重入了 swapExactTokensForTokens 函數,底層調用的 swap 函數也是獨立的,咋一看並沒有什麼問題,但是鏈上的一個行為引起了慢霧安全團隊的注意:


我竟騙了我自己?—— BurgerSwap 被黑分析


我們驚訝地發現,在重入的兌換過程中,兌換的數量竟然沒有因為滑點的關係而導致兌換數量的減少。這究竟是什麼原因呢?看來關鍵是底層的 Pair 合約的問題了。我們又進一步分析了底層調用的 Pair 合約,代碼如下:


我竟騙了我自己?—— BurgerSwap 被黑分析


通過分析 Pair 的代碼,我們再次驚訝地發現在 swap 的過程中,合約竟然沒有在兌換后根據恆定乘積公式檢查兌換后的數值!!也就是說,Pair 合約完全依賴了 PlatForm 層的數據進行兌換,導致了本次事件的發生。由於 Pair 層本身並不做恆定乘積的檢查,在重入的過程中,PlatForm 層的兌換數據預先進行了計算,在 _innerTransferFrom 函數完成後,Pair 的更新數據也沒有反映到 PlatForm 層中,導致重入交易中的兌換產生的滑點並不影響下一次的兌換,從而造成了損失。用圖來看的話大概如下:


我竟騙了我自己?—— BurgerSwap 被黑分析


總結


本次攻擊屬於 BurgerSwap 架構上的問題,由於 Pair 層完全信任 PaltForm 層的數據,並沒有自己再做一次檢查,導致攻擊的發生。最近 DeFi 安全事件頻發,針對越來越密集的 DApp 攻擊事件,慢霧安全團隊建議 DApp 開發者在移植其他協議的代碼時,需充分了解移植協議的架構,並充分考慮移植協議和自身項目的兼容性,且需通過專業安全審計機構的審計后才上線,防止資金損失情況的發生。


攻擊交易參考:

https://bscscan.com/tx/0xac8a739c1f668b13d065d56a03c37a686e0aa1c9339e79fcbc5a2d0a6311e333

—-

編譯者/作者:慢霧區

玩幣族申明:玩幣族作為開放的資訊翻譯/分享平台,所提供的所有資訊僅代表作者個人觀點,與玩幣族平台立場無關,且不構成任何投資理財建議。文章版權歸原作者所有。

0

發表迴響