MetaPool-Schwachstelle auf zwei Wegen ausnutzen (Nerve Bridge / Saddle Finance): Was Sie sehen, ist nicht, was Sie bekommen

Wiederholte Ausnutzung von MetaPools Schwachstelle in Nerve Bridge und Saddle Finance – anhaltende Krypto-Sicherheitslücke aufgedeckt.

MetaPool-Schwachstelle auf zwei Wegen ausnutzen (Nerve Bridge / Saddle Finance): Was Sie sehen, ist nicht, was Sie bekommen

Am 30. April 2022 nutzte ein Angreifer dieselbe Schwachstelle im Nerve Bridge Incident aus, um Saddle Finance anzugreifen. Insgesamt waren 4.900 Ether von dem Angriff betroffen. Glücklicherweise konnten 1.360 Ether davon von uns erfolgreich gerettet werden. Eine detaillierte Beschreibung dieses Vorfalls finden Sie im offiziellen Post Mortem.

Obwohl dieselbe Schwachstelle ausgenutzt wurde, unterscheidet sich die Angriffsmethode unterschiedlich von der vorherigen. Da die neue Angriffsmethode nicht so einfach ist, wie man erwarten könnte, sind wir der Meinung, dass sie mehr Aufwand für eine tiefgehende Untersuchung verdient. In diesem Bericht erläutern wir zunächst kurz die Schwachstelle und überprüfen dann die ursprüngliche Angriffsmethode des Nerve Bridge Incidents. Anschließend konzentrieren wir uns auf den Saddle Finance Incident, indem wir den Angriffsprozess sezieren, um die neue Angriffsmethode zu entmystifizieren.

0x1. Über die eingesetzten Smart Contracts

Die relevanten Smart-Contract-Adressen sind die folgenden:

  • Der betroffene MetaSwap Smart Contract: 0x824dcd7b044d60df2e89b1bb888e66d8bcf41491
  • Der anfällige MetaSwapUtils Smart Contract: 0x88Cc4aA0dd6Cf126b00C012dDa9f6F4fd9388b17

Es ist erwähnenswert, dass der gezeigte Code des MetaSwapUtils Smart Contracts, der mit dem verifizierten MetaSwap Smart Contract verbunden ist, NICHT mit dem eingesetzten MetaSwapUtils Smart Contract äquivalent ist, dessen Adresse in den Settings wie folgt angegeben ist:

Daher lassen Sie sich nicht von diesen beiden MetaSwapUtils Smart Contracts verwirren :)

0x2. Schwachstellenanalyse

Der anfällige Smart Contract gehört zu MetaPool, der im vorherigen Blog detailliert besprochen wurde. Kurz gesagt, MetaPool wurde ursprünglich von Curve entwickelt, um es zu ermöglichen, eine einzelne Münze mit allen Münzen in einem anderen (Basis-)Pool zu bündeln, ohne die Liquidität zu verwässern. Es handelt sich im Wesentlichen um einen Pool, der aus einem Stable-Coin und einem LP-Token des Basis-Pools besteht, der mehrere andere Stable-Coins enthält. Es gibt eine Bedenken hinsichtlich des MetaPool-Designs, nämlich dass der MetaPool im Grunde ein Stable-Coin-Pool ist, der die Preise für Stable-Coins aufrechterhält, während der LP-Token eines Basis-Stable-Coin-Pools NICHT ein Stable-Coin ist.

Tatsächlich kann der Preis eines LP-Tokens eines Basis-Stable-Coin-Pools durch Aufrufen der getVirtualPrice-Funktion des Basis-Pools ermittelt werden, und sein Preis steigt stetig mit der Akkumulation von Gebühren, die vom Basis-Pool erhoben werden. Um dies zu bewältigen, skaliert MetaPool die Reserve des LP-Tokens hoch, bevor der Preis berechnet wird, wie unten gezeigt.

Dementsprechend wird, wenn ein Benutzer einen LP-Token gegen einen Stable-Coin tauscht, der Betrag des LP-Tokens vor der Preisberechnung hochskaliert. Alternativ wird, wenn ein Benutzer einen Stable-Coin gegen einen LP-Token tauscht, der berechnete Betrag des LP-Tokens vor der Übertragung und Buchhaltung herunterskaliert.

Der obige Code-Schnipsel der swapUnderlying-Funktion wird verwendet, um zwischen dem Stable-Coin im MetaPool und den Stable-Coins im Basis-Pool zu tauschen. Wie in den beiden roten Rechtecken gezeigt, skaliert die Funktion den Betrag des eingehenden LP-Tokens hoch und den Betrag des ausgetauschten LP-Tokens herunter.

Die Implementierung der swap-Funktion ist jedoch inkonsistent mit der der swapUnderlying-Funktion. Insbesondere ist die Hauptursache für die Schwachstelle die fehlerhafte Berechnung in der swap-Funktion (d.h. der _calculateSwap-Funktion), die den Betrag des LP-Tokens nicht richtig herunter- und hochskaliert. Wie unten gezeigt, zeigt die linke Seite den anfälligen Code von MetaPool, während die rechte Seite die korrigierte Version zeigt.

Der Angreifer des Nerve Bridge Incidents nutzte die Inkonsistenz zwischen der swap-Funktion und der swapUnderlying-Funktion aus. (Beachten Sie, dass Nerve Bridge ein Fork-Projekt von Saddle Finance ist.) Danach hat Saddle Finance die Schwachstelle behoben und die neue Version (d.h. V2) der MetaSwapUtils-Bibliothek sofort neu eingesetzt.

Unglücklicherweise wurde der sUSD V2 MetaPool auf Ethereum aus unbekannten Gründen immer noch mit der alten und anfälligen MetaSwapUtils-Bibliothek eingesetzt. Infolgedessen wurde diese Schwachstelle am 30. April erneut erfolgreich von einem Angreifer ausgenutzt. Interessanterweise wurde im Gegensatz zur beim Nerve Bridge Incident verwendeten Angriffsmethode eine andere Methode angewendet, um den anfälligen MetaPool anzugreifen.

0x3. Die ursprüngliche Angriffsmethode des Nerve Bridge Incidents

Wir verwenden die folgende Abbildung (siehe vorheriger Blog) erneut, um die ursprüngliche Angriffsmethode zu überprüfen.

Da die anfällige swap-Funktion den Betrag des ausgetauschten LP-Tokens (Nerve 3-LP) nicht herunterskaliert, ist der ausgetauschte Betrag (36.959) in Schritt 3 größer als normal. Anschließend ruft der Angreifer die swapUnderlying-Funktion (ohne Schwachstelle) auf, um die 36.959 Nerve 3-LP (in Schritt 4 und 5) gegen 51.494 fUSDT zu verkaufen, was einen Gewinn von 1.143 fUSDT erzielt.

Der Gewinn kann vernünftigerweise wie folgt erklärt werden: Der Angreifer erhält in Schritt 3 mehr Nerve 3-LP und verkauft diese dann zu einem "normalen" Preis, indem er die Inkonsistenz zwischen der swap-Funktion und der swapUnderlying-Funktion ausnutzt.

0x4. Die neue Angriffsmethode des Saddle Finance Incidents

Der Angreifer des jüngsten Saddle Finance Incidents verwendete eine andere Methode, um dieselbe anfällige swap-Funktion anzugreifen, ohne die swapUnderlying-Funktion einzubeziehen. Hier nehmen wir eine Angriffstransaktion als konkretes Beispiel, um den Prozess zu veranschaulichen.

Intuitiv scheint es, dass kein Gewinn erzielt werden sollte, da jede Implikation von Schritt 3 und Schritt 4 ausgeglichen würde. Insbesondere in Schritt 3 könnte der Angreifer aufgrund der fehlenden Herunterskalierung des ausgetauschten LP-Tokens (d.h. saddleUSD) mehr saddleUSD tauschen. In Schritt 4 würde der Angreifer jedoch zwangsläufig WENIGER sUSD tauschen, da die anfällige swap-Funktion den Betrag des eingehenden saddleUSD nicht hochskaliert, bevor der Preis berechnet wird.

Wie in der obigen Abbildung gezeigt, hat der Angreifer jedoch durch das Paar von Tauschvorgängen in Schritt 3 und Schritt 4 2.059.771 sUSD Gewinn erzielt. Um den Grund für den Gewinn zu ermitteln, müssen wir uns in den Preismechanismus vertiefen und eine eingehende Untersuchung durchführen, um den Angriffsprozess zu verstehen.

0x4.1 Der Preismechanismus

Der MetaPool von Saddle Finance erbt die Preisformel von Curve:

Der Graph der Funktion (wenn n gleich 2 ist) ist als blaue Kurve in der folgenden Abbildung dargestellt. (Das Design der Formel finden Sie im Curve StableSwap Whitepaper.)

Hier stellt sich die Frage: Wie berechnet der MetaPool den Preis für jeden Tausch unter Verwendung dieser Formel?

Nehmen wir an, n ist 2 und ein Benutzer tauscht dx0 Token0 gegen dx1 Token1. Wir können den Berechnungsprozess für dx1 simulieren. Bei jedem Tausch kann A als konstant behandelt werden, und D ist die einzige Variable, die die Preiskurve beeinflussen kann. Tatsächlich erhöht sich D mit der Akkumulation der vom Pool erhobenen Gebühren. Insbesondere kann der Berechnungsprozess in den folgenden drei Schritten zusammengefasst werden:

  • Schritt I: Setzen Sie die aktuellen Reserven des Pools (x0 und x1) in die Formel ein, um das aktuelle D zu berechnen, das die aktuelle Preiskurve bestimmt.
  • Schritt II: Erhöhen Sie x0 um dx0 und setzen Sie das aktuelle D und x0 in die Formel ein, um das neue x1 zu berechnen.
  • Schritt III: Dann ist dx1 die Differenz zwischen dem neuen x1 und dem alten x1.

Wenn Token0 der LP-Token eines Basis-Pools ist, wird Schritt II wie folgt durchgeführt:

Hier ist baseVirtualPrice/1e18 während des Angriffs etwa 1,0033. Alternativ, wenn der Token der LP-Token eines Basis-Pools ist, wird Schritt III wie folgt durchgeführt:

Um zu verstehen, wie D die Preiskurve beeinflusst, verwenden wir ebenfalls ein Beispiel, um es zu beschreiben. Nehmen wir an, ein Benutzer tauscht zuerst dx0 Token0 gegen dx1 Token1 und tauscht dann dx1 Token1 gegen dx0' Token0.

Wie in der obigen Abbildung gezeigt, erhöht Schritt ② die Gebühren für den ersten Tausch, wodurch D zu einer Verschiebung der Preiskurve nach oben führt (von der schwarzen zur blauen Kurve). Darüber hinaus beschreibt die Abbildung klar, warum dx0' kleiner als dx0' ist.

0x4.2 Analyse des Angriffs

Um den Grund für den Gewinn zu analysieren, haben wir die anfälligen und korrigierten MetaSwapUtils-Bibliotheken lokal bereitgestellt und den Zustand des betroffenen Pools zu diesem Zeitpunkt verwendet, um den Angriff zu simulieren. Darüber hinaus haben wir bei dieser Simulation auch einige Werte aufgezeichnet, die zum Verständnis des Angriffsprozesses hilfreich sind, d.h. A ist 10.000, x_sUSD ist 8.130.463, x_saddleUSD ist 9.688.608 und D ist zu diesem Zeitpunkt 17.818.392.

Die obige Abbildung beschreibt den Prozess des gewinnbringenden Paares von Tauschvorgängen:

  • Tausch-I: tausche 14.800.272 sUSD gegen 9.657.586 saddleUSD
  • Tausch-II: tausche 9.657.586 saddleUSD gegen 16.860.043 sUSD

Konkret kann Tausch-I in die folgenden zwei Schritte unterteilt werden:

  • ①: Tausche 14.800.272 sUSD gegen 9.625.654 saddleUSD. Jetzt erhöht sich D auf 17.931.435 (aufgrund der erhobenen Gebühren).
  • ②: Da der anfällige MetaPool den Betrag des ausgetauschten saddleUSD nicht herunterskaliert, verliert der Pool 31.932 saddleUSD. Die Verluste verringern D auf 15.736.195, was die Preiskurve weiter nach unten verschiebt (von der schwarzen zur grauen Kurve).

Ebenso kann Tausch-II ebenfalls in zwei Schritte unterteilt werden:

  • ③: Da die Preiskurve nach unten verschoben ist, kann derselbe Betrag von 9.625.654 saddleUSD 16.891.906 sUSD tauschen, was weit mehr ist als die Kosten: 14.800.272 sUSD.
  • ④: Da der anfällige MetaPool den Betrag des eingehenden saddleUSD nicht hochskaliert, bevor der Preis berechnet wird, verbleiben 31.863 sUSD im MetaPool, was die Preiskurve nach oben verschiebt (von der grauen zur blauen Kurve). Dennoch erzielt das Paar von Tauschvorgängen einen Gewinn von 2.059.771 sUSD.

Offensichtlich erläutert die obige Analyse klar, warum der Angreifer mit der neuen Angriffsmethode den Gewinn erzielen konnte. Außerdem scheint die ursprüngliche Angriffsmethode aufgrund des in Tausch-II verbleibenden sUSD im MetaPool effizienter zu sein als die neue. Natürlich könnte der Angreifer mehrere Angriffe starten, um den Pool leerzuräumen, was in der Praxis beobachtet wurde.

0x5. Einige Erkenntnisse

Die Untersuchung legt nahe, dass die Hauptursache für die Gewinne in den beiden Vorfällen dieselbe ist. Insbesondere verringert der erste Tausch (der gegen den LP-Token tauscht) D des anfälligen MetaPools, was dessen Preiskurve weiter nach unten verschiebt. Diese Verschiebung wirkt sich stark auf die nachfolgende Preisbildung aus und ist der Hauptgrund für den nachfolgenden Gewinn.

Über BlockSec

BlockSec ist ein wegweisendes Blockchain-Sicherheitsunternehmen, das 2021 von einer Gruppe weltweit renommierter Sicherheitsexperten gegründet wurde. Das Unternehmen setzt sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufkommenden Web3-Welt ein, um deren Massenadoption zu fördern. Zu diesem Zweck bietet BlockSec Dienstleistungen für die Prüfung von Smart Contracts und EVM-Chains, die Phalcon-Plattform für die sichere Entwicklung und proaktive Bedrohungsabwehr, die MetaSleuth-Plattform für die Verfolgung und Untersuchung von Geldern sowie die MetaDock-Erweiterung für Web3-Entwickler, die effizient im Krypto-Bereich surfen.

Bis heute hat das Unternehmen über 300 angesehene Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren, darunter Matrix Partners, Vitalbridge Capital und Fenbushi Capital, zweistellige Millionenbeträge erhalten.

Offizielle Website: https://blocksec.com/ Offizieller Twitter-Account: https://twitter.com/BlockSecTeam

Sign up for the latest updates