Back to Blog

FEGtoken 安全事件分析:魔鬼藏在細節裡

Code Auditing
May 18, 2022
6 min read

2022 年 5 月 15 日大約晚上 8:20(UTC),我們的監測系統檢測到 FEGtoken 項目的 FEGexPRO 合約遭到駭客攻擊。 攻擊者對 ETH 和 BSC 主網發起了一系列攻擊,涉及總價值累計約 130 萬美元(根據項目方發出的鏈上訊息)。

關於此事件的更多資訊,可參閱該項目的官方 Twitter。 在本報告中,我們將深入研究細節,揭示此次事件的根本原因。

0x1 漏洞分析:初探

存在漏洞的 FEGexPRO 合約部署於 ETHBSC 上, 其存在漏洞的函數為 swapToSwap,具體如下:

正如社交媒體上所指出的,swapToSwap 函數中名為 path 的第一個參數可由函數調用者指定。因此,攻擊者可以利用這一點進行任意授權 (arbitrary approval)(參見 swapToSwap 函數的第 682 行)。

到目前為止,這並不稀奇,因為這又是另一個參數未經校驗的案例。然而,攻擊軌跡顯示,僅將其歸結為任意授權並不能完全解釋此次攻擊。事實上,這裡存在一個巧妙的手段,而這正是此事件有趣的地方。

0x2 攻擊分析

0x2.1 初步攻擊分析

我們以 BSC 上的一筆攻擊交易為例來說明攻擊過程,針對資產 fBNB 的相應攻擊軌跡簡要總結如下:

  • 第 1 步:準備資金與偽造 path。攻擊者從 DVM 閃電貸借入約 915 BNB,並將其中一部分兌換為 116 fBNB。隨後攻擊者創建了一系列將作為偽造 path 使用的合約。
  • 第 2 步:存入初始資金。透過將 115 fBNB 存入 FEGexPRO 合約,攻擊者增加了其在受害者合約中的 balances2 餘額。
  • 第 3 步:執行任意授權。接著,攻擊者調用 swapToSwap 函數並將一個偽造的 path 作為第一個參數傳入,這導致 FEGexPRO 合約授權該 path 花費 114 fBNB。
  • 第 4 步:透過調用 depositInternal 函數和 swapToSwap 函數進行再次授權。FEGexPRO 合約又授權了另一個 path 花費 114 fBNB。

攻擊者重複執行第 4 步以進行更多授權。最後,攻擊者使用獲准的偽造 path 耗盡了 FEGexPRO 的所有 fBNB,並將部分兌換為 BNB 以償還閃電貸。

顯然,我們可以輕易看出該合約絕對應該對 path 參數進行校驗。

然而,要完全理解這次攻擊,還有一個問題需要解決:即使 FEGexPRO 合約對偽造的 path 進行了授權,approve 操作的前提是使用者的 balances2 會立即減少(swapToSwap 函數的第 684 行),換句話說,獲准花費的資金正是第 3 步中存入的金額。換句話說,攻擊者只是將自己存入的資金授權給了偽造的 path。此後,由於 balances2 的減少,攻擊者不應再能為其他偽造的 path 進行授權。

因此,問題來了:攻擊者究竟耍了什麼手段來進行後續的授權以獲取額外利潤?

0x2.2 進階攻擊分析

為了回答這個問題,我們回到 swapToSwap 函數。 在仔細檢查代碼後,我們發現這裡使用的手段不僅是偽造了 path,還偽造了 swap,這導致受害者合約帳面記錄的餘額與實際價值之間出現了不一致。結果,這種不一致可以透過調用 depositInternal 來恢復攻擊者的存款金額,從而反覆完成授權。

具體來說,depositInternal 函數主要根據合約餘額 Main.balanceOf_totalSupply2 之間的差額來修改使用者的 balances2depositInternal 函數的第 651 行)。

由於傳遞給 swapToSwappath 地址是攻擊者控制的偽造 path,因此實際上並沒有資金被轉移出去。結果是,Main.balanceOf 的返回值與第 3 步中的保持一致。請注意,_totalSupply2 已在 swapToSwap 函數中減少,只要攻擊者進行存款,增加後的 balance2 就不可避免地會大於實際存入的金額。

因此在 第 4 步 中,攻擊者首先透過調用 depositInternal 函數恢復存款金額,然後透過調用 swapToSwap 函數執行授權和偽造 swap。 請注意,攻擊者使用的存款金額幾乎為 0(即 1 / 1e18)fBNB,因此如上所述,depositInternal 函數會將攻擊者的 balances2 恢復到與第 3 步幾乎相同的金額(這也從下一次授權的軌跡中得到了證實)。

攻擊者可以透過重複執行第 4 步來擴大收益。

最後值得注意的是,我們上面描述的攻擊只是攻擊者利用的多種攻擊路徑之一。就在同一筆攻擊交易中,攻擊者還針對了資產 FEG

0x3 根本原因

我們在此總結此次攻擊的根本原因:

  • 第一,swapToSwap 函數中因參數未經校驗而導致的任意授權
  • 第二,因 swapToSwap 函數中偽造的 swap,導致受害者合約的實際餘額與記錄餘額之間存在不一致。這被用於透過恢復攻擊者的存款金額來反覆進行授權。

將這兩點結合起來,攻擊者成功地從受害者合約中榨乾了所有資金。

0x4 其他相關攻擊

在撰寫本文時,我們還觀察到另一個攻擊者發起了更多相關攻擊。

同樣,部署在以太坊和 BSC 上的合約都受到了攻擊。 有趣的是,攻擊軌跡與我們剛才討論的不同。雖然受害合約並未開源,但我們高度懷疑攻擊者使用了相同的方法利用了相同的漏洞。

0x5 總結與建議

確保 DeFi 項目的安全性並非易事。除代碼審計外,我們認為社群應採取主動方式來監測項目狀態,並在攻擊發生前阻止它

關於 BlockSec

BlockSec 是一家領先的區塊鏈安全公司,由一群全球傑出的安全專家於 2021 年創立。公司致力於增強新興 Web3 世界的安全性和可用性,以促進其大規模採用。為此,BlockSec 提供智能合約與 EVM 鏈安全審計服務、用於安全開發與主動威脅阻斷的 Phalcon 平台、用於資金追蹤與調查的 MetaSleuth 平台,以及幫助 Web3 構建者在加密世界中高效探索的 MetaDock 擴充功能。

迄今為止,公司已為 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap 等 300 多家知名客戶提供服務,並獲得了包括 Matrix Partners、Vitalbridge Capital 和 Fenbushi Capital 等頂尖投資者兩輪數千萬美元的融資。

官方網站:https://blocksec.com/

官方 Twitter 帳號:https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit