BSC Flash Loan Attack: Die drei Nachahmer

24.07.2021 / Zahlungssystem-News

Eine Reihe von Angriffen hat im Mai mehrere Binance Smart Chain (BSC)-Projekte kompromittiert. Nach PancakeBunny wurden auch seine drei Forks-Projekte – AutoShark, Merlin Labs und PancakeHunny – mit ähnlichen Techniken angegriffen. PancakeBunny erlitt den teuersten Angriff der vier, bei dem ein Gesamtschaden von fast 45 Millionen US-Dollar entstand. In diesem Artikel erläutert Dr. Chiachih Wu, Leiter des Blockchain-Sicherheitsteams der Amber Group, die Details hinter den Angriffen auf die drei Nachahmer.

Nachahmer

AutoShark wurde fünf Tage nach PancakeBunny angegriffen, gefolgt von Merlin Labs bzw. PancakeHunny. Im Folgenden werden die Probleme und möglichen Angriffstechniken für diese drei gespaltenen Projekte analysiert.

In der Funktion SharkMinter.mintFor() wird die Menge der zu prägenden lohnenden SHARK-Token (dh mintShark) von SharkBNBAmount abgeleitet, das von tokenToSharkBNB() in Zeile 1494 berechnet wird. tokenToSharkBNB() verweist jedoch auf den aktuellen Saldo von Flip , was es zu einem verwundbaren Punkt macht. Man könnte annehmen, dass die Menge der in Zeile 1492 erhaltenen Token gleich dem Betrag des Flip-Guthabens ist. Dennoch könnte ein schlechter Akteur das Flip-Balance manipulieren, indem er einfach einige Flip-Tokens direkt vor dem getReward()-Aufruf einsendet und indirekt die Logik von tokenToSharkBNB() durchbricht.

In der zugrunde liegenden Implementierung von tokenToSharkBNB() gibt es eine weitere Angriffsfläche. Wie im obigen Code-Snippet gezeigt, entfernt _flipToSharkBNBFlip() Liquidität von ApeSwap (Zeile 1243) oder PantherSwap (Zeile 1262) und wandelt die LP-Token in SHARK+WBNB um. Später wird das generateFlipToken() aufgerufen, um SHARK+WBNB in ​​SHARK-BNB LP-Token umzuwandeln.

IngenerFlipToken() werden die aktuellen SHARK- und WBNB-Salden von SharkMinter (amountADesired,mengeBDesired) verwendet, um LP-Token zu generieren und die Menge der LP-Token wird als SharkBNBAmount an mintFor() zurückgegeben. Auf dieser Grundlage könnte der Bösewicht SHARK+WBNB in ​​SharkMinter übertragen, um auch die Menge der zu prägenden SHARK-Token zu manipulieren.

Die Lücke in PancakeHunny ist identisch mit der in AutoShark, da der schlechte Schauspieler die Prägung von HUNNY-Belohnungen mit HUNNY- und WBNB-Token manipulieren kann.

Im Vergleich zu AutoShark und PancakeHunny weist _getReward() von Merlin Labs eine offensichtlichere Schwachstelle auf.

Der obige Codeausschnitt zeigt, dass die Leistungsgebühr durch das Guthaben von CAKE manipuliert werden könnte, was sich indirekt auf die Prägung der MERL-Belohnungen auswirkt. Der Modifikator nonContract entfernt jedoch Flash-Darlehen.

Auch ohne einen Exploit-Vertrag könnte der Bösewicht durch mehrere Aufrufe profitieren.

AutoShark-Angriff reproduzieren

Um den AutoShark-Hack zu reproduzieren, müssen wir zuerst einige SHARK-BNB-LP-Token von PantherSwap besorgen. Konkret tauschen wir 0,5 WBNB in ​​SHARK (Zeile 58) und übertragen den Rest WBNB mit diesen SHARK-Token in PantherSwap zum Prägen von SHARK-BNB-LP-Token (Zeile 64). Später hinterlegen wir diese LP-Token in den StrategyCompoundFLIP-Vertrag von AutoShark (Zeile 69), um sich für Prämien zu qualifizieren. Beachten Sie, dass wir absichtlich nur die Hälfte der LP-Token in Zeile 69 einzahlen.

Der zweite Schritt besteht darin, getReward() in den SharkMinter-Vertrag aufzunehmen. Im obigen Code-Snippet wissen wir, dass die Belohnung mit der Funktion verdient() (Zeile 1658) abgerufen werden kann. Außerdem sollten 30% der Belohnung (d. h. performanceFee) größer als 1.000 (d. h. DUST) sein, um SharkMinter.mintFor() in Zeile 1668 auszulösen.

Daher übertragen wir in unserem Exploit-Code einige LP-Token in Zeile 76 an den StrategyCompoundFLIP-Vertrag, um die performanceFee > DUST-Prüfung zu umgehen und den mintFor()-Aufruf auszulösen. Da wir viel WBNB+SHARK benötigen, um SharkMinter zu manipulieren, nutzen wir PantherSwaps 100k WBNB über einen Flash-Swap-Aufruf in Zeile 81.

Im Flash-Swap-Callback pancakeCall() tauschen wir die Hälfte des WBNB in ​​SHARK um und senden den SHARK mit den restlichen 50.000 WBNB an den SharkMinter-Vertrag, um die Prämienprägung zu manipulieren.

Der nächste Schritt besteht darin, getReward() auszulösen, wenn der SharkMinter die WBNB+SHARK-Token empfängt, um dem Anrufer eine große Menge SHARK zu prägen.

Der letzte Schritt besteht darin, SHARK in WBNB umzuwandeln, das Flash-Darlehen zu bezahlen und mit den restlichen WBNB-Token wegzugehen.

In unserem Experiment beginnt der schlechte Akteur mit 1 WBNB. Mit Hilfe von Flash-Krediten profitiert er davon, dass mehr als 1.000 WBNB in ​​einer Transaktion zurückgegeben werden.

PancakeHunny-Angriff reproduzieren

Die Theorie hinter dem PancakeHunny-Angriff ähnelt dem AutoShark-Angriff. Kurz gesagt, wir müssen eine Menge HUNNY+WBNB an HunnyMinter senden, bevor wir getReward() auslösen. Der HUNNY-Token-Vertrag verfügt jedoch über einen Schutzmechanismus namens antiWhale, um Übertragungen großer Beträge zu verhindern. Daher funktionieren Flash-Darlehen hier nicht.

Um antiWhale zu umgehen, erstellen wir mehrere untergeordnete Verträge und initiieren mehrere CakeFlipVault.deposit()-Aufrufe über diese Verträge.

Im obigen Exploit-Code-Snippet werden die in Zeile 116 gesammelten LP-Token in 10 Teile unterteilt und in Zeile 122 in 10 Lib-Kontrakte übertragen, gefolgt von Lib.prepare()-Aufrufen für jeden von ihnen.

In Lib.prepare() genehmigen wir CakeFlipVault zum Ausgeben der LP-Token und rufen CakeFlipVault.deposit() auf, um die späteren getReward()-Aufrufe zum Prägen von lohnenden HUNNY-Token zu aktivieren.

Nachdem 10 Lib-Kontrakte vorbereitet wurden, iteriert der Hauptvertrag jeden von ihnen, um: 1) WBNB auf den maximal zulässigen Betrag von HUNNY zu tauschen; 2) Übertragung von WBNB+HUNNY an HunnyMinter; 3) getReward() über lib.trigger() auslösen; und 4) tausche HUNNY zurück zu WBNB.

Am Ende verdient der Bösewicht mit 10 WBNB rund 200 WBNB aus 10 Durchläufen von 10 Lib-Kontraktoperationen.

Reproduktion des Merlin Labs-Angriffs

Wie bereits erwähnt, verfügt Merlin Labs über den Modifikator noContract, um Flash-Kreditangriffe loszuwerden. Wir könnten jedoch ein Skript verwenden, um den Angriff mit mehreren Transaktionen auszulösen, die von einer EOA-Adresse (Externally Owned Account) aus initiiert wurden. Der einzige Unterschied besteht darin, dass jemand die Transaktion des bösartigen Akteurs an die Spitze treiben kann, um die Gewinne zu stehlen

Ähnlich wie beim AutoShark-Angriff müssen wir genügend LINK und WBNB vorbereiten (Zeile 23), sie verwenden, um WBNB-LINK-LP-Token zu prägen (Zeile 34) und LP-Token in den VaultFlipCake-Vertrag einzahlen (Zeile 38).

Die verbleibenden Aktionen sind:

  • Wechsel von WBNB zu CAKE (Zeile 42).
  • Manipulieren der MERL-Prägung durch Senden von CAKE an den VaultFlipToCake-Vertrag (Zeile 50).
  • Auslösen von getReward() in Zeile 55 (eine große Menge an MERL-Token wird geprägt).
  • MERL zurück zu WBNB wechseln und die obigen Schritte mehrmals wiederholen.
  • Wie bereits erwähnt, könnte eine Person, die Schritt 3 direkt nach Schritt 2 ausführt, eine große Menge MERL entfernen.

    In unserem Experiment beginnt der schlechte Schauspieler mit 10 WBNB und geht mit etwa 165 WBNB davon, indem er die vier Schritte zehnmal wiederholt.

    Über die Amber Group

    Amber Group ist ein führender globaler Krypto-Finanzdienstleister, der weltweit und rund um die Uhr tätig ist und in Hongkong, Taipeh, Seoul und Vancouver vertreten ist. Die 2017 gegründete Amber Group betreut über 500 institutionelle Kunden und hat kumuliert über 500 Milliarden US-Dollar an über 100 elektronischen Börsen gehandelt, mit einem verwalteten Vermögen von über 1,5 Milliarden US-Dollar. Im Jahr 2021 sammelte die Amber Group 100 Millionen US-Dollar an Finanzierungen der Serie B und wurde das neueste FinTech-Einhorn im Wert von über 1 Milliarde US-Dollar. Weitere Informationen finden Sie unter www.ambergroup.io.