PC6下载站

分类分类

(虚拟币app)Balancer 被盗 1.2 亿美元漏洞技术分析

关注+2025-12-24作者:清晨

前言

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虚拟币app

资产转移Tx:

https://etherscan.io/tx/0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569虚拟币app

技术分析

攻击入口

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

Solidity

function onSwap(

SwapRequest memory swapRequest,

uint256[] memory balances,

uint256 indexIn,

uint256 indexOut

) external override onlyVault(swapRequest.poolId) returns (uint256) {

_beforeSwapJoinExit();

_validateIndexes(indexIn, indexOut, _getTotalTokens());

uint256[] memory scalingFactors = _scalingFactors();

return

swapRequest.kind == IVault.SwapKind.GIVEN_IN

? _swapGivenIn(swapRequest, balances, indexIn, indexOut, scalingFactors)

: _swapGivenOut(swapRequest, balances, indexIn, indexOut, scalingFactors);

}

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

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

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

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

攻击模式分析

BPT Price 的计算机制

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

Solidity

BPT 价格 = D / totalSupply

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



相关阅读

https://app.pc6.com/app/2154.html

https://app.pc6.com/app/3026.html

https://app.pc6.com/app/3717.html

https://app.pc6.com/app/3093.html

https://app.pc6.com/app/2984.html


展开全部

相关文章

更多+相同厂商

热门推荐

  • 最新排行
  • 最热排行
  • 评分最高
排行榜

    点击查看更多

      点击查看更多

        点击查看更多

        说两句网友评论

          我要评论...
          取消