Balancer 兩度遭受閃電貸攻擊,CertiK 還原其中 STA 代幣攻擊過程。

相關閱讀:
當紅流動性挖礦 DeFi 項目 Balancer 如何被攻擊?官方這麼說
1inch 技術分析頭部 DeFi 協議 Balancer 通縮代幣資金池攻擊細節

原文標題:《空手套以太: Balancer 攻擊解析》
撰文:CertiK

6 月 29 日北京時間凌晨 2 點 03 分,CertiK 天網系統 (Skynet) 檢查到在區塊 10355807 處 Balancer DeFi 合約異常,安全研究員迅速介入調查,攻擊過程浮出水面。

事件概述

6 月 29 日凌晨 2 點 03 分,攻擊者利用從 dYdX 閃電貸中借到的 WETH,大量買進 STA 代幣,使得 STA 與其他代幣的兌換價格急劇上升。然後使用最小量的 STA (數值爲 1e-18)不斷回購 WETH,並在每次回購後,利用 Balancer 的合約漏洞重置其內部 STA 的數量(數值爲 1e-18),以此穩住 STA 的高價位。

攻擊者不斷利用漏洞,用高價的 STA 將某一種代幣完全買空(WETH,WBTC, LINK 和 SNX),最終用 WETH 償還閃電貸,並剩餘大量 STA,WETH,WBTC, LINK 和 SNX,並通過 uniswap 將非法所得轉移到自己賬戶中。此次攻擊約獲利 90 萬人民幣。

CertiK 分析的此次事件攻擊者心理畫像:

CertiK:簡析當紅流動性挖礦項目 Balancer 遭攻擊始末

攻擊者在調取 STA 餘額後,快速調用 swapExactAmountIn 函數購買 STA,並在第 24 次交易使用了另一個函數 swapExactAmountOut 精準的將 STA 的數目買到了最小值(1e-18),從而最大化後續攻擊的效率。最開始的 6 筆交易,在沒有必要的情況下,3 次買入後賣出,損失了 4 個 WETH,故布疑雲。並且能夠做到隱匿自己的閃電貸階段痕跡來看,有黑客特性。

CertiK 判斷攻擊者是有經驗的黑客團隊在充分準備後的一次攻擊嘗試,有很大可能還會繼續攻擊其他 DeFi 合約。

攻擊重現

階段 0:攻擊者從 dYdX 閃電貸處借款,獲得初始 WETH 資金。

階段 1:攻擊者使用 WETH 將 Balancer 中的 STA 儘可能買空,最大程度提高 STA 價格。

階段 2:攻擊者用獲得的 STA 多次買回 WETH。每一次都用最小量的 STA (數值爲 1e-18)進行購買,並利用 Balancer 內部漏洞函數 gulp(),鎖定 STA 的數目,控制 STA 對 WETH 的價格。重複多次該種買回操作,直到將 Balancer 中的 WETH 取空。

階段 3:換一種代幣,用 STA 重複階段 2 直到取空該種代幣。階段三重複了三次,一共有 4 種代幣受到了損失 WETH,WBTC, LINK 和 SNX。

階段 4:償還 dYdX 閃電貸,離場。

CertiK:簡析當紅流動性挖礦項目 Balancer 遭攻擊始末

攻擊者獲利

CertiK:簡析當紅流動性挖礦項目 Balancer 遭攻擊始末

攻擊者攻擊地址:

0x81D73c55458f024CDC82BbF27468A2dEAA631407

攻擊者最終收款地址:

0xbf675c80540111a310b06e1482f9127ef4e7469a

攻擊者最終獲利:565.5326240837032 ETH, 約合 90 萬人民幣(北京時間 20200630 早 9 點 30 分價格)

漏洞分析

Balancer 合約的 gulp() 函數作用爲將某一種代幣的內部記錄數值覆蓋到當前該種代幣的真實數目,但是錯誤的把他設置成沒有限制的 external 函數。gulp() 函數不應該爲 external,或者應該加入對於特定使用者或者智能合約擁有者的驗證或者防護限制條件。

參考資料:

1. Balancer Github:

https://github.com/balancer-labs/balancer-core/blob/140df49361a58e6c79b395964be98387702a7c0d/contracts/BPool.sol#L334

https://github.com/balancer-labs/balancer-core/blob/140df49361a58e6c79b395964be98387702a7c0d/contracts/BMath.sol#L28

https://github.com/balancer-labs/balancer-core/blob/140df49361a58e6c79b395964be98387702a7c0d/contracts/BPool.sol#L423

2. 攻擊交易歷史記錄:

https://ethtx.info/mainnet/0x013be97768b702fe8eccef1a40544d5ecb3c1961ad5f87fee4d16fdc08c78106

3. 官方攻擊報告:

https://medium.com/balancer-protocol/incident-with-non-standard-erc20-deflationary-tokens-95a0f6d46dea

來源鏈接:mp.weixin.qq.com