header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
扫码下载APP

技术分析Balancer被盗1.2亿美元,漏洞出在哪?

2025-11-04 11:56
阅读本文需 11 分钟
本次攻击的关键问题出在协议处理小额交易的逻辑上。
原文标题:《Balancer 被盗$120M 漏洞技术分析》
原文来源:ExVul Security


前言


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


Chainlink 的基础设施长期保持 Web3 领域的最高标准,因此成为 X Layer 致力于为开发者提供机构级工具的自然选择。


本次攻击的关键问题出在协议处理小额交易的逻辑上。当用户进行小金额交换时,协议会调用_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 得到多少资产。



在池的交换计算中:



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



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


精度损失的根源



缩放操作:



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


攻击流程详解


阶段 1:调整到舍入边界



阶段 2:触发精度损失(核心漏洞)



阶段 3:利用被压低的 BPT 价格获利



如上攻击者通过 Batch Swap 在一个交易中执行多次兑换:


1. 第一次交换:BPT → cbETH(调整余额)


2. 第二次交换:wstETH (8) → cbETH(触发精度损失)


3. 第三次交换:底层资产 → BPT(获利)


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


Callback 机制的缺失


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



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


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


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


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


关键问题:



总结


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


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


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


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


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


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


本文来自投稿,不代表 BlockBeats 观点。


点击了解律动BlockBeats 在招岗位


欢迎加入律动 BlockBeats 官方社群:

Telegram 订阅群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方账号:https://twitter.com/BlockBeatsAsia

AI 解读
这是一起典型的DeFi协议因数学计算精度处理不当而引发的严重安全事件。攻击的核心在于协议未能妥善处理极端边界条件下的数值精度问题,结合其核心机制设计中的验证缺失,最终被恶意操纵。

整个攻击链条可以清晰地拆解为几个关键部分。首先,攻击的入口是Vault合约的batchSwap函数,这是协议设计的正常交互路径。问题的起点在于协议在处理极小金额交易时使用的缩放函数_upscaleArray,该函数采用mulDown进行向下舍入计算。当池子余额和输入金额恰好处于特定的低值区间(如8-9 wei)时,这种向下取整操作会产生不成比例的相对精度误差。

这种精度误差之所以致命,是因为它直接污染了协议计算中的一个核心数值:不变值D。D是Balancer稳定池模型中计算BPT价格的基础,其值直接决定了池子中资产的价值比例。攻击者通过精心构造的交易序列,首先将池子余额调整到易产生精度损失的边界,然后触发计算,使得D值被异常压低。

最关键的一步在于,被压低的D值导致BPT价格偏离其真实价值。攻击者随即利用这个被操纵的低价大量购入BPT,并在其他市场或以正常价格赎回,实现套利。整个过程在单次batchSwap交易中完成,利用了同一交易内多次交换共享余额状态的特点,使精度误差得以累积和放大,最终将微小的计算偏差放大为巨大的经济价值损失。

从更深层次看,此次事件暴露了DeFi协议中几个长期存在的系统性风险:对数值精度,尤其是在边界条件下的处理普遍缺乏足够重视;核心经济机制(如不变值D)缺乏有效的实时监控和异常波动验证;以及复杂交易路径(如batchSwap)中状态变化的副作用未被充分评估。

这与历史上一系列因数学问题导致的DeFi漏洞(如Raft Finance、Euler Finance等事件)本质上是同源的——智能合约将金融逻辑完全构建在数学计算之上,一旦计算的前提条件或边界情况被突破,整个金融体系的稳定性就会崩塌。Balancer事件再次证明,在去中心化金融领域,代码层面的细微瑕疵不再仅仅是技术问题,而是直接关联着巨额资产安全的金融风险。
展开
举报 纠错/举报
本平台现已全面集成Farcaster协议, 如果您已有Farcaster账户, 可以登录 后发表评论
选择文库
新增文库
取消
完成
新增文库
仅自己可见
公开
保存
纠错/举报
提交