Analyse eines Sicherheitsvorfalls bei Indexed Finance

Sichere Entwicklungsstrategien in Move lernen und eine Aptos-App mit diesem Leitfaden erstellen.

Analyse eines Sicherheitsvorfalls bei Indexed Finance

0x.1 Hintergrund

Am 15. Oktober 2021 um 02:38 Uhr (UTC+8) erkannte unser internes Überwachungssystem verdächtige Flashloan-Transaktionen:

Unser Überwachungssystem

Nach der Untersuchung stellten wir fest, dass es sich um einen Preismanipulationsangriff auf Indexed Finance handelte. Konkret startete der Angreifer den Angriff, indem er die fehlerhafte Formel (die zur Berechnung des Preises verwendet wird) dieses Projekts ausnutzte und einen Gewinn von 16 Millionen US-Dollar erzielte.

Es gab bereits einige Diskussionen in den sozialen Medien, während das Projekt einen offiziellen Post-Mortem veröffentlicht hat (Indexed Attack Post-Mortem. Bestehende Analysen geben jedoch kein vollständiges Verständnis dieses Sicherheitsvorfalls. Daher zielt dieser Blog darauf ab, eine umfassende Analyse zu liefern, einschließlich des Mechanismus des Projekts, der Schwachstelle, des Angriffs und des Gewinns.

0x1.1 Relevante Vertragsadressen

  • MarketCapSqrtController: 0x120c6956d292b800a835cb935c9dd326bdb4e011

  • DEFI5: 0xfa6de2697d59e88ed7fc4dfe5a33dac43565ea41

  • CC10: 0x17ac188e09a7890a1844e5e65471fe8b0ccfadf3

0x1.2 Angriffstransaktionen

  • Angriff TX-I: 0x44aad3b853866468161735496a5d9cc961ce5aa872924c5d78673076b1cd95aa

  • Angriff TX-II: 0xbde4521c5ac08d0033019993b0e7e1d29b1457e80e7743d318a3c27649ca4417

0x2. Mechanismus von Indexed Finance

Um die Schwachstelle/den Angriff besser zu verstehen, verwenden wir DEFI5 (d. h. den vom Angreifer gehackten Pool), um den Mechanismus von Indexed Finance zu demonstrieren.

0x2.1 Bindungstoken

DEFI5 wurde entwickelt, um den Handelsdienst für die Top-5-Token von DeFi-Projekten auf Ethereum anzubieten. Insbesondere aktualisiert Indexed Finance die Token-Ranglisten basierend auf ihrer Marktkapitalisierung über MarketCapSqrtController. Da sich die Reihenfolge der Top-5-Token im Laufe der Zeit ändern kann, kann die Anzahl der vom DEFI5-Pool verwendeten Token größer als 5 sein, wie im folgenden Code gezeigt:

Abbildung 1

Abbildung 1 zeigt, dass DEFI5, um einen neuen Token zu binden, die Funktion _bind auslösen muss, die von der Funktion reindexTokens aufgerufen wird und nur von der Funktion reindexPools von MarketCapSqrtController aufgerufen werden kann:

Abbildung 2

Abbildung 2 zeigt, dass MarketCapSqrtController zuerst Token-Informationen (einschließlich TotalSupply und Preis) von den Märkten abruft und dann die Rangliste basierend auf ihrer Marktkapitalisierung berechnet. Beim Aufrufen der Funktion reindexPool werden die Adressen der Top-Token als Argumente übergeben, um die Funktion reindexTokens aufzurufen. Beachten Sie, dass der neu hinzugefügte Token an DEFI5 gebunden wird, ohne die ursprünglichen Token von DEFI5 zu ersetzen.

0x2.2 Was kommt als Nächstes?

Nach der Token-Bindung muss DEFI5 eine Variable namens ready (die den Token-Status angibt) auf true setzen, um den Handel zu ermöglichen:

Abbildung 3

Laut der Code-Logik kann ready, abgesehen von der Vertragsinitialisierung, nur in der Funktion gulp gesetzt werden. Wie in Abbildung 3 gezeigt, geschieht dies, wenn die Token-Bilanz in DEFI5 größer oder gleich _minimumBalances ist. Gleichzeitig wird das anfängliche Token-Gewicht (d. h. denorm) anhand der folgenden Formel berechnet:

0x3. Schwachstellenanalyse

Der anfällige Code gehört zur Funktion updateMinimumBalance von MarketCapSqrtController.

Abbildung 4

Wie in Abbildung 4 gezeigt, kann updateMinimumBalance das minimumBalance eines Tokens, dessen ready falsch ist, auf 1/100 des poolValue ändern. Die Berechnung von poolValue ist der Schlüssel zur Schwachstelle.

Abbildung 5

Die Berechnung in Abbildung 5 implementiert lediglich die folgende Formel:

In dieser Formel gibt es jedoch zwei potenzielle Probleme:

  • Verwendung der Liquidität eines Tokens zur Schätzung des Werts des gesamten Pools;
  • die Gewichtungen des Pools (_totalWeight) und des Tokens (token.denorm) werden durch die Änderung der Liquidität nicht beeinflusst. Tatsächlich werden sie von der Marktkapitalisierung externer Märkte beeinflusst. Außerdem ist ihre Änderung durch den Zeitraum begrenzt, d. h. Erhöhung oder Verringerung um 1 % pro Stunde.

Kurz gesagt, der Angreifer kann poolValue durch die Verwendung von Flashloans manipulieren, um sofort eine große Änderung der Liquidität eines Tokens zu bewirken, während die Gewichtungen des Pools und des Tokens entsprechend unverändert bleiben. Dadurch kann das minimumBalance des Tokens (dessen ready falsch ist) manipuliert werden, um den Preismanipulationsangriff zu starten.

0x4. Angriffsanalyse

Der Angriff besteht aus den folgenden 9 Schritten:

Schritt 1: Aufrufen der Funktion reindexPool, um SUSHI zu binden. Vor dem Aufruf befinden sich 6 Token im DEFI5-Pool, darunter UNI, AAVE, COMP, SNX, CRV und MKR. Da die Marktkapitalisierung von SUSHI die Top 5 erreicht, wird SUSHI dem Pool hinzugefügt.

Schritt 2: Ausleihen aller 6 Token (UNI, AAVE, COMP, SNX, CRV und MKR), die von IndexPool über SushiSwap unterstützt werden.

Schritt 3: Tauschen von UNI durch mehrmaliges Aufrufen der Funktion swapExactAmountIn mit den geliehenen Token (am Beispiel von COMP).

Hinweis 1: Mehrmals hier aufgrund der Einschränkung von MAX_IN_RATIO, man kann höchstens die Hälfte des Token-Guthabens tauschen.

Hinweis 2: In diesem Schritt wird poolValue stark unterschätzt, da die Bilanz von UNI (als firstToken) im Pool stark abnimmt.

Schritt 4: Ändern des minimumBalance von SUSHI durch Aufrufen der Funktion updateMinimumBalance.

Beachten Sie, dass minimumBalance kleiner als der normale Wert ist, da poolValue in Schritt 3 abnormal berechnet wurde.

Schritt 5: Vorbereiten von LP-Token durch Aufrufen der Funktion joinswapExternAmountIn zur Bereitstellung von Liquidität. Wir werden sehen, dass diese LP-Token verwendet werden, um mehr SUSHI zurückzutauschen.

Hinweis: Die Funktion joinswapExternAmountIn muss aufgrund der Auswirkung von MAX_IN_RATIO mehrmals aufgerufen werden.

Schritt 6: Manipulieren des Gewichts von SUSHI im DEFI5-Pool, indem zuerst eine riesige Menge SUSHI verliehen und in den Pool transferiert und dann die Funktion gulp aufgerufen wird, um das ready von SUSHI auf true zu setzen. Dadurch wird das anfängliche Gewicht von SUSHI (denorm) zu einem hohen Wert.

Schritt 7: Tauschen von LP-Token zurück in zugrundeliegende Token (UNI, AAVE, COMP, SNX, CRV, MKR und SUSHI) durch Aufrufen der Funktion exitPool.

Hinweis: Die Funktion exitPool berücksichtigt NICHT das Gewicht jedes Tokens, folglich werden die zugrundeliegenden Token im gleichen Verhältnis zurückgegeben.

Schritt 8: Tauschen von LP-Token durch Aufrufen der Funktion joinswapExternAmountIn mit SUSHI zur Bereitstellung von Liquidität. Aufgrund des abnormalen Gewichts von SUSHI zu diesem Zeitpunkt können mehr LP-Token geerntet werden.

Beachten Sie, dass die Funktion joinswapPoolAmountIn den LP-Token basierend auf dem Gewicht des empfangenen zugrundeliegenden Tokens (in diesem Fall SUSHI) prägt.

Schritt 9: Entleeren des Pools durch Aufrufen der Funktion exitPool mit den in Schritt 8 geernteten LP-Token.

0x5. Gewinnanalyse

Unsere Untersuchung zeigt, dass das gesamte Geld (einschließlich Transaktionsgebühren), das vom Angreifer verwendet wurde, von Tornado Cash stammt.

Insgesamt gibt es zwei Angriffstransaktionen:

  • In der ersten Transaktion erzielte der Angreifer: 6.226,8 AAVE, 15 ETH, 192.358,6 UNI, 5.459,5 COMP, 721.611,3 CRV, 16.680,6 SNX, 406,5 MKR.

  • In der zweiten Transaktion sammelte der Angreifer: 109,6 MKR, 17.844 UMA, 1.002,4 COMP, 34.602,5 UNI, 131.645,4 BAT, 28.754,1 SNX, 1.273,6 AAVE, 124.194,2 CRV, 33.215,4 LINK, 5,24 YFI.

Zusätzlich hatte der Angreifer mehrere gescheiterte Versuche.

Zum Zeitpunkt der Erstellung dieses Berichts beläuft sich der vom Angreifer erzielte Gewinn auf 16 Millionen US-Dollar und wurde noch nicht übertragen.

Über BlockSec

BlockSec ist ein wegweisendes 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 Massenadoption zu fördern. Zu diesem Zweck bietet BlockSec Dienstleistungen im Bereich der Sicherheitsprüfung von Smart Contracts und EVM-Chains, die Phalcon-Plattform für die Sicherheitsentwicklung und die proaktive Abwehr von Bedrohungen, die MetaSleuth-Plattform für die Geldverfolgung und -untersuchung sowie die MetaSuites-Erweiterung für Web3-Entwickler, um effizient im Krypto-Bereich zu 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 wie Matrix Partners, Vitalbridge Capital und Fenbushi Capital Dutzende Millionen US-Dollar erhalten.

Offizielle Website: https://blocksec.com/

Offizielles Twitter-Konto: https://twitter.com/BlockSecTeam

Sign up for the latest updates