返回部落格

1700 萬美元閉源智能合約漏洞:SwapNet 與 Aperture Finance 的任意調用漏洞

Code Auditing
2026年1月28日
閱讀約 10 分鐘

2026年1月25日,我們偵測到一系列針對 SwapNet 與 Aperture Finance 部署在 Ethereum、Arbitrum、Base 和 BSC 上的受害者合約的疑似交易,造成的總損失超過 1,700 萬美元。從宏觀角度來看,這兩起事件的根本原因很直接,且已在我們最初的警報中概述 [1, 2]: 受害者合約由於輸入驗證不足,暴露了任意呼叫(arbitrary-call)的功能,使得攻擊者能夠濫用現有的代幣授權(token approvals)並呼叫 transferFrom 來耗盡資產。

然而,這兩套受害者合約均為閉源合約,反編譯後會產生數千行代碼,且包含深度嵌套與複雜的分支邏輯,這顯著增加了分析的難度。此外,受影響專案隨後發布的事後檢討報告 [3, 4] 主要集中在補救與復原上,對底層技術細節的討論有限。因此,許多重要的問題仍未得到解答,包括脆弱的呼叫路徑是如何構成的,以及為何現有的檢查未能防止漏洞被利用。

在本報告中,我們基於反編譯的位元組碼(bytecode)與鏈上執行追蹤,提供了更詳細的技術分析。雖然缺乏原始碼限制了可見度,但位元組碼層級的分析足以重建易受攻擊的邏輯,並揭示了一些關於合約設計的有趣觀察,這些觀察從高層次的警報中並不能直接看出來。

我們首先深入探討 SwapNet 事件,隨後詳細分析 Aperture Finance 事件。


SwapNet 事件

背景

SwapNet [5] 是一個去中心化交易所(DEX)聚合器,旨在透過匯總來自多個鏈上來源(包括 AMM 和私人做市商)的流動性來尋找最佳掉期路徑。該協議還允許使用者在執行掉期時指定自訂路由器或資金池,從而提供額外的靈活性。

根本原因分析

此事件源於對使用者提供的輸入缺乏足夠的驗證,這使得攻擊者能夠使用任意參數觸發 transferFrom() 呼叫。因此,先前已授權給受害者合約(例如 0x616000e384Ef1C2B52f5f3A88D57a3B64F23757e)的資產可能會被轉移給攻擊者。

根據反編譯的位元組碼,函數 0x87395540() 對關鍵輸入似乎缺乏適當的驗證。透過將預期的路由器或資金池位址替換為代幣位址(例如 USDC),合約錯誤地將代幣視為有效的執行目標。這導致了一個底層呼叫被執行,且帶有攻擊者控制的 calldata。

因此,受害者合約執行了以下格式的呼叫:approvedAsset.transferFrom(victim, attacker, amount),允許攻擊者竊取所有已授權的資產。

攻擊流程

我們觀察到針對 SwapNet 的多起攻擊。此處我們以 Base 交易 0xc15df1d131e98d24aa0f107a67e33e66cf2ea27903338cc437a3665b6404dd57 作為範例。

攻擊者僅僅使用惡意輸入呼叫了受害者合約的 0x87395540() 函數。此調用包含兩個主要步驟:

  1. 一個關鍵的內部變數(例如 v51)被設定為 USDC,繞過了預期的路由邏輯。
  1. 一個底層呼叫被執行,其使用的是由攻擊者控制的 calldata,導致 USDC.transferFrom() 被呼叫,所有已授權的 USDC 隨之被耗盡。

損失摘要、交易與受影響合約

SwapNet 事件在多條鏈上造成的估計損失約為 1,341 萬美元。下表總結了關鍵的攻擊交易與所涉及的受害者合約位址。


Aperture Finance 事件

背景

Aperture Finance [6] 是一個 DeFi 協議,代表使用者管理集中流動性頭寸(例如 Uniswap V3 LP)。其閉源合約(例如 0xD83d960deBEC397fB149b51F8F37DD3B5CFA8913)允許使用者使用原生代幣鑄造與管理 Uniswap V3 頭寸。

鑄造 UniswapV3 頭寸的預期工作流程

當透過 0x67b34120() 函數鑄造 Uniswap V3 頭寸時,合約遵循一個預期的三步驟工作流程:

  1. 封裝原生代幣(Wrap native tokens)

  2. 透過內部函數 0x1d33() 交換原生代幣

  3. 鑄造 UniswapV3 頭寸

問題出在第 2 步:0x1d33() 透過底層呼叫執行自訂交換,其中關鍵參數(例如呼叫目標與 calldata)似乎是由使用者控制且驗證不足的,這導致了非預期的外部呼叫。後續章節提供了更多細節。

根本原因分析

與 SwapNet 事件類似,Aperture Finance 事件是由於對底層呼叫的輸入驗證不足所造成的。當呼叫 0x67b34120() 時,內部函數 0x1d33() 使用由使用者提供的 calldata 執行底層呼叫,而沒有對呼叫目標或函數選擇器實施嚴格限制。

如下圖所示,用於觸發底層呼叫的 calldata 完全基於攻擊者的輸入。

這使攻擊者能夠構建惡意的 calldata,導致:在受害者合約的內容中執行 approvedToken.transferFrom(victim, attacker, amount)。結果,不僅是 ERC20 代幣,就連已授權的 Uniswap V3 頭寸 NFT 也可能被竊取。

攻擊流程

我們觀察到針對 Aperture Finance 的多起攻擊。在本節中,我們以 Ethereum 交易 0x8f28a7f604f1b3890c2275eec54cd7deb40935183a856074c0a06e4b5f72f25a 作為代表性範例。

  1. 攻擊者創建了一個攻擊合約 0x5c92884dFE0795db5ee095E68414d6aaBf398130。

  2. 攻擊合約以惡意輸入及 100 wei ETH(即 msg.value == 100)呼叫了函數 0x67b34120()。

  • a) 原生 ETH 透過 WETH.deposit() 函數被封裝成 WETH。
  • b) 內部函數 0x1d33() 被呼叫以執行底層呼叫。在此步驟中,受害者合約中觸發了 WBTC.transferFrom(victim, attacker, amount) 的呼叫,允許攻擊者竊取已授權的代幣。值得注意的是,0x1d33() 函數在結束時通過了一個餘額檢查。具體來說,函數 0x1d33() 將餘額變化與攻擊者指定的交換輸出值(即 varg2.word2)進行了比較。因此,該操作通過接收零來成功執行。
  1. 最後,呼叫函數 NonfungiblePositionManager.mint(),使用 100 wei WETH 為攻擊者鑄造一個頭寸。

有趣的發現

透過比較正常與異常的鑄造交易,我們觀察到兩者都將代幣授權給了同一個 spender(例如 OKX DEX: TokenApprove),但指定了不同的路由器位址(即 DexRouter 與 WBTC)。這表明該合約可能對批准的 spender 實施了驗證,但在驗證實際執行目標時失敗了,從而留下了一個可透過任意呼叫利用的重大漏洞。

正常交易:https://app.blocksec.com/phalcon/explorer/tx/eth/0xc823b703c716fa9078e1d71714b734557bd540ddd1e41590dd73da7c5aba0200

異常交易:https://app.blocksec.com/phalcon/explorer/tx/eth/0x8f28a7f604f1b3890c2275eec54cd7deb40935183a856074c0a06e4b5f72f25a

損失摘要、交易與受影響合約

Aperture Finance 事件在多條鏈上造成的總損失估計約為 367 萬美元。下表總結了關鍵的攻擊交易與相關的受害者合約位址。


結論

雖然 SwapNet 與 Aperture Finance 事件影響了不同的協議與鏈,但這兩起案例的潛在問題並不複雜:由使用者控制的底層呼叫,結合了持有代幣授權合約中輸入驗證的不足。這些事件提醒我們,在合約設計中,靈活性必須與嚴格的呼叫限制仔細平衡,特別是在外部審計受限的閉源系統中。

參考文獻

[1] https://x.com/Phalcon_xyz/status/2015614087443697738

[2] https://x.com/Phalcon_xyz/status/2015624519898234997

[3] https://meta.matcha.xyz/SwapNet-Incident-Post-Mortem

[4] https://x.com/ApertureFinance/status/2015938720453820752

[5] https://x.com/0xswapnet

[6] https://x.com/ApertureFinance

關於 BlockSec

BlockSec 是一家提供全端區塊鏈安全與加密合規服務的供應商。我們致力於建構產品與服務,協助客戶在協議與平台的生命週期中執行程式碼審計(包含智慧合約、區塊鏈與錢包)、即時攔截攻擊、分析事件、追蹤非法資金,並滿足 AML/CFT 合規義務。

BlockSec 已在知名會議上發表多篇區塊鏈安全論文,通報了多項 DeFi 應用程式的零日漏洞,攔截了多次駭客攻擊並挽救了超過 2,000 萬美元的資金,並保障了數十億美元的加密貨幣安全。

訂閱最新動態
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 審計