Am 30. April 2022 nutzte ein Angreifer dieselbe Schwachstelle wie beim Nerve Bridge Vorfall, um Saddle Finance anzugreifen. Insgesamt waren 4.900 Ether vom Angriff betroffen. Glücklicherweise konnten 1.360 Ether davon von uns gerettet werden. Eine detaillierte Beschreibung dieses Vorfalls finden Sie im offiziellen Post-Mortem.
Obwohl dieselbe Schwachstelle ausgenutzt wurde, unterscheidet sich die Angriffsmethode von der vorherigen. Da die neue Angriffsmethode nicht so einfach ist, wie man vielleicht erwartet, glauben wir, dass sie eine eingehendere Untersuchung verdient. In diesem Bericht illustrieren wir zunächst kurz die Schwachstelle und überprüfen dann die ursprüngliche Angriffsmethode des Nerve Bridge Vorfalls. Danach konzentrieren wir uns auf den Saddle Finance Vorfall, indem wir den Angriffsprozess sezieren, um die neue Angriffsmethode zu erläutern.
0x1. Über die bereitgestellten Verträge
Die relevanten Vertragsadressen sind die folgenden:
- Der betroffene MetaSwap Vertrag: 0x824dcd7b044d60df2e89b1bb888e66d8bcf41491
- Der anfällige MetaSwapUtils Vertrag: 0x88Cc4aA0dd6Cf126b00C012dDa9f6F4fd9388b17
Es ist erwähnenswert, dass der gezeigte Code des MetaSwapUtils-Vertrags, der mit dem verifizierten MetaSwap-Vertrag verknüpft ist, NICHT dem bereitgestellten MetaSwapUtils-Vertrag entspricht, dessen Adresse in den Settings angegeben ist, wie folgt:
Damit Sie sich nicht mit diesen beiden MetaSwapUtils-Verträgen verwirren!
0x2. Schwachstellenanalyse
Der anfällige Vertrag gehört zu MetaPool, der bereits im vorherigen Blog ausführlich 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 verdünnen. Es handelt sich im Wesentlichen um einen Pool, der aus einem Stablecoin und einem LP-Token des Basispools besteht, der mehrere andere Stablecoins enthält. Es gibt eine Bedenken hinsichtlich des MetaPool-Designs, nämlich dass der MetaPool im Grunde ein Stablecoin-Pool ist, der die Preise für Stablecoins aufrechterhält, während der LP-Token eines Basis-Stablecoin-Pools KEIN Stablecoin ist.
Tatsächlich kann der Preis eines LP-Tokens eines Basis-Stablecoin-Pools durch Aufruf der getVirtualPrice-Funktion des Basispools ermittelt werden, und sein Preis steigt stetig mit der Ansammlung von Gebühren, die vom Basispool erhoben werden.
Um dies zu handhaben, skaliert MetaPool die LP-Token-Reserve hoch, bevor der Preis berechnet wird, wie unten gezeigt.
Entsprechend wird bei einem Tausch eines LP-Tokens gegen einen Stablecoin der Betrag des LP-Tokens skaliert, bevor der Preis berechnet wird. Alternativ wird bei einem Tausch eines Stablecoins gegen einen LP-Token der berechnete Betrag des LP-Tokens skaliert, bevor er übertragen und verbucht wird.
Der obige Code-Schnipsel der swapUnderlying-Funktion wird verwendet, um zwischen dem Stablecoin im MetaPool und den Stablecoins im Basispool zu tauschen. Wie in den beiden roten Rechtecken gezeigt, skaliert die Funktion den Betrag des eingehenden LP-Tokens nach oben und den Betrag des ausgetauschten LP-Tokens nach unten.
Die Implementierung der swap-Funktion ist jedoch inkonsistent mit der der swapUnderlying-Funktion. Insbesondere liegt die Hauptursache der Schwachstelle in der fehlerhaften Berechnung der swap-Funktion (d. h. der _calculateSwap-Funktion), die den Betrag des LP-Tokens nicht richtig nach unten und oben skaliert. Wie unten gezeigt, zeigt die linke Seite den anfälligen Code von MetaPool, während die rechte Seite die behobene Version zeigt.
Der Angreifer des Nerve Bridge Vorfalls 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 bereitgestellt.
Unglücklicherweise wurde der sUSD V2 MetaPool auf Ethereum aus unbekannten Gründen immer noch mit der alten und anfälligen MetaSwapUtils-Bibliothek bereitgestellt. Daher wurde diese Schwachstelle am 30. April erneut erfolgreich von einem Angreifer ausgenutzt. Interessanterweise wurde im Gegensatz zur Angriffsmethode des Nerve Bridge Vorfalls ein anderer Weg gewählt, um den anfälligen MetaPool anzugreifen.
0x3. Die ursprüngliche Angriffsmethode des Nerve Bridge Vorfalls
Wir verwenden die folgende Abbildung wieder (siehe vorheriger Blog), um die ursprüngliche Angriffsmethode zu überprüfen.
Da die anfällige swap-Funktion den Betrag des ausgetauschten LP-Tokens (Nerve 3-LP) nicht nach unten skaliert, 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) für 51.494 fUSDT zu verkaufen, was einen Gewinn von 1.143 fUSDT erzielt.
Der Gewinn kann vernünftigerweise erklärt werden als: Der Angreifer sammelt in Schritt 3 mehr Nerve 3-LP und verkauft sie 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 Vorfalls
Der Angreifer des jüngsten Saddle Finance Vorfalls nutzte 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 illustrieren.
Intuitiv scheint es, dass kein Gewinn entstehen sollte, da jede Implikation von Schritt 3 und Schritt 4 ausgeglichen würde.
Insbesondere in Schritt 3 konnte der Angreifer mehr saddleUSD tauschen, da die Skalierung nach unten des ausgetauschten LP-Tokens (d. h. saddleUSD) fehlte.
In Schritt 4 würde der Angreifer jedoch unweigerlich WENIGER sUSD tauschen, da die anfällige swap-Funktion den Betrag des eingehenden saddleUSD nicht nach oben skaliert, bevor der Preis berechnet wird.
Wie in der obigen Abbildung gezeigt, profitierte der Angreifer jedoch durch das Paar von Tauschvorgängen in Schritt 3 und Schritt 4 von 2.059.771 sUSD. Um den Grund für den Gewinn zu ermitteln, müssen wir uns mit dem Preisbildungsmechanismus befassen und eine eingehende Untersuchung durchführen, um den Angriffsprozess zu verstehen.
0x4.1 Der Preisbildungsmechanismus
Der MetaPool von Saddle Finance erbt die Preisformel von Curve:
Die Abbildung der Funktion (wenn n gleich 2 ist) ist als blaue Kurve in der folgenden Abbildung dargestellt. (Der Entwurf der Formel ist im Curve StableSwap Whitepaper zu finden.)
Hier stellt sich die Frage: Wie berechnet der MetaPool den Preis für jeden Tausch mit 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
wird D mit der Ansammlung von Gebühren erhöht, die vom Pool erhoben werden. 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
Dzu berechnen, das die aktuelle Preiskurve bestimmt. - Schritt II: Erhöhen Sie x0 um dx0 und setzen Sie das aktuelle
Dund 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 Basispools ist, dann wird Schritt II wie folgt ausgeführt:
Hier ist baseVirtualPrice/1e18 während des Angriffs etwa 1,0033. Alternativ, wenn das Token der LP-Token eines Basispools ist, dann wird Schritt III wie folgt ausgeführt:
Um zu verstehen, wie D die Preiskurve beeinflusst, verwenden wir ebenfalls ein Beispiel, um es zu beschreiben.
Sagen wir, ein Benutzer tauscht zuerst dx0 Token0 gegen dx1 Token1 und tauscht dann dx1 Token1 gegen dx0' Token0.
Wie in der obigen Abbildung gezeigt, da Schritt ② Gebühren für den ersten Tausch erhebt, wird D erhöht, um die Preiskurve nach oben zu verschieben (von der schwarzen Kurve zur blauen).
Darüber hinaus beschreibt die Abbildung klar den Grund, warum dx0' kleiner ist als dx0'.
0x4.2 Analyse des Angriffs
Um den Grund für den Gewinn zu analysieren, haben wir die anfälligen und behobenen 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 helfen können, den Angriffsprozess zu verstehen, 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 profitablen Tauschpaares:
- Tausch-I: Tausch von 14.800.272 sUSD gegen 9.657.586 saddleUSD
- Tausch-II: Tausch von 9.657.586 saddleUSD gegen 16.860.043 sUSD
Speziell Tausch-I kann in die folgenden zwei Schritte unterteilt werden:
- ①: Tausch von 14.800.272 sUSD gegen 9.625.654 saddleUSD. Nun wird
Dals 17.931.435 erhöht (aufgrund der erhobenen Gebühren). - ②: Da der anfällige MetaPool den Betrag des ausgetauschten saddleUSD nicht nach unten skaliert, verliert der Pool 31.932 saddleUSD. Die Verluste reduzieren
Dauf 15.736.195, was die Preiskurve weiter nach unten verschiebt (von der schwarzen Kurve zur grauen).
Ähnlich kann Tausch-II ebenfalls in zwei Schritte unterteilt werden:
- ③: Da die Preiskurve nach unten verschoben ist, können dieselben 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 nach oben skaliert, bevor der Preis berechnet wird, bleiben 31.863 saddleUSD im MetaPool übrig, was die Preiskurve nach oben verschiebt (von der grauen Kurve zur blauen). Nichtsdestotrotz profitiert das Tauschpaar immer noch von 2.059.771 sUSD.
Offensichtlich erläutert die obige Analyse klar, warum der Angreifer durch die neue Angriffsmethode Profit erzielen konnte. Darüber hinaus scheint die ursprüngliche Angriffsmethode aufgrund des in Tausch-II verbleibenden sUSD im MetaPool effizienter zu sein als die neue. Selbstverständlich könnte der Angreifer mehrere Angriffe starten, um den Pool leerzuräumen, was in der Praxis beobachtet wurde.
0x5. Einige Schlussfolgerungen
Die Untersuchung legt nahe, dass die Hauptursache für die Gewinne in beiden Vorfällen dieselbe ist. Insbesondere reduziert der erste Tausch (der gegen den LP-Token getauscht wird) den D des anfälligen MetaPools, was seine Preiskurve weiter nach unten verschiebt. Diese Verschiebung beeinflusst die nachfolgende Preisbildung erheblich und ist der Hauptgrund für den anschließenden Gewinn.
Über BlockSec
BlockSec ist ein führendes Blockchain-Sicherheitsunternehmen, das 2021 von einer Gruppe weltweit renommierter Sicherheitsexperten gegründet wurde. Das Unternehmen engagiert sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufstrebenden Web3-Welt, um deren Massenadaption 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 Sicherheitsentwicklung und proaktive Bedrohungsabwehr, die MetaSleuth-Plattform für die Nachverfolgung von Geldern und Untersuchungen sowie die MetaDock-Erweiterung für Web3-Entwickler, die sich effizient in der Krypto-Welt bewegen.
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



