0x.1 前言
2021年11月15日,我们的内部监控系统在BSC上发现了可疑的闪电贷交易。 调查后,我们发现这是一起针对Nerve Bridge的攻击,包括fUSDT和UST的MetaPools。

截至本文撰写时,攻击者已耗尽Nerve质押池中fUSDT和UST的流动性,并获利900 BNB。
令人惊讶的是,我们发现易受攻击的代码是fork自Saddle.Finance,后者已经在2021年11月6日导致Synapse Bridge损失了8亿美元。 具体来说,该漏洞的根本原因在于不同库中计算代币兑换金额实现的不一致。
然而,目前不存在任何公开的报告来分析此次安全事件。 因此,本文旨在提供一个全面的分析,包括项目机制、漏洞和攻击。
0x2. 背景
0x2.1 什么是MetaPool?
基本上,Curve提供了两种类型的稳定币兑换池,即标准稳定币兑换池(Standard StableSwap Pool)和MetaPool。前者是一个完全的AMM,用于在不同稳定币之间创建跨市场交易 [1]。它是最广泛使用的池类型,例如Curve.3pool,它由DAI、USDC和USDT组成。然而,这种池无法隔离稳定币之间的风险,可能导致LP提供者遭受巨大损失。
因此,提出了MetaPool来解决这个问题。 正如Curve所述 [2],“它允许单一货币与另一个(基础)池中的所有货币进行兑换,而不会稀释其流动性”。它本质上是在稳定币和标准稳定币兑换池(由其他几种稳定币组成)的LP代币之间的兑换池。在我们的上下文中,我们将这两种类型的稳定币分别称为“池稳定币”和“底层稳定币”。
例如,此次事件的受害者之一是fUSDT与Nerve.3pool的LP代币(包括BUSD、USD和USDC)的MetaPool,该池的结构本质上是[fUSDT, LP代币(BUSD, USD, USDC)]。因此,fUSDT是池稳定币,而BUSD、USD和USDC是底层稳定币。

0x2.2 易受攻击代码的来源
Curve的MetaPool是用Vyper实现的。为了支持Solidity的开发,Saddle.Finance的开发团队用Solidity重写了代码。作为这个漏洞的最初来源,它已被 Synapse 和 Nerve 分别fork并采用。11月6日,Synapse遭受了攻击。

MetaPool中约有820万美元的资金被提取,但由于攻击者“愚蠢”的错误,并没有实际损失资金 [3]。
在此之后,Saddle.Finance采取了紧急行动,通过暂停所有MetaPool合约来确保其资金安全。然而,Nerve Bridge并未采取任何行动,这不可避免地导致了此次安全事件。
相关合约地址如下:
- MetaSwap: 0xd0fBF0A224563D5fFc8A57e4fdA6Ae080EbCf3D3
- SwapUtils: 0x02338Ee742ddCDe44488640F4edf1Aa947E670E7
0x3. 漏洞分析
在MetaPool中,有两个重要函数,即swap和swapUnderlying。具体来说,前者用于兑换LP代币和池稳定币,后者用于兑换池稳定币和底层稳定币。


然而,这两个函数实现不一致。如上两图所示。红框内的代码片段用于通过衡量LP代币的“虚拟价格”来调整LP代币的价值(随着更多费用收入而从基准值1增加)。而swap函数忽略了虚拟价格的影响,这意味着LP代币的价值会被低估。换句话说,可以兑换出更多的LP代币。
因此,通过首先用相应的LP代币收回底层稳定币的流动性,然后调用swapUnderlying函数兑换池稳定币,就有可能获得更多的池稳定币。
0x4. 攻击分析
我们将以示例交易为例来说明攻击过程。

图6显示攻击者采取了以下五个步骤来发动攻击:
- 步骤1:通过Fortube的闪电贷借入50,000 BUSD。
- 步骤2:从Ellipsis兑换50,000 BUSD为50,351 fUSDT。
- 步骤3:调用MetaSwap的
swap函数,以较大的滑点将50,351 fUSDT兑换为36,959 Nerve 3-LP。 - 步骤4:调用Nerve.3pool的
removeLiquidityOneCoin函数,使用(上一步收到的)LP代币移除BUSD流动性,即37,071 BUSD。 - 步骤5:调用MetaSwap的
swapUnderlying函数,将BUSD兑换为fUSDT,收到51,494 fUSDT。
攻击者重复执行上述五个步骤(约200+笔交易)来耗尽MetaPool的流动性,最终获利900 BNB。
有趣的是,攻击者仅仅采用了与Synapse事件相同的攻击方式,这并非实现目标的优化方法。此外,还可以通过更有效的方式发动攻击,例如应用优化参数一次性耗尽流动性。结果表明,攻击者可能并未完全理解此漏洞的根本原因。
参考
[1] https://curve.fi/files/stableswap-paper.pdf
[2] https://resources.curve.fi/lp/depositing/depositing-into-a-metapool/
[3] https://synapseprotocol.medium.com/11-06-2021-post-mortem-of-synapse-metapool-exploit-3003b4df4ef4
致谢:Hailin Wang, Lei Wu, Yajin Zhou @BlockSec
Twitter: https://twitter.com/BlockSecTeam



