返回部落格

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

訂閱最新動態
Bitget 3.875億美元鏈下違規事件:超越金鑰與合約的範疇
Security Insights

Bitget 3.875億美元鏈下違規事件:超越金鑰與合約的範疇

2026年9月24日,攻擊者利用第三方安全產品漏洞,獲取內部憑證並偽造提款指令,導致約3.875億美元從Bitget部分營運錢包(涵蓋Ethereum、其他EVM網絡、XRP Ledger、Zcash及TRON)轉出;私鑰及冷錢包未受影響。本文深入梳理事件路徑與資金流向,分析快速轉換為原生資產及生態恢復應對,提出機構縱深防禦框架,並說明授權區塊鏈滲透測試如何驗證跨層假設。

約1130萬美元損失:Multicall Router、Nostra|BlockSec Weekly
Security Insights

約1130萬美元損失:Multicall Router、Nostra|BlockSec Weekly

本報告涵蓋2026/09/14至2026/09/20期間,探討以太坊與Starknet上兩起合計損失約1130萬美元的安全事件。較大一起中,多重呼叫路由器將自身位址接受為分派目標,導致巢狀呼叫以路由器自身已授權身分而非外部呼叫者身分進入Safe錢包的Gateway模組,約2900枚`aEthrsETH`被轉出至攻擊者建立的Uniswap v4池。在Starknet上,Nostra預言機整合僅要求最少一個聚合來源,當三個設定價格來源中僅兩個達成聚合時,操縱的薄池報價與正常報價平均後將`NSTR`估值約49.52美元,支撐約350萬美元以高估抵押品借貸。

损失約3.2億美元:Liquid Network與Symbiosis遭攻擊事件 | BlockSec
Security Insights

损失約3.2億美元:Liquid Network與Symbiosis遭攻擊事件 | BlockSec

本報告涵蓋2026/09/07至2026/09/13,探討兩起造成約3.2億美元損失的安全事件,包括前份報告未提及、發生於2026/09/06的Liquid Network漏洞事件。較大者為該Liquid Network漏洞:Elements中的rangeproof驗證快取藉由雜湊四個欄位(其中兩個長度可變)串接而成金鑰,且未標示欄位邊界,導致某輸出的驗證結果被錯誤套用至另一個未經檢驗證明的輸出,使攻擊者得以憑空創造4,000枚無擔保L-BTC,並將幾乎全數兌回比特幣。在橫跨BNB Smart Chain、Ethereum與Rootstock的Symbiosis跨鏈橋比特幣路徑中,讀取比特幣存款的鏈下程式碼從存款人可自行控制的欄位取得其身份,並在未檢查手續費是否為負值的情況下自存款中扣除,使330聰的存款鑄造出`46,116,860,184.27388234 syBTC`;其須賣出所經之資金池僅有11.26 syBTC,致使流動性提供者與用戶損失約9.97 BTC(約77萬美元)。

Web3 最佳安全審計方

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

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