Balancer V2攻击事件初步分析

11月3号,Balancer V2协议及其fork项目在多条链上遭受攻击,导致超过$120M的严重损失。BlockSec在第一时间预警[1],并给出初步分析结论[2]。这是一起高度复杂的攻击事件。我们的初步分析表明,根本原因在于攻击者操纵了不变量(invariant),从而扭曲了 BPT(Balancer Pool Token ) – 也就是ool的LP token – 价格的计算,使其能够通过一次 batchSwap 操作在某个稳定池(stable pool)中获利。

背景知识

1. 缩放(scaling)与取整(rounding)

为统一不同代币的小数位,Balancer 合约会:

  • upscale:把余额与数额放大到统一内部精度再做计算;
  • downscale:把结果缩回原生精度,并进行有方向的取整(例如输入端通常向上取整,确保池子不少收;输出路径常有向下截断)。

结论:同一笔交易内,不同环节采用的取整方向不对称,在极小步反复执行时,会产生系统性微小偏差。

2. D 与 BPT 价格

遭受本次攻击影响的是Balancer V2协议的 Composable Stable Pool [3]以及fork的协议。Stable Pool 用于那些预期可以保持接近 1:1 兑换比例(或在已知汇率下进行兑换的资产),允许在不产生显著价格冲击的情况下进行大额兑换,从而大幅提升相似资产或相关资产之间的资金利用效率。

  • 该pool采用 Stable Math(基于 Curve 的 StableSwap 模型),不变式 D 代表池子的“虚拟总价值”。
  • BPT (Pool的LP Token) 价格近似为:

从上述公式可以看出若能让D 在账面上变小(哪怕资金实际未流失),就能让BPT 价格更便宜。BTP 代表的是Pool的份额,用于计算撤出流动性的时候能获得多少Pool中Reserve,因此如果攻击者能获得更多的BPT,最后在撤出流动性的时候就能获利。

攻击分析

以 Arbitrum 上的一笔攻击交易为例,batchSwap 操作可分为三个阶段:

第一阶段: 攻击者将 BPT 兑换为底层资产,以精确地调整其中一种代币(cbETH)的余额至四舍五入边界的临界点(数量 = 9)。这一步为下一阶段的精度损失(precision loss)创造了条件。

第二阶段: 攻击者使用精心构造的数量(= 8),在另一种底层资产(wstETH)与 cbETH 之间进行交换。由于在缩放代币数量时进行了向下取整(rounding down),计算得到的 Δx 略小(从 8.918 变为 8),从而导致 Δy 被低估,并使不变量 D(来源于 Curve 的 StableSwap 模型)变小。由于 BPT 价格 = D / totalSupply,BPT 价格被人为压低。

第三阶段: 攻击者将底层资产反向兑换回 BPT,在恢复池内平衡的同时,利用被压低的 BPT 价格获利 – 获得更多的BPT Token.

最后,攻击者利用另外一个获利交易进行流动性撤回,从而利用多获得的BPT获得 Pool中其他底层资产 (cbETH和wstETH)从而获利

攻击交易:

获利交易:

Reference:

[1]

[2]

[3]

BPT-5.72%
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 评论
  • 转发
  • 分享
评论
0/400
暂无评论
交易,随时随地
qrCode
扫码下载 Gate App
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)