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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。