N/A

N/A

Balancer漏洞分析

一、相關模塊:#

1)batchSwap
Balancer Vault 中,batchSwap 提供了類似 Uniswap V4 的任意組合交換 —— 只在交易完畢時進行結算。
代幣可在過程中被增發任意數量,而用戶只需對最後的結算結果付款

2)Composable Pools(可組合池)
底層資產 (如 peg)相似的 LST 代幣可在 Composable Pool 互換,交換比率取決於原線性池中「LST 和底層資產數量的比值」。{底層資產 / LST} 越大,該 LST 在組合池中的價值越高。

3)線性池
Balancer 的線性池在交易時會向上取整 amount in,向下取整 amount out。
當池的 Virtual supply 為零,池會進行初始化,此時 LST 代幣與底層資產 1:1 兌換
Virtual supply=totalSupply - 線性池 balance
其中 Virtual supply 為 LST 代幣實際發行量,totalSuppy 為定值,線性池 balance 代表預增發量)

二、可用攻擊向量#

1) BatchSwap 的 “增發” 機制:LST 代幣可在交易過程中被鑄造出能填滿 Virtual supply 的數量,為初始化線性池提供條件。

2) 線性池的取整機制:使用 LST 兌換底層資產,向下取整的 amount out 可讓線性池兌換比例失衡,且在線性池原有資產比例懸殊時失衡尤為顯著。
失衡表現:{底層資產 / LST} 偏大

3) 組合池的兌換比例機制:根據可組合池特點,抬高某一 LST 的價格可以以折扣價兌換到其他 LST

三、主要流程:#

1. 第一筆 swap(usdc 線性池):以 “增發” 的 USDC BPT (上文 LST)兌換了線性池內的絕大部分 usdc

2. 第二筆 swap(usdc 線性池):構造一筆交易,其 amount out 被取為 0。線性池 {底層資產 / LST} 因取整機制變得極大

3. 第三筆 swap(組合池),組合池內的 DAI/USDT BPT 以低價被 USDC BPT 換出

4. 第四筆 swap(usdc 線性池):向線性池注入 USDC BPT,使 VirturalSupply=0,初始化線性池

5. 第五筆 swap(usdc 線性池):以 1:1 的比例使用 USDC 換出 USDC BPT,償還 “增發” 貸款

第五步是必須的:USDC 的精度低於 USDC BPT,舍入造成的線性池平衡傾斜是單向的,只有第五步才能提供足量的 USDC BPT,同時保留 DAI/USDT BPT

四、聯想#

在 zkLend 攻擊中,攻擊者事先讓 lending_accumulator 的值變得極大,再利用舍入機制以較少數量的 wstETH 兌換較多的 wstETH。

zkLend 的舍入均向下取整(核心 payload),Balancer Liner pool 也存在相同的問題,但 Balancer 攻擊者走的不是這條路徑

具體實現為:
1. 以 1 > 的利率 “借入” BPT(閃現),並將其交易為 main 和 wrapped,以將代幣餘額減少到接近零。
2. 製作一筆交易,利用 GivenOut 掉期的四舍五入誤差,使總餘額等於虛擬供應量,從而將匯率重置為 1(因為匯率 = 餘額 / 供應量)。
3. 以新的較低利率償還閃電掉期 BPT 以獲得利潤

五、參考#

https://medium.com/balancer-protocol/rate-manipulation-in-balancer-boosted-pools-technical-postmortem-53db4b642492

https://slowmist.medium.com/review-and-recommendations-of-balancer-incident-d2b31b5bd863

https://mp.weixin.qq.com/s/eHStMzKZjSs6y1ka2X5_lQ

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。