Die Analyse des Sicherheitsvorfalls bei Nerve Bridge

Die Ähnlichkeiten zwischen den Vorfällen mit der Nervenbrücke und der Synapse untersuchen und den Modus Operandi des Angreifers beleuchten

Die Analyse des Sicherheitsvorfalls bei Nerve Bridge

0x.1 Vorwort

Am 15. November 2021 hat unser internes Überwachungssystem verdächtige Flashloan-Transaktionen auf BSC erfasst. Nach der Untersuchung stellten wir fest, dass es sich um einen Angriff auf Nerve Bridge handelte, der auch die MetaPools von fUSDT und UST betraf.

Abbildung 1: Ein Beispiel für eine Angriffstransaktion

Zum Zeitpunkt der Veröffentlichung hat der Angreifer die Liquidität von fUSDT und UST der Staking-Pools von Nerve erschöpft und einen Gewinn von 900 BNB erzielt.

Überraschenderweise stellten wir fest, dass der anfällige Code von Saddle.Finance abgezweigt wurde, was bereits am 6. November 2021 zu einem Verlust von 800 Millionen US-Dollar bei Synapse Bridge geführt hatte. Konkret liegt die Ursache der Schwachstelle in der inkonsistenten Implementierung der Berechnung des Umtauschbetrags von Tokens in verschiedenen Bibliotheken.

Es gibt jedoch KEINE öffentlich zugänglichen Berichte, die diesen Sicherheitsvorfall analysieren. Daher zielen wir in diesem Blog darauf ab, eine umfassende Analyse bereitzustellen, die den Mechanismus des Projekts, die Schwachstelle und den Angriff umfasst.

0x2. Hintergrund

0x2.1 Was ist MetaPool?

Grundsätzlich bietet Curve zwei Arten von Stablecoin-Swap-Pools an, nämlich Standard StableSwap Pool und MetaPool. Ersteres ist ein vollständig AMM, um Cross-Markets zwischen verschiedenen Stablecoins zu schaffen [1]. Es ist der am weitesten verbreitete Pool-Typ, z. B. Curve.3pool, der aus DAI, USDC und USDT besteht. Dieser Pool kann jedoch das Risiko zwischen Stablecoins nicht isolieren, was zu großen Verlusten für LP-Anbieter führen kann.

Daher wird MetaPool vorgeschlagen, um dieses Problem zu lösen. Wie von Curve angegeben [2], "ermöglicht er die Bündelung einer einzelnen Münze mit allen Münzen in einem anderen (Basis-)Pool, ohne deren Liquidität zu verwässern". Es handelt sich im Wesentlichen um einen Swap-Pool zwischen einem Stablecoin und einem LP-Token eines Stand StableSwap-Pools (der aus mehreren anderen Stablecoins besteht). In unserem Kontext nennen wir diese beiden Arten von Stablecoins pool stablecoin und underlying stablecoin.

Ein Opfer dieses Vorfalls ist zum Beispiel nur der MetaPool von fUSDT und dem LP-Token von Nerve.3pool (einschließlich BUSD, USD und USDC), und die Struktur dieses Pools ist im Wesentlichen [fUSDT, LP-Token von (BUSD, USD, USDC)]. Somit ist fUSDT der Pool-Stablecoin, während BUSD, USD und USDC die zugrundeliegenden Stablecoins sind.

Abbildung 2: Nerve.3pool

0x2.2 Quelle des anfälligen Codes

Curve's MetaPool ist in Vyper implementiert. Um die Entwicklung von Solidity zu unterstützen, hat das Entwicklungsteam von Saddle.Finance den Code in Solidity neu geschrieben. Da es sich um den Anfang dieser Schwachstelle handelt, wurde er von Synapse und Nerve abgezweigt und übernommen. Am 6. November wurde Synapse angegriffen.

Abbildung 3: Angriffstransaktionen, die auf Synapse abzielen

Rund 8,2 Millionen US-Dollar wurden aus dem MetaPool abgezogen, wobei aufgrund eines "dummen" Fehlers des Angreifers keine Gelder tatsächlich verloren gingen [3].

Danach ergriff Saddle.Finance eine Notfallmaßnahme, um die Sicherheit ihrer Gelder zu gewährleisten, indem alle MetaPool-Verträge pausiert wurden. Nerve Bridge unternahm jedoch keine Maßnahmen, was unweigerlich zu diesem Sicherheitsvorfall führte.

Die relevanten Vertragsadressen sind im Folgenden aufgeführt:

  • MetaSwap: 0xd0fBF0A224563D5fFc8A57e4fdA6Ae080EbCf3D3
  • SwapUtils: 0x02338Ee742ddCDe44488640F4edf1Aa947E670E7

0x3. Schwachstellenanalyse

In MetaPool gibt es zwei wichtige Funktionen, nämlich swap und swapUnderlying. Insbesondere wird ersteres zum Tauschen des LP-Tokens und des Pool-Stablecoins verwendet, während letzteres zum Tauschen des Pool-Stablecoins und der zugrundeliegenden Stablecoins verwendet wird.

swap: _calculateSwap Funktion
swapUnderlying: _calculateSwapUnderlying Funktion

Die beiden Funktionen werden jedoch inkonsistent implementiert. Wie in den obigen beiden Abbildungen gezeigt. Der Codeausschnitt im roten Rechteck dient zur Anpassung des Wertes des LP-Tokens durch Messung des "virtuellen Preises" eines LP-Tokens (der von einem Basiswert von 1 steigt, wenn mehr Gebühren anfallen). Während die swap-Funktion die Auswirkungen des virtuellen Preises ignoriert, was bedeutet, dass der Wert des LP-Tokens unterschätzt wird. Mit anderen Worten, mehr LP-Tokens könnten ausgetauscht werden.

Infolgedessen ist es möglich, mehr Pool-Stablecoins zu generieren, indem zunächst die Liquidität der zugrundeliegenden Stablecoins mit dem entsprechenden LP-Token zurückgeholt und dann Pool-Stablecoins durch Aufruf der swapUnderlying-Funktion getauscht werden.

0x4. Angriffsanalyse

Wir nehmen die Beispieltransaktion als Beispiel, um den Angriff zu veranschaulichen.

Abbildung 6: Die fünf Angriffsschritte

Abbildung 6 zeigt, dass der Angreifer die folgenden fünf Schritte unternommen hat, um den Angriff zu starten:

  • Schritt 1: Ausleihen von 50.000 BUSD über Flashloan von Fortube
  • Schritt 2: Tauschen von 50.000 BUSD gegen 50.351 fUSDT von Ellipsis.
  • Schritt 3: Aufruf der swap-Funktion von MetaSwap, um 50.351 fUSDT gegen 36.959 Nerve 3-LP mit einem relativ großen Slippage zu tauschen.
  • Schritt 4: Aufruf der removeLiquidityOneCoin-Funktion von Nerve.3pool mit den LP-Tokens (im vorherigen Schritt erhalten), um die Liquidität von BUSD, d. h. 37.071 BUSD, zu entfernen.
  • Schritt 5: Aufruf der swapUnderlying-Funktion von MetaSwap, um BUSD gegen fUSDT zu tauschen und 51.494 fUSDT zu erhalten.

Der Angreifer führte die obigen fünf Schritte wiederholt aus (rund 200+ Transaktionen), um die Liquidität des MetaPools zu erschöpfen, und erzielte schließlich 900 BNB.

Interessanterweise hat der Angreifer denselben Ansatz wie beim Synapse-Vorfall übernommen, der keine optimierte Methode zur Erreichung des Ziels darstellt. Alternativ ist es möglich, Angriffe effizienter durchzuführen, z. B. durch Anwendung optimierter Parameter, um die Liquidität in einer Transaktion abzuziehen. Das Ergebnis deutet darauf hin, dass der Angreifer die Ursache dieser Schwachstelle möglicherweise NICHT vollständig verstanden hat.

Referenz

[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

Mit freundlicher Genehmigung: Hailin Wang, Lei Wu, Yajin Zhou @BlockSec

Twitter: https://twitter.com/BlockSecTeam

Sign up for the latest updates