積羽沉舟 —— Balancer 超 1 億美元被黑分析

2025 年 11 月 3 日,老牌去中心化自動做市商協議 Balancer v2 遭到攻擊,包括其 fork 協議在內的多個項目在多條鏈上損失約 1.2 億美元,這使得本就不太景氣的 DeFi 生態雪上加霜。

作者:Kong & Lisa

編輯:77

背景

2025 年 11 月 3 日,老牌去中心化自動做市商協議 Balancer v2 遭到攻擊,包括其 fork 協議在內的多個項目在多條鏈上損失約 1.2 億美元,這使得本就不太景氣的 DeFi 生態雪上加霜。以下是慢霧安全團隊針對此次攻擊事件的具體分析:

根本原因

Balancer v2 的 Composable Stable Pool 實現中(基於 Curve StableSwap 的 Stable Math),對縮放因子 (scalingFactors) 的整數定點運算存在精度丟失問題,導致在代幣兌換中產生微小、但可複利式積累的價差/誤差。攻擊者利用低流動性下小額兌換來放大此誤差以顯著的累計利潤。

前置知識

在分析開始前,我們需要了解關於 Balancer 的一些關鍵性知識以便理解本次分析內容。

Composable Stable Pools(可組合穩定池)

可組合穩定資產池專為預期以接近平價或已知匯率的資產而設計的代幣互換池子。例如,以接近 1:1 互換的 USDC/USDT,或者以已知匯率互換的 WETH/stETH。

Balancer Pool Token (BPT)

BPT 代表 Balancer 池子的份額,當用戶向池子添加流動性時可以獲得 BPT 以代表用戶在池子中的流動性份額。

Composable(可組合性)

資金池允許使用 LP 與流動性資產進行互換以提高資本效率。例如,允許使用 BPT 代幣與 WETH/stETH 等流動性代幣之間進行互換。

Scaling Factor(縮放因子)

Balancer 的底層池子中設計了一套用於管理小數精度以及舍入方向的方法,使得所有資金在進入池子進行計算前通過縮放因子確保精度以及小數舍入方向是有利於池子的。

Batch Swaps(批量互換)

批量互換功能允許用戶在一筆交易內在同個/多個池子中進行不同代幣之間的互換,池子通過虛擬數值進行內部記賬,並在批量互換結束後進行結算。

攻擊分析

這裡以攻擊者在以太坊上攻擊涉及的兩筆交易為例:

攻擊交易:0x6ed07db1a9fe5c0794d44cd36081d6a6df103fab868cdd75d581e3bd23bc9742

取款交易:0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569

  1. 攻擊者首先通過批量互換功能發起攻擊交易,其使用 BPT 大量換出池子的流動性代幣,這使得池子的流動性代幣儲備變得很低。
  1. 在池子流動性代幣儲備下降後,攻擊者開始進行流動性代幣之間 (osETH/WETH) 的互換操作。
  1. 最後再將流動性代幣換回 BPT 代幣,並在多個池子不斷的重複此操作。
  1. 完成攻擊交易後,攻擊者通過獨立的一筆取款交易調用 Vault 的 manageUserBalance 函數提取所獲得利潤。而這筆交易也正是早前被多個分析員誤以為是攻擊交易並進行分析,但實際這只是使用了正常的取款邏輯的正常取款交易。
  1. 那麼為什麼攻擊者可以看似簡單的通過上述操作就可以無需支付任何代幣就從 Vault 中取款呢?通過簡單的觀察我們可以發現,攻擊者在完成批量互換後 Vault 內部記賬餘額都實現了增加,這使得攻擊者可以直接從 Vault 中提取這些餘額。

接下來我們具體剖析為何攻擊者無需付出任何代幣即可無中生有的讓餘額實現增長。

原理剖析

通過上述攻擊分析我們可以知道,攻擊者主要通過三個步驟實現獲利:

  1. 使用 BPT 兌換流動性代幣;
  2. 進行流動性代幣互換;
  3. 將流動性代幣換回 BPT。

我們首先分析 BPT 兌換流動性代幣的過程,由於攻擊者傳入的兌換類型 kind 是 1,所以池子會將攻擊者傳入的兌換數額作為 amountOut 來計算攻擊者應該提供多少 amountIn 進行兌換。這裡不在贅述繁瑣的調用鏈,我們直接分析 BPT 兌換的底層 _swapWithBpt 函數。

通過 _swapWithBpt 函數我們可以發現其會先通過 _upscaleArray 函數使用縮放因子對池子的代幣儲備數額進行縮放,以便統一價格精度與舍入方向。_upscaleArray 函數通過 FixedPoint.mulDown 進行具體的縮放操作。我們可以很快的知道 mulDown 會使得計算結果會向下舍入,即截斷小數。

這將導致池子儲備在縮放過程中如果存在小數的話會被直接截斷。通過前置知識我們可以知道可組合性池子是專為預期以接近平價或已知匯率的資產而設計的代幣互換池子,以這裡的 WETH 與 osETH 為例,他們之間是有一個已知的匯率的。因此在計算 osETH 實際儲備時是需要乘以匯率再進行縮放以統一價格。

很不幸的是,由於匯率的存在,計算 osETH 的儲備數額必然會被截斷小數。

這就使得計算後的池子儲備餘額會小於預期,而 BPT 的價格是通過池子流動性代幣總價格除 BPT 代幣總供應量來計算的,這意味著上述誤差會使得 BPT 價格小於預期。

利用此誤差造成的價差,攻擊者在批量互換中的第三步將流動性代幣換回 BPT 代幣時將獲得微小的利潤。但這顯然與攻擊者巨大的獲利相差甚遠,因此關鍵在於批量互換中的第二步。

攻擊者在進行流動性互換時使用的兌換類型 kind 仍然是 1,我們直接切入底層互換函數進行分析,可以很快發現 _swapGivenOut 函數會先通過 _upscale 函數進行縮放:

與先前的 _upscaleArray 函數一樣會通過 FixedPoint.mulDown 函數對用戶的兌換數額縮放後的值進行小數截斷,這使得最終所需的輸入代幣 amountIn 數量將小於預期。如果兌換的數額巨大,那麼這點誤差是可以忽略的,但如果兌換數額很小時,這就將導致巨大的偏差。

攻擊者也正是如此操作的,在批量互換中的第二步中,先將池子中的 osETH 的餘額儲備變得更小,隨後進行精確的進行 17wei 的 osETH 小額兌換。

在進行縮放計算時實際的餘額應該為 17.98825094772952。

但因為小數截斷,最終餘額仍為 17wei,0.98825094772952 相對於 17 來說,精度損失已經造成了巨大的偏差。以此計算的輸入代幣數量 amountIn 也會造成巨大的偏差。

為了確保能夠循環累計此偏差,在批量互換中的第二步中攻擊者會再將 osETH 換回 WETH,以確保下次仍有充足的流動性來進行小額互換。

而 WETH 本身就是匯率錨定的代幣,因此 osETH -> WETH 的兌換過程中的縮放是以 1e18 進行的,因此並不會之前的誤差累計造成影響。

至此,我們可以很清晰的瞭解整個攻擊流程了:

  1. 攻擊者通過 BPT 兌換流動性代幣來降低池子的流動性代幣儲備以對小額互換做準備;
  2. 通過流動性代幣之間 osETH -> WETH 的互換來為精確控制小額互換精度誤差做準備;
  3. 精確的通過 osETH -> WETH 互換來累計精度誤差;
  4. 通過流動性代幣之間 WETH -> osETH 的互換來恢復流動性;
  5. 重複 2-4 的過程不斷的放大誤差;
  6. 將流動性代幣換回 BPT 代幣以此恢復流動性平衡;
  7. 利用小額代幣互換放大的誤差使得最終結算時 Out 的代幣數額遠大於所需的 In 的代幣數額,以此獲得巨大利潤。

MistTrack 分析

由於涉及項目較多,此小節僅分析本次事件中主要的地址及其資金流向。

1、地址 0xaa760d53541d8390074c61defeaba314675b8e3f

獲利情況:在以太坊上獲利包括 osETH、USDC 等多種代幣。

轉移情況:將 ezETH、weETH、ankrETH 等多種代幣,以及部分 osETH 兌換為 ETH 後,集中轉出至地址 0xf19fd5c683a958ce9210948858b80d433f6bfae2。

餘額情況:主要包括 7,838.3569 WETH 和 7,000 ETH。

初始資金來源:地址 0x506d1f9efe24f0d47853adca907eb8d89ae03207,其資金來自 gas.zip。

通過對地址 0x506d1f9efe24f0d47853adca907eb8d89ae03207 進行分析,其在 gas.zip 的交易情況如下:

該地址不斷將 Arbitrum 上的 ETH 分散轉出到多條鏈後併發起攻擊。再向上追溯,該地址 0x506d1f9efe24f0d47853adca907eb8d89ae03207 的資金最初可追溯至 Tornado Cash:

  • Tornado Cash → 0x86fedad11c4765700934639f1efe1fc01355c982:從 Tornado Cash 提取的 100 ETH + 0.1 ETH 轉入此地址。
  • 0x86fedad11c4765700934639f1efe1fc01355c982 → 0x766a892f8ba102556c8537d02fca0ff4cacfc492:轉移 15 ETH。
  • 0x766a892f8ba102556c8537d02fca0ff4cacfc492 → 跨鏈並進行 gas.zip 操作:將 5 ETH 從以太坊跨鏈至 Arbitrum 並轉到地址 0x506de24d01e6c8623307c9ff5e3c8a945b553207。

2、地址 0xf19fd5c683a958ce9210948858b80d433f6bfae2

獲利情況:該地址為核心中轉節點,接收來自多個鏈和上游地址的資金。

上游來源:來自 Arbitrum 地址 0x872757006b6F2Fd65244C0a2A5fdd1f70A7780f4 轉入 USDX 和 sUSDX;

來自 Sonic 地址 0x045371528A01071D6E5C934d42D641FD3cBE941c 的 stS;

來自上述以太坊地址 0xaa760d53541d8390074c61defeaba314675b8e3f 和 0x506d1f9efe24f0d47853adca907eb8d89ae03207 的轉入。

轉移情況:在以太坊上通過 Velora、CowSwap、KyberSwap、ODOS 等平臺將資產兌換為 ETH 與 WETH 以及通過 LI.FI 將部分資產分別跨鏈至 Arbitrum 與 Sonic;

在 Sonic 上通過 KyberSwap 將 stS 兌換為 S。

餘額情況:除了將 7,000 ETH 轉移給上述地址 0xaa760d53541d8390074c61defeaba314675b8e3f,其他資金均未轉出。

相關地址已加入 SlowMist AML 的惡意地址庫,我們將持續監控相關資金的異動。

11 月 6 日,Balancer 官方發佈了最新通報,其表示儘管此次攻擊波及範圍較廣,但多方快速響應在短時間內顯著降低了損失。

(https://x.com/Balancer/status/1986104426667401241)

目前的資金進展如下:

  1. SEAL Whitehat Safe Harbor (BIP-726, Oct 2024):得益於 2024 年 10 月啟用的 SEAL Whitehat Safe Harbor (BIP-726) 法律框架,白帽團隊在事件發生後得以迅速介入並協同處置。
  2. HyperNative 自動化應急暫停機制觸發:08:06 UTC 時,Hypernative 的緊急暫停系統啟動;到 08:07 UTC,受影響網絡上的所有 CSPv6 資金池均已暫停,阻止進一步擴散。
  3. 所有可暫停的 CSPv6 資金池已進入恢復模式,包括此前未納入統計的低 TVL 資金池。
  4. CSPv6 工廠功能禁用:修復完成前,無法創建新的易受攻擊池。
  5. 受影響池的激勵與排放全部終止,以保留 BAL 及合作方獎勵資產。
  6. 主要 LP 已安全退出:包括 Crypto.com(約 80 萬美元,cdcETH/wstETH)與 Ether.fi(約 106 萬美元,eBTC/wBTC)。
  7. Stakewise 追回資產:已追回 5,041 枚 osETH(約 1,900 萬美元)及 13,495 枚 osGNO(約 170–200 萬美元),約佔被盜 osETH 的 73.5%,將按比例返還受影響用戶。
  8. Berachain 驗證者網絡暫停:為控制 Balancer v2 在 BEX 上的風險敞口,鏈上操作已暫停並啟動緊急分叉。
  9. Sonic Labs 凍結相關地址:對與 Beets(Sonic 上的 Balancer v2 分叉)相關的可疑攻擊者地址實施凍結,防止資金繼續轉移或兌換。
  10. Base MEV 機器人協助回收:已協助追回約 15 萬美元。
  11. BitFinding 白帽團隊:在主網上成功攔截並追回約 60 萬美元資產。
  12. Monerium 凍結 EURe 資產:約 130 萬 EURe 被鎖定,以防止資金進一步流動。
  13. Gnosis 橋限制措施:與 Monerium 團隊協調,在 Gnosis Chain 上臨時限制跨鏈轉出,降低跨鏈傳播風險。
  14. SEAL 團隊與攻擊者溝通:正在按照 SEAL 框架持續推進資金返還協商。
  15. 更多白帽團隊參與支援:包括 SNP 在內的多支安全團隊正協助分析、救援及資金返還。

目前,Balancer 正與安全合作伙伴、研究人員、交易所及白帽團隊積極合作,以推進資金回收。在完成驗證與清算後,官方將公佈更為詳細的事後分析報告。

總結

本次攻擊的核心在於攻擊者利用了 Balancer v2 協議 Composable Stable Pool 實現中對縮放因子進行整數定點運算時存在的精度丟失缺陷。通過精心構造的小額兌換放大這種缺陷帶來的誤差使得攻擊者在批量互換中無中生有的製造出鉅額利潤。慢霧安全團隊建議項目方/審計人員在面對類似場景時應當加強對極端場景和邊界條件的測試覆蓋,特別需要考慮低流動性場景下的精度處理策略。

參考

[1] https://docs-v2.balancer.fi/concepts/pools/composable-stable.html

[2] https://docs.balancer.fi/concepts/core-concepts/balancer-pool-tokens.html

[3] https://docs.balancer.fi/concepts/vault/token-scaling.html

[4] https://docs-v2.balancer.fi/reference/swaps/batch-swaps.html

[5] https://docs-v2.balancer.fi/concepts/advanced/valuing-bpt/valuing-bpt.html#informational-price-evaluation

免責聲明:作為區塊鏈信息平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。文章內的信息僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論