2022 年 5 月 15 日大約晚上 8:20(UTC),我們的監測系統檢測到 FEGtoken 項目的 FEGexPRO 合約遭到駭客攻擊。 攻擊者對 ETH 和 BSC 主網發起了一系列攻擊,涉及總價值累計約 130 萬美元(根據項目方發出的鏈上訊息)。
@FEGtoken The paramter `path` in your FEGexPRO contract (0x818E2013dD7D9bf4547AaabF6B617c1262578bc7) should be checked in advance ! Our monitor system just reports an attack against the FEGexPRO contract, which lost its fBNB and FEG. pic.twitter.com/A4obANAMhW
— BlockSec (@BlockSecTeam) May 16, 2022
關於此事件的更多資訊,可參閱該項目的官方 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 其他相關攻擊
在撰寫本文時,我們還觀察到另一個攻擊者發起了更多相關攻擊。
ROX(https://t.co/NWvSy5faY3) is not open-sourced, but something is wrong.
— BlockSec (@BlockSecTeam) May 17, 2022
Take a look at the following transaction:https://t.co/chPxcDoFOD@Mudit__Gupta
同樣,部署在以太坊和 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 等頂尖投資者兩輪數千萬美元的融資。
官方 Twitter 帳號:https://twitter.com/BlockSecTeam



