Balancer 攻击分析

  • weilinli
  • 发布于 6小时前
  • 阅读 61

2025年7月3日,Balancer 由于精度损失漏洞被黑客攻击,损失超过 1 亿美元。文章分析了攻击的根本原因,即 Balancer 的 Composable Stable Pool 实现中的精度损失漏洞,以及攻击者如何通过操纵池状态和利用闪电铸造的 LP 代币来放大这一漏洞。此外,文章还讨论了如何合法地从这一事件中获利,例如通过做空相关代币或在预测市场上进行交易。

昨天,2025 年 11 月 3 日,Balancer 由于精度损失漏洞被攻击,损失超过 1 亿美元

虽然官方的事后分析尚未发布,但大多数池子已经暂停或被清空

这篇文章是我对这次漏洞的分析。

在这篇博客中,我将:

  • 确定根本原因,
  • 分析模仿者,
  • 并讨论如何合法获利(不是通过黑客攻击!)。

攻击分析

最初,一些安全研究人员声称该漏洞仅仅是一个访问控制漏洞,类似于 Abracadabra 攻击(例如,DeFimonMyWebacy)。

但是,他们发布的交易只是提款,而不是实际利用。 例如:

Balancer 的高级内部余额功能(实际上没有漏洞)允许用户执行内部会计,而不是 ERC-20 转账。

例如,当交换 ETH → DAI → USDC 时,DAI 转账可能永远不会出现在链上,因为余额是在内部更新的。

用户也可以随时存入或取出他们的内部余额。 黑客的提款交易只是这样一种提款。

第一个问题,为什么黑客将攻击分为 2 个步骤(攻击-然后-提款)? 尽管存在技术问题,但一个特殊的原因可能是这可以部分缓解抢先交易,因为攻击交易对某些抢跑者来说是“无利可图的”,除非他们考虑到 Balancer 的内部余额。 然而,正如稍后讨论的,他仍然被多个机器人抢跑。


该漏洞在于 Balancer 的 精度损失 Composable Stable Pool 实现中——这是 Curve 的 StableSwap AMM 的修改版本。

这些池包含多个Hook资产(例如,wstETHETH),并且 LP 代币(BPT)本身可以在池内交换。

交换 BPT → token1 有效地提取流动性并在内部交换另一个代币。

Balancer 引入了一个缩放因子来支持相关(非 1:1)资产。

例如,如果 1 wstETH = 1.05 ETH,则:

  • wstETH 的缩放因子 = 1.05
  • ETH 的缩放因子 = 1.0

这些存储为 1e18 精度(例如,1.05 × 1e18 = 105e16)的整数。

缩放后的金额计算为:

scaled_amount = (raw_amount * scaling_factor) / 1e18

问题来了: 如果 raw_amount 非常小(例如,8 wei),则整数除法会导致高达 12.5% (1/8) 的精度损失。

另一个促成因素是内部余额机制——用户可以在 batchSwap 期间闪铸代币,在同一交易中使用它们,并且只需要在最后结算余额。 这使得该漏洞更加强大。


现在,让我们检查一下攻击交易本身。 我们可以以 base 上的 0xe9245fb124c3a6ff6a0e39c6d0db02b74b3a3d805f6bf016f4b9ac56cbfb73ae 为例。 在较高层面,攻击分为 4 个阶段(1 个计算 + 3 个动作)。

1. 计算

攻击者使用独立的合约来模拟交换状态,以触发精确的精度损失。 该合约的代码是从 Balancer 自己的合约复制的,因为它也包含 Balancer 代码中的一些自定义错误。

2. 操纵

攻击者使用“闪铸” LP 代币通过重复交换 BPT → token1 和 BPT → token2 来操纵池状态,使池的_raw_balance 非常小(数量级为 10_000~100_000)。 由于闪铸的 BPT 无法提取,因此攻击者需要将它们交换为 token1 和 token2。 操纵后,如下图所示,token1 和 token2 的_raw_balance非常小 (40,000)。 这是第一个参数(我们可以称其为 b)。

3. 精度损失循环

攻击者重复在两个代币之间进行交换,以放大精度损失。 他们优化了一个变量 $small$ 满足:

maximize{ (small * scaling_factor) % 1e18 }

当交换 $small$ 数量的 token1 到 token2 或反之亦然时,这将产生最大的精度损失。 具体来说,一次迭代包含 3 次交换:

  1. token1 → token2:交换 (b - small - 1) 个代币以创建精度条件
  2. token1 → token2:交换 (small) 个代币以触发精度损失
  3. token2 → token1:交换 ~90% 以恢复平衡

alt text

每个循环都会导致一个小的但复合的不平衡——大致与 1 / small 成正比——稳步耗尽流动性提供者。 攻击者重复此操作,直到利润率足够大。

偿还

攻击者最终将剩余的 token1 和 token2 交换回 BPT,以偿还闪铸的 LP 代币。 此过程也需要轻柔,以避免大的价格影响。 这是提款过程的一部分,因为损失已经实现。

之后,他们从内部余额中提取了所有代币——许多研究人员最初错误地将其识别为攻击本身。

竞速模仿游戏

虽然主要的黑客只利用了 Balancer 上的一些最大的池子,但仍然有一些食物剩下来,被白帽、模仿攻击者和一些 MEV 机器人榨取。 这些包括:

  • 一些未被主要攻击者获取的小池子;
  • 更大的池子的“尸体”;
  • Balancer 分叉。

抢跑

虽然攻击实现起来很复杂,但攻击者已将其计算合约放在链上。 一方面,这避免了链下计算和链上执行之间的状态不匹配; 另一方面,这也使其他人可以轻松复制攻击。 因此,有一些抢跑者抢在主要攻击者之前以获得一些利润。

有趣的是,攻击者在创建这个杰作黑客攻击时,似乎没有经验。 证据:

  • 攻击者可以使用 flashbots 或直接提交给构建者以避免抢跑,但他没有。
  • 攻击者在执行合约中留下了一些调试代码(foundry 日志),这些代码本可以删除。
  • 黑客花费了很长时间(大约 20 分钟)来完成以太坊、Optimism、Arbitrum、Polygon 等上的所有攻击。

尾随 - 模仿者

一个值得注意的事情是,攻击实施起来太复杂了,因为所有步骤都需要精确计算才能触发精度损失。 尽管如此,第一个模仿者(顺便说一句,他似乎是一个臭名昭著的模仿者,最近也复制了 squid bridge 攻击)在主要攻击发生后一小时内开始利用 (07:46 UTC -> 08:39 UTC)

这怎么可能? 在检查模仿者的交易日志后,你可以找到攻击者合约中的所有日志记录信息,这意味着模仿者只是复制了攻击者的合约代码并自己部署了它! 因此,只需替换池地址和发送者地址,模仿者就可以以非常低的成本发起相同的攻击。

在接下来的几个小时内,出现了大量的模仿者,利用了 Balancer 上的各种池子。 然而,无一例外,所有模仿者都使用了与原始攻击者相同的代码库,只是更改了池地址和发送者地址。

分叉后果

接下来,灾难降临到 Balancer 分叉。 由于 Balancer 是开源的,过去几年已经创建了几个分叉,包括 Beets, BEX, PHUX 等。 根据DeFiLlama的数据,有 27 个 Balancer V2 分叉。(但是,只有 V2 稳定池容易受到攻击)

最大的分叉 BEX 也受到了影响并遭受了大约 1300 万美元的损失。 BEX 是 Berachain 上最大的 DEX,并且拥有大量的稳定池。 因此,Berachain 暂停了他们的链,以避免攻击者桥接资产。 其他分叉,例如 Sonic & Optimism 上的 Beets,也遭受了相同的精度损失攻击。

对于 DeFi 来说,这是黑暗的一天,一个单一的精度损失错误在多个链和协议中复制。 甚至在之后不久,ETH 的价格也下跌了,可能与此有关。

暂停

你可能会问,为什么 Balancer 在意识到漏洞后没有直接暂停池子呢? 原因是他们确实暂停了一些池子,但是,Balancer 试图“去中心化”,以便池子的参数和暂停状态只能在部署窗口内更改。 这意味着如果池子部署了很长时间,就无法再暂停了。 不幸的是,一些容易受到攻击的池子已经通过了暂停窗口,因此 Balancer 无法再暂停它们。

如何获利(不是黑客攻击!)

在我在 Twitter 上看到 Balancer 被黑客攻击后,我试图弄清楚在哪里可以做空 \$BAL 代币。 不幸的是,唯一的 CEX/DEX 是 Mexc,那里的流动性不多。 在我搜索时,我意识到我可以做空 \$BERA,因为 BEX 是最大的 Balancer 分叉,并且也受到了相同漏洞的影响。

另一个机会是在这个 Polymarket 市场上进行交易: 2025 年是否会发生另一次超过 1 亿美元的加密货币黑客攻击?。 正如 Defimon 报道的那样,在攻击发生后的 10 分钟内,它仍然保持在低价位。

我发现有用的其他分析

  • 原文链接: blog.weilinli.io/posts/b...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
weilinli
weilinli
江湖只有他的大名,没有他的介绍。