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

探索 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