BSC Flash Loan Attack: Pancake Bunny

Im Mai 2021 haben wir mehrere Hacks gesehen, die auf BSC DeFi-Gegenstände abzielten. Insbesondere wurde ein Schlupfloch im Zusammenhang mit dem Prägen von Prämien im Ertragsaggregator Pancake Bunny genutzt, um ~ 7 Millionen BUNNY-Token aus dem Nichts zu prägen, was zu einem enormen Geldverlust von 45 Millionen US-Dollar führte. Nach dem blutigen Hack wurden 3 gegabelte Aufgaben – AutoShark, Merlin Labs und Pancake Hunny – mit vergleichbaren Methoden angegriffen. Bernstein Gruppe'& rsquo; Die Blockchain-Sicherheitsgruppe unter der Leitung von Dr. Chiachih Wu geht auf das Schlupfloch ein und bietet einen detaillierten Bericht über die Nutzung durch die Replikation des Angriffs gegen Pancake Bunny.

Versteckte Angriffsfläche: balanceOf()

Viele Leute denken, dass die Zusammensetzbarkeit für den Erfolg von DeFi wichtig ist. Token-Vereinbarungen (z. B. ERC20s) spielen eine wichtige Funktion auf der untersten Schicht von DeFi-Legos. Designer ignorieren jedoch möglicherweise einige unüberschaubare und unvorhersehbare Bedingungen, wenn sie ERC20s in ihre DeFi-Aufgaben integrieren. Beispielsweise können Sie'& rsquo; Sie können nicht vorhersehen, wann und wie viele Token Sie erhalten, wenn Sie das vorhandene Token-Guthaben wiederherstellen. Diese Unvorhersehbarkeit erzeugt eine verdeckte Angriffsfläche.

In vielen Fällen beziehen sich kluge Vereinbarungen in ihren Dienstbegründungen auf die Salden von ERC20s. Wenn ein Benutzer beispielsweise einige XYZ-Token in die weise Vereinbarung überträgt, wird XYZ.balanceOf() beschworen, um zu untersuchen, wie viel Geld er erhalten hat. Wenn Sie& rsquo; Wenn Sie mit der Uniswap-Codebasis vertraut sind, verstehen Sie wahrscheinlich, dass die Uniswap-V2Pair-Vereinbarung viele balanceOf()-Aufrufe enthält.

Im Codebit verwendet Uniswap V2Pair.mint() die vorhandenen Salden (saldo0, balance1) und die Buchführungsinformationen (amount0, amount1), um die vom Benutzer transferierten Mengen (amount0, amount1) zu erhalten. Wenn jedoch ein schlechter Stern einige Eigenschaften (token1 oder token2) direkt vor dem Aufruf von mint() bewegt, würde das Opfer mehr Liquidität anbieten als erwartet, dh es werden mehr LP-Token geprägt. Wenn die Vorteile anhand der Menge der LP-Token bestimmt werden, kann der schlechte Stern profitieren, wenn die Vorteile die Ausgaben übersteigen.

Die Uniswap V2Pair.burn() hat eine vergleichbare Bedrohung. Der Aufrufer der Funktion mint() kann sich selbst bedrohen, ohne ein umfassendes Verständnis der enthaltenen Bedrohungen zu haben. Dies geschah bei Pancake Bunny.

Holen Sie sich den 110 USDT Futures-Bonus völlig kostenlos!

Im obigen Codebit erhält Zeile 140 den Saldo des LP-Tokens durch balanceOf() und kauft ihn in Liquidität ein. In den Zeilen 144––145 wird der Teil der gesamten LP-Token im Besitz von Uniswap V2Pair (dh Liquidität aus _ totalSupply) verwendet, um (amount0, amount1) mit den vorhandenen Salden (balance0, balance1) der 2 Eigenschaften (dh , Token0 und Token1). Später werden (Betrag0, Betrag1) der 2 Eigenschaften an die Adresse in den Zeilen 148–– 149 verschoben.

Hier könnte ein schlechter Stern (balance0, balance1) und die Liquidität kontrollieren, indem er etwas token0+ token1 oder den LP-Token in die Uniswap V2Pair-Vereinbarung sendet, kurz bevor die mint()-Funktion beschworen wird, damit der Anrufer mehr token0+ token1 herausbekommt . Wir'& rsquo; Ich werde Sie durch den Pancake Bunny-Quellcode schlendern und Ihnen zeigen, wie der böse Star damit Geld verdienen kann.

Lückenanalyse: BunnyMinterV2

Im Pancake Bunny-Quellcode überwacht die Funktion BunnyMinterV2.mintFor V2() das Prägen von BUNNY-Token als Vorteile. Konkret ergibt sich die zu prägende Gesamtsumme (dh mintBunny) aus den Eingabekriterien _ Auszahlungsgebühren und _ Leistungsgebühren. Die Berechnung ist mit 3 Funktionen verbunden: _ zapAs setTo BunnyBNB() (Zeile 213), priceCalculator.valueOfAs set() (Zeile 219) und MengeBunnyTo Mint() (Zeile 221). Da der böse Stern eine große Menge BUNNY prägen kann, hängt das Problem von den 3 oben genannten Funktionen ab.

Lesen Sie den Artikel:  Ist dies das Zeichen, das Afrikas Zukunft verändern kann? Ein Blick in den XTEMCoin

Lass'& rsquo; s beginnen mit der Funktion _ zapAs setzt To BunnyBNB(). Wenn das übergebene Eigentum ein Kuchen-LP ist (Zeile 267), wird eine bestimmte Menge von LP-Token verwendet, um Liquidität zu eliminieren und (Menge Token 0, Menge Token 1) von (token0, token1) aus dem Liquiditätspool zu nehmen (Zeile 278). Mit Hilfe der zapBSC-Vereinbarung werden diese Eigenschaften gegen BUNNY-BNB LP-Token getauscht (Zeilen 287–288). Eine entsprechende Menge an BUNNY-BNB LP-Token wird dann an den Anrufer zurückgesendet (Zeile 298). Hier haben wir ein Problem.Stimmt die Menge mit der Menge der LP-Token überein, von denen Sie annehmen, dass sie verbrannt werden?(*)die Ausführung vonthe

In V2Router.removeLiquidity() würde die Liquidität von LP-Token (Menge in zapPancake setsAs BunnyBNB()) an die To Pair-Vereinbarung (Zeile 500) gesendet und Pancake Pair.burn() würde heraufbeschworen. Pfannkuchen Sie das vorhandene LP-Token-Guthaben von Wenn das Paar höher als 0 ist, wäre die wirklich zu verbrennende Summe höher als die Menge, was indirekt die zu prägende BUNNY-Gesamtzahl erhöht.Pfannkuchenproblem in _ zap

Ein weiteres SetAs BunnyBNB() ist der Aufruf zapBSC.zapTo(). Der InToken-Grundsatz dahinter ist, die 2 von removeLiquidity() gesammelten Eigenschaften in BUNNY-BNB LP-Token auszutauschen. Die zapBSC tauscht Immobilien durch Since Swap, der Bad Star könnte Flash-Kredite verwenden, um die Menge der umgestellten BUNNY-BNB.Pancake zu BunnyMinterV2.mint zu kontrollieren

Zurück V2() würde der von zapFor setsAs BunnyBNB() zurückgegebene bunnyBNBAmount in priceCalculator.valueOfTo set() eingegeben, um den Wert basierend auf BNB (dh vauleAs BNB) zu schätzen, vergleichbar mit einem Orakelsystem.

Jedoch priceCalculator.valueOf set() empfiehlt die Menge von BNB und BUNNY (reserve0, reserve1) im BUNNY_BNB As Pair als Kosten-Feed, Pancake, der es dem Bad Star ermöglicht, Flash-Kredite zu nutzen, um die Menge der geprägten BUNNY-Token zu kontrollieren. MengeBunny

Die Funktion Mint() ist eine grundlegende mathematische Schätzung. Der Beitrag zum Input wird um 5 erhöht (bunnyPerProfitBNB = 5e18), der selbst keine Angriffsfläche hat, jedoch verstärkt die Verstärkung die oben erwähnte Kontrolle. Kampf

Da für

Da der Angriff durch getReward() aktiviert wird, müssen wir für Vorteile zertifiziert sein. Etherscan, der im obigen Pancake-Screenshot angezeigt wird, beschwor der To Bunny-Hacker die init()-Funktion der Nutzungsvereinbarung zum Austausch von 1 WBNB zu WBNB- USDT-LP-Token und zahle sie in den VaultFlip ein

Als Flip-Vereinbarung, so dass er einige Vorteile durch die Beschwörung von getReward().Exp wie oben gezeigt erhalten würde, haben wir mit der Funktion To Prepare() den Aufruf von VaultFlipWe Flip.deposit() neu erstellt (Zeile 62). Verwendet jedoch ebenfalls die ZapBSC-Vereinbarung, um den Erhalt von LP-Token zu rationalisieren (Zeilen 54-57). Pfannkuchen, man ist'& rsquo; Es ist nicht möglich, Vorteile zu erhalten, bis der For Bunny-Halter den nächsten Ernte()-Aufruf auslöst. Pfannkuchen dieser Faktor, der

In Bunny Hacker hat& rsquo; Der Angriff wird nicht bis zum allerersten Harvest()-Deal nach dem init()-Deal gestartet. Daher kann in unserer Simulation kein Keeper den Harvest()-Deal auslösen.

Rekursive Blitzkredite

Dazu nutzen wir die Funktion von eth-brownie, um den Halter zu imitieren und von Hand den Harvest()-Deal zu starten (Zeile 25).Pancake use Funds, der Pancake Bunny Ausbeuter nutzte 8 verschiedene Fondspools, bestehend aus 7 For Pair-Vereinbarungen und die Bank TubeHere Amber Group, Blockchain Security'& rsquo; s(*)group hat gerade die folgenden 7 Pfannkuchenpaar-Vereinbarungen verwendet' & rsquo; Flash-Swap-Funktion zum Ausleihen von 2.3 M WBNB:

Um die Flash-Swap-Aufrufe zu rationalisieren, haben wir 2 Kriterien in das vierte Eingabeargument der Pancake Pair.swap()-Aufrufe geladen (Zeile 4 oder Zeile 72): level und property. Die Level-Variable zeigt an, welches Level von swap() wir aufrufen'& rsquo; wieder rein; die Eigenschaftsvariable ist 74 oder 0, was anzeigt, dass wir token1 oder token0 erhalten müssen.

Lesen Sie den Artikel:  Welcher Teil der Ultrareichen kauft Bitcoin?

Mit der Callback-Funktion pancakeCall() rufen wir Pancake Pair.swap() rekursiv mit Level +1 auf, bis wir das siebte Level erreichen. Auf der obersten Ebene beschwören wir shellcode() herauf, um die echte Aktion in Zeile 98 auszuführen. Wenn shellcode() zurückkehrt, gibt die Eigenschaftsvariable die erhaltene Eigenschaft in jeder passenden Ebene zurück (Zeilen 102–104).

Abdrücken

Die Funktion shellcode(), die von der siebten Ebene von pancakeCall() heraufbeschworen wurde, ist die eigentliche Verwendung von Code. Zuerst behalten wir das vorhandene Guthaben von WBNB in ​​wbnbAmount (Zeile 108), tauschen 15,000 WBNB in ​​WBNB-USDT-LP-Token (Zeile 112) und senden sie an die Vereinbarung, die diese LP-Token geprägt hat (dh die Pfannkuchenpaar-Vereinbarung). in Zeile 113. Diese Aktion beabsichtigt, den removeLiquidity()-Aufruf innerhalb der Funktion _zapAs setsTo BunnyBNB() wie oben ausgewertet zu steuern, wodurch wir mehr WBNB+USDT erhalten als erwartet.

Die zweite Aktion besteht darin, die USDT-Kosten zu kontrollieren, auf die von _ zapAs setsTo BunnyBNB() verwiesen wird, um USDT in WBNB umzuwandeln. Da _ zapAs setsTo BunnyBNB() das WBNB-USDT-Pfannkuchenpaar verwendet, um USDT auf WBNB umzustellen, wir könnten den Rest des Flash-verliehenen WBNB auf USDT auf Pancake Swap umstellen. Dies würde WBNB unglaublich günstig machen, und _ zapAs setTo BunnyBNB() würde eine unverhältnismäßig große Menge an WBNB erhalten, wenn von USDT gewechselt wird. Beachten Sie, dass die Kostenkontrolle hier auf dem Pool Pancake V1 stattfindet, nicht auf Pancake V2'& rsquo; s Pfannkuchenpaar wie in der vorherigen Aktion.

Die letzte Aktion ist der Aufruf getReward(). Der Basisvertragsaufruf könnte 6.9 ​​Mio. BUNNY-Token prägen (Linie 125). Die BUNNY-Token können dann für WBNB auf Pancake Swap getauscht werden, um das Flash-Darlehen zurückzuzahlen.

In unserer Simulation zahlt der schlechte Stern 1 WBNB und gewinnt 104k WBNB + 3.8 Mio. USDT (vergleichbar mit ~45 Mio. $).

Über die Bernsteingruppe

Die Amber Group ist ein führendes internationales Krypto-Finanzierungsunternehmen, das weltweit und ständig mit Niederlassungen in Hongkong, Taipeh, Seoul und Vancouver tätig ist. Die 2017 gegründete Amber Group betreut über 500 institutionelle Kunden und hat tatsächlich insgesamt über 500 Milliarden US-Dollar in über 100 elektronischen Geräten gehandelt Börsen mit über 1.5 Milliarden US-Dollar an verwalteten Immobilien. Im Jahr 2021 sammelte die Amber Group 100 Millionen US-Dollar im Rahmen einer Serie-B-Finanzierung und wurde schließlich das neueste FinTech-Einhorn mit einem Wert von über 1 Milliarde US-Dollar. Weitere Informationen finden Sie unter: www.ambergroup.io.

Jeder Trader, der Kryptowährungen an der Binance-Börse handelt, möchte über das Kommende Bescheid wissen pumpden Wert von Münzen zu erhöhen, um in kurzer Zeit enorme Gewinne zu erzielen.
Dieser Artikel enthält Anweisungen wie Sie herausfinden, wann und welcher Coin am nächsten teilnimmt “Pump“. Jeden Tag ist die Community auf Telegrammkanal Crypto Pump Signals for Binance Signale für Binance veröffentlicht 3-4 kostenlose Signale über die bevorstehende “Pump“ und berichtet über erfolgreiche “Pumps“, die von den Veranstaltern der VIP-Community erfolgreich absolviert wurden.
Diese Handelssignale helfen, innerhalb weniger Stunden nach dem Kauf der auf dem Telegram-Kanal veröffentlichten Coins einen Gewinn von 5 % bis 45 % zu erzielen.Crypto Pump Signals for Binance Signale für Binance“. Machen Sie mit diesen Handelssignalen bereits Gewinne? Wenn nicht, dann probiere es aus! Wir wünschen Ihnen viel Glück beim Handel mit Kryptowährungen und möchten den gleichen Gewinn wie VIP-Benutzer der Crypto Pump Signals for Binance Signale für den Binance-Kanal.
John Lesley/ Autor des Artikels

John Lesley ist ein erfahrener Händler, der sich auf technische Analysen und Prognosen des Kryptowährungsmarktes spezialisiert hat. Er verfügt über mehr als 10 Jahre Erfahrung mit einer Vielzahl von Märkten und Vermögenswerten - Währungen, Indizes und Rohstoffe. John ist Autor beliebter Themen in großen Foren mit Millionen von Ansichten und arbeitet sowohl als Analyst als auch als professioneller Händler für Kunden und Kunden selbst.

Hinterlassem Sie einen Kommentar