Balancer 被盗 $120M 漏洞技术分析

Balancer协议于2025年11月3日遭受黑客攻击,造成1.2亿美元损失。攻击利用了协议处理小额交易时的双重漏洞:

  • 精度损失漏洞:当余额处于8-9 wei等特定区间时,_upscaleArray函数使用向下舍入操作导致显著的相对精度误差
  • 不变值操控:精度误差传递到关键参数「不变值D」的计算中,异常压低了Balancer Pool Token(BPT)的价格

攻击流程

  1. 攻击者通过Vault合约的batchSwap函数发起多次交换
  2. 每次交换因精度损失导致余额计算不准确
  3. 在Batch Swap中,精度损失不断累积,最终使不变值D显著变小
  4. 利用被压低的BPT价格完成套利

根本原因

  • 缩放函数使用向下舍入机制
  • 不变值计算对精度高度敏感
  • 缺少不变值变化验证机制
  • Batch Swap中的精度损失累积效应

此次攻击暴露了DeFi协议在数值计算精度和状态验证方面的关键缺陷。

总结

前言

2025 年 11 月 3 日,Balancer 协议在 Arbitrum、Ethereum 等多条公链遭受黑客攻击,造成 1.2 亿美元资产损失,攻击核心源于精度损失与不变值(Invariant)操控的双重漏洞。

本次攻击的关键问题出在协议处理小额交易的逻辑上。当用户进行小金额交换时,协议会调用_upscaleArray函数,该函数使用mulDown进行数值向下舍入。一旦交易中的余额与输入金额同时处于特定舍入边界(例如 8-9 wei 区间),就会产生明显的相对精度误差。

精度误差传递到协议的不变值 D 的计算过程中,导致 D 值被异常缩小。而 D 值的变动会直接拉低 Balancer 协议中的 BPT(Balancer Pool Token)价格,黑客利用这一被压低的 BPT 价格,通过预先设计的交易路径完成套利,最终造成巨额资产损失。

漏洞利用Tx:

https://etherscan.io/tx/0x6ed07db1a9fe5c0794d44cd36081d6a6df103fab868cdd75d581e3bd23bc9742

资产转移Tx:

https://etherscan.io/tx/0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569

技术分析

攻击入口

攻击的入口为 Balancer: Vault合约,对应的入口函数为batchSwap函数,内部调用onSwap做代币兑换。

从函数参数和限制来看,可以得到几个信息:

1. 攻击者需要通过 Vault 调用这个函数,无法直接调用。

2. 函数内部会调用 _scalingFactors()获取缩放因子进行缩放操作。

3. 缩放操作集中在 _swapGivenIn或 _swapGivenOut中。

攻击模式分析

BPT Price 的计算机制

在 Balancer 的稳定池模型中,BPT 价格是重要的参考依据,能决定用户得到多少 BPT 和每个 BPT 得到多少资产。

其中 D = 不变值(Invariant),来自 Curve 的 StableSwap 模型

在池的交换计算中:

其中充当 BPT 价格基准的部分为 不变值 D,也就是操控 BPT 价格需要操控 D。以下分析 D 的计算过程:

上述代码中,D 的计算过程依赖缩放后的 balances 数组。也就是说需要有一个操作来改变这些 balances 的精度,导致 D 计算错误。

精度损失的根源:

缩放操作:

如上在通过 _upscaleArray时,如果余额很小(如 8-9 wei),mulDown的向下舍入会导致显著的精度损失。

攻击流程详解

这些交换都在同一个batchSwap交易中,共享相同的余额状态,但每次交换都会调用_upscaleArray修改 balances 数组。

Callback 机制的缺失

主流程是 Vault 开启的,是怎么导致精度损失累积的呢?答案在 balances 数组的传递机制中。

分析如上代码,虽然在每次调用onSwap时 Vault 都会创建新的currentBalances数组,但在 Batch Swap中:

1. 第一次交换后,余额被更新(但由于精度损失,更新后的值可能不准确)

2. 第二次交换基于第一次的结果继续计算

3. 精度损失累积,最终导致不变值 D 显著变小

关键问题:

虽然 Vault 每次传入新数组,但:

1. 如果余额很小(8-9 wei),缩放时精度损失大

2. 在 Batch Swap 中,后续交换基于已损失精度的余额继续计算

3. 没有验证不变值 D 的变化是否在合理范围内

总结

Balancer 的这次攻击,总结为下面几个原因:

1. 缩放函数使用向下舍入:_upscaleArray使用mulDown进行缩放,当余额很小时(如 8-9 wei),会产生显著的相对精度损失。

2. 不变值计算对精度敏感:不变值 D 的计算依赖缩放后的 balances 数组,精度损失会直接传递到 D 的计算中,使 D 变小。

3. 缺少不变值变化验证:在交换过程中,没有验证不变值 D 的变化是否在合理范围内,导致攻击者可以反复利用精度损失压低 BPT 价格。

4. Batch Swap 中的精度损失累积:在同一个 batch swap 中,多次交换的精度损失会累积,最终放大为巨大的财务损失。

这两个问题精度损失 + 缺少验证,结合攻击者对边界条件的精心设计,造成了这次损失。

分享至:

作者:ExVul Security

本文为PANews入驻专栏作者的观点,不代表PANews立场,不承担法律责任。

文章及观点也不构成投资意见

图片来源:ExVul Security如有侵权,请联系作者删除。

关注PANews官方账号,一起穿越牛熊
推荐阅读
2025-11-04 02:51
2025-11-03 11:53
2025-11-03 09:44
2025-11-03 09:26
2025-11-03 08:34
2025-11-03 03:08

热门文章

行业要闻
市场热点
精选读物

精选专题

App内阅读