MetaPool 同一漏洞的两类利用方式 (Nerve Bridge / Saddle Finance): 眼见不一定为实

MetaPool 同一漏洞的两类利用方式 (Nerve Bridge / Saddle Finance): 眼见不一定为实

2022年4月30日,攻击者利用Nerve Bridge 事件中的相同漏洞攻击了Saddle Finance。总共有4900个以太坊遭受攻击。幸运的是,其中1360个以太坊被我们成功挽救。有关此事件的详细描述可以在官方事后分析中找到。

尽管利用的是同一个漏洞,但攻击方式与之前的有所不同。鉴于新的攻击方式并非如人们预期的那样直接,我们认为其值得更深入的调查。在本报告中,我们首先简要介绍该漏洞,然后回顾Nerve Bridge事件的原始攻击方法。之后,我们将重点关注Saddle Finance事件,剖析其攻击过程以揭示新的攻击方式。

0x1. 关于部署的合约

相关合约地址如下:

  • 受害者 MetaSwap 合约:0x824dcd7b044d60df2e89b1bb888e66d8bcf41491
  • 易受攻击的 MetaSwapUtils 合约:0x88Cc4aA0dd6Cf126b00C012dDa9f6F4fd9388b17

值得注意的是,与已验证的MetaSwap合约关联的MetaSwapUtils合约的显示代码与部署的MetaSwapUtils合约等效,其地址在Settings中指定,如下所示:

因此,请不要混淆这两个MetaSwapUtils合约:)

0x2. 漏洞分析

该易受攻击的合约属于MetaPool,这在之前的博客中已详细讨论过。 简而言之,MetaPool最初由Curve设计,允许单个代币与另一个(基础)池中的所有代币进行池化,而不会稀释其流动性。它本质上是一个由稳定币和一个基础池的LP代币组成的池,该基础池包含几种其他稳定币。 MetaPool的设计存在一个顾虑,即MetaPool基本上是一个稳定币池,用于维持稳定币的价格,而基础稳定币池的LP代币不是稳定币。

事实上,基础稳定币池的LP代币价格可以通过调用基础池的getVirtualPrice函数获得,并且其价格会随着基础池收取费用的累积而稳步上涨。 为了处理这个问题,MetaPool在计算价格之前会放大LP代币的储备,如下所示。

因此,如果用户用LP代币兑换稳定币,LP代币的数量将在计算价格之前被放大。 或者,如果用户用稳定币兑换LP代币,计算出的LP代币数量将在转移和记账之前被缩小。

上面的swapUnderlying函数的代码片段用于在MetaPool中的稳定币与基础池中的稳定币之间进行交换。如两个红框所示,该函数会放大传入的LP代币数量,并缩小兑换的LP代币数量。

然而,swap函数的实现与swapUnderlying函数的实现不一致。具体而言,漏洞的根本原因在于swap函数(即_calculateSwap函数)中存在错误的计算,该计算未能正确缩小和放大LP代币的数量。如下所示,左侧显示的是MetaPool的易受攻击代码,右侧显示的是修复版本。

Nerve Bridge事件的攻击者利用了swap函数和swapUnderlying函数之间的一致性问题。 (请注意,Nerve Bridge是Saddle Finance的一个分叉项目。) 之后,Saddle Finance修复了该漏洞,并立即重新部署了MetaSwapUtils库的新版本(即V2)。

不幸的是,由于某种未知原因,以太坊上的sUSD V2 MetaPool仍然部署了旧的、易受攻击的MetaSwapUtils库。 因此,该漏洞于4月30日再次被攻击者成功利用。有趣的是,与Nerve Bridge事件中使用的攻击方法不同,采用了不同的方式来攻击易受攻击的MetaPool。

0x3. Nerve Bridge事件的原始攻击方法

我们重用下图(见之前的博客)来回顾原始攻击方法。

由于易受攻击的swap函数未缩小兑换的LP代币(Nerve 3-LP)的数量,第三步中兑换的数量(36,959)大于正常值。 然后,攻击者调用swapUnderlying函数(无漏洞)将36,959个Nerve 3-LP(在第四步和第五步中)兑换成51,494个fUSDT,从而获利1,143个fUSDT。

可以合理解释利润的原因:攻击者在第三步中获得了更多的Nerve 3-LP,然后在利用swap函数和swapUnderlying函数之间的一致性问题以“正常”价格出售它们。

0x4. Saddle Finance事件的新攻击方法

近期Saddle Finance事件的攻击者采用了一种不同的方法来攻击同一个易受攻击的swap函数,而没有涉及到swapUnderlying函数。 这里我们以一个攻击交易为例进行说明。

直观来看,似乎不应该存在任何利润,因为第三步和第四步的任何含义都会相互抵消。 具体来说,在第三步中,攻击者可能会兑换出更多的saddleUSD,因为LP代币(即saddleUSD)的兑换没有被缩小。 然而,在第四步中,攻击者将不可避免地兑换出更少的sUSD,因为易受攻击的swap函数在计算价格之前没有放大传入的saddleUSD的数量。

然而,如上图所示,攻击者通过第三步和第四步的兑换组合获利了2,059,771 sUSD。 要弄清楚利润的原因,我们必须深入研究定价机制并进行深入调查以理解攻击过程。

0x4.1 定价机制

Saddle Finance的MetaPool继承了Curve的定价公式:

当n等于2时,函数的图形如下面的蓝色曲线所示。 (公式的设计可以在Curve StableSwap白皮书中找到。)

问题来了:MetaPool如何利用这个公式为每次兑换计算价格?

假设n为2,用户使用dx0代币0兑换dx1代币1。 我们可以模拟dx1的计算过程。 在每次兑换中,A可以被视为常数, 而D是唯一可以影响价格曲线的变量。事实上, D会随着池子收取费用的累积而增加。具体来说, 计算过程可以总结为以下三个步骤:

  • 步骤I:将当前池子的储备(x0和x1)代入公式计算当前的D,该D决定了当前的价格曲线。
  • 步骤II:让x0增加dx0,并将当前的Dx0代入公式计算新的x1。
  • 步骤III:然后,dx1是新的x1与旧的x1之间的差值。

如果代币0是基础池的LP代币,则步骤II变成:

此处baseVirtualPrice/1e18在攻击期间约为1.0033。 或者,如果代币是基础池的LP代币,则步骤III变成:

为了理解D如何影响价格曲线,我们也用一个例子来描述。 假设一个用户首先用dx0代币0兑换dx1代币1,然后用dx1代币1兑换dx0'代币0。

如上图所示,由于第二步对第一次兑换收取了费用,D增加,将价格曲线向上移动(从黑色曲线到蓝色曲线)。 此外,该图清楚地描述了为什么dx0'小于dx0'。

0x4.2 攻击分析

为了分析利润的原因,我们在本地部署了易受攻击的和已修复的MetaSwapUtils库,并利用受害者池当时的状况来模拟攻击。 此外,在此模拟期间,我们还记录了一些有助于理解攻击过程的值,即A为10,000,x_sUSD为8,130,463,x_saddleUSD为9,688,608, 以及当时的D为17,818,392。

上图描述了盈利兑换组合的过程:

  • 兑换-I:用14,800,272 sUSD兑换9,657,586 saddleUSD
  • 兑换-II:用9,657,586 saddleUSD兑换16,860,043 sUSD

具体而言,兑换-I可以分为以下两步:

  • ①:用14,800,272 sUSD兑换9,625,654 saddleUSD。此时,由于收取的费用,D增加到17,931,435。
  • ②:由于易受攻击的MetaPool没有缩小已兑换的saddleUSD的数量,该池损失了31,932 saddleUSD。损失使D减少至15,736,195, 这进一步将价格曲线向下移动(从黑色曲线到灰色曲线)。

类似地,兑换-II也可以分为两步:

  • ③:由于价格曲线向下移动,相同的9,625,654 saddleUSD可以兑换出16,891,906 sUSD,远超成本:14,800,272 sUSD。
  • ④:由于易受攻击的MetaPool在计算价格之前没有放大传入的saddleUSD的数量,MetaPool中留下了31,863 saddleUSD,这使得价格曲线向上移动(从灰色曲线到蓝色曲线)。 尽管如此,该兑换组合仍获利2,059,771 sUSD。

显然,上述分析清楚地解释了攻击者为何能够通过新的攻击方法获利。 此外,由于兑换-II中MetaPool中留下的sUSD,原始攻击方法似乎比新方法更有效。当然,攻击者可以发动多次攻击来耗尽池子,这在实际中已被观察到。

0x5. 一些启示

调查表明,两个事件中产生利润的根本原因相同。具体来说,第一次兑换(兑换LP代币)会降低易受攻击的MetaPool的D值,从而进一步向下移动其价格曲线。这种移动极大地影响了后续的定价,是后续利润的主要原因。

关于BlockSec

BlockSec是一家开创性的区块链安全公司,成立于2021年,由一群杰出的全球安全专家组成。公司致力于提升新兴Web3世界的安全性和可用性,以促进其大规模采用。为此,BlockSec提供智能合约和EVM链安全审计服务,Phalcon平台用于安全开发和主动阻止威胁,MetaSleuth平台用于资金追踪和调查,以及MetaDock扩展,帮助Web3构建者高效地在加密世界中进行探索。

迄今为止,公司已为MetaMask、Uniswap Foundation、Compound、Forta和PancakeSwap等300多家知名客户提供服务,并在两轮融资中从Matrix Partners、Vitalbridge Capital和Fenbushi Capital等杰出投资人那里获得了数千万美元的投资。

官方网站:https://blocksec.com/

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

Sign up for the latest updates
Weekly Web3 Security Incident Roundup | Feb 9 – Feb 15, 2026

Weekly Web3 Security Incident Roundup | Feb 9 – Feb 15, 2026

During the week of February 9 to February 15, 2026, three blockchain security incidents were reported with total losses of ~$657K. All incidents occurred on the BNB Smart Chain and involved flawed business logic in DeFi token contracts. The primary causes included an unchecked balance withdrawal from an intermediary contract that allowed donation-based inflation of a liquidity addition targeted by a sandwich attack, a post-swap deflationary clawback that returned sold tokens to the caller while draining pool reserves to create a repeatable price-manipulation primitive, and a token transfer override that burned tokens directly from a Uniswap V2 pair's balance and force-synced reserves within the same transaction to artificially inflate the token price.

Top 10 "Awesome" Security Incidents in 2025

Top 10 "Awesome" Security Incidents in 2025

To help the community learn from what happened, BlockSec selected ten incidents that stood out most this year. These cases were chosen not only for the scale of loss, but also for the distinct techniques involved, the unexpected twists in execution, and the new or underexplored attack surfaces they revealed.

#10 Panoptic Incident: XOR Linearity Breaks the Position Fingerprint Scheme

#10 Panoptic Incident: XOR Linearity Breaks the Position Fingerprint Scheme

On August 29, 2025, Panoptic disclosed a Cantina bounty finding and confirmed that, with support from Cantina and Seal911, it executed a rescue operation on August 25 to secure roughly $400K in funds. The issue stemmed from a flaw in Panoptic’s position fingerprint calculation algorithm, which could have enabled incorrect position identification and downstream fund risk.