返回部落格

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

Code Auditing
2022年5月18日
閱讀約 6 分鐘

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

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

0x1 漏洞分析:初探

存在漏洞的 FEGexPRO 合約部署於 ETH 與 BSC 上, 其存在漏洞的函數為 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 之間的差額來修改使用者的 balances2(depositInternal 函數的第 651 行)。

由於傳遞給 swapToSwap 的 path 地址是攻擊者控制的偽造 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

訂閱最新動態
NEAR Intents 遭攻擊:退款漏洞與資安教訓
Security Insights

NEAR Intents 遭攻擊:退款漏洞與資安教訓

NEAR Intents 遭到攻擊時,攻擊者利用金額過大的退款事件,在存入的資產退回後仍保留內部餘額。本文分析重建回執流程及 BNB Chain 上合計 3,865,021 USDT 的七筆出金,將這些資金流出與專案方所稱的資金全數追回區分開來,並概述開發及審計 NEAR 智能合約時應注意的安全事項。

損失約 557萬 USD:X100 Freezer、NEM 遭攻擊 | BlockSec 週報
Security Insights

損失約 557萬 USD:X100 Freezer、NEM 遭攻擊 | BlockSec 週報

本週報涵蓋 2026年10月19日–2026年10月25日 期間發生在 Ethereum 和 BNB Chain 上的兩起安全事件。報告分析了以閃電貸提供資金、奪取 X100 Freezer 治理權的事件,以及影響 BNB Chain 上某個 NEM 代幣流動性池的稅費結算缺陷。報告範圍內的估計損失合計約 557萬 USD:具代表性的 X100 交易造成約 475萬 USD 的損失,NEM 流動性池事件造成約 82.0萬 USD 的損失。此合計金額不包含另行報導的後續 X100 資金提取。

損失約 387萬 USD:Autheo Network、UNCX 遭駭|BlockSec 週報
Security Insights

損失約 387萬 USD:Autheo Network、UNCX 遭駭|BlockSec 週報

本週報告涵蓋 2026年10月12日–2026年10月18日 期間的 3 起安全事件,估計總損失約為 387萬 USD。Autheo Network 因私鑰遭入侵損失約 176萬 USD;Qubic Wallet 因種子產生機制薄弱損失約 130萬 USD;UNCX Network 的 Smart Token Vesting V2 合約在 Ethereum、BNB Chain、Base 和 Robinhood Chain 上因帳務計算錯誤造成約 80.7萬 USD 的損失。重點分析的 UNCX 事件說明,有缺陷的份額總計計算如何將以不同代幣與份額比率建立的代幣歸屬批次混在一起,進而使人得以從共用資金池超額提領。

Web3 最佳安全審計方

在上線之前驗證設計、程式碼與業務邏輯,對標業內最高安全標準。

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