Back to Blog

#2: Euler Finance Vorfall: Der größte Hack des Jahres 2023

Code Auditing
February 9, 2024
5 min read

Am 13. März 2023 stellte unser System fest, dass der Lending-Pool von Euler Finance einem Flash-Loan-Angriff zum Opfer gefallen war, was zu Verlusten von 197 Millionen US-Dollar führte. Wir informierten zunächst die Community und lieferten anschließend eine Analyse, um die Grundursache zu identifizieren.

Die Grundursache dieses Vorfalls liegt im fehlenden Insolvenzcheck in der Funktion donateToReserves(). Konkret stellt der anfällige Vertrag eine Funktionalität bereit, mit der Benutzer ihre Sicherheiten an das Protokoll spenden können, ohne zu prüfen, ob die Position des Benutzers solvent war. Erschwerend kommt hinzu, dass das Protokoll Liquidatoren einen hohen Rabatt anbot, damit diese weniger Schulden bezahlen müssen, um diese Position zu liquidieren. Der Angreifer erstellte eine große Position und machte diese durch Ausnutzung dieser Funktionalität insolvent. Anschließend konnte er seine Sicherheiten zu einem Rabattpreis kaufen und so Gewinn erzielen.

Hintergrund

Überblick über Euler Finance

Euler Finance ist ein Lending-Protokoll auf Ethereum, das Benutzern ermöglicht, bestimmte Token zu verleihen und zu leihen. Wenn Kreditgeber in Eulers Liquiditätspool einzahlen, wird eine entsprechende Menge an ETokens (zinstragende ERC20-Token) geprägt und an sie gesendet. Diese ETokens können gegen die hinterlegten zugrunde liegenden Vermögenswerte eingelöst werden.

Andererseits erhalten Kreditnehmer, die Liquidität aufnehmen, DTokens. Diese DTokens sind ERC20-konform und verhindern, dass Inhaber sie eigenständig verbrennen können. Konkret können die Token, anstatt an jeden gesendet zu werden, von jedem übernommen werden, die Annahme erfordert jedoch eine Genehmigung. Hinsichtlich des zugrunde liegenden Vermögenswerts sind Kreditnehmer dafür verantwortlich, Zinsen auf ihre Darlehen zu zahlen, und ein Teil dieser Zinsen wird verwendet, um uneinbringliche Schulden im Protokoll zu decken.

Die Leverage-Borrowing-Funktion (auch Self-Borrow genannt) und der Soft-Liquidation-Mechanismus von Euler Finance sind zwei Schlüsselkonzepte, die uns helfen, die Ursache dieses Angriffs besser zu verstehen.

Leverage Borrow

Euler Finance bietet eine Leverage-Borrowing-Funktion, die es Benutzern ermöglicht, eine rekursive Kreditaufnahmestrategie zu simulieren. Vereinfacht ausgedrückt können Benutzer Sicherheiten hinterlegen und ETokens prägen, die dann als Sicherheiten für weitere ETokens verwendet werden können. Der Vertrag prägt außerdem eine entsprechende Menge an dTokens als Schulden-Token. Der Gesundheitszustand der Position eines Benutzers wird anhand der Werte der ETokens und dTokens berechnet. Gemäß der Dokumentation von Euler Finance können Benutzer bis zu 19-fach hebeln. Die Leverage-Borrowing-Funktion spielte bei diesem Vorfall eine entscheidende Rolle. Ohne diese Funktion wäre es dem Angreifer nicht möglich gewesen, Gewinn zu erzielen. Durch Leverage Borrowing vergrößerte der Angreifer seine Positionsgröße auf fast das 11-fache der ursprünglich aus dem Flash Loan erhaltenen Mittel.

Soft Liquidation

Wie im Whitepaper von Euler Finance beschrieben, ermöglicht der Soft-Liquidation-Mechanismus Liquidatoren, der liquidierten Partei bei der flexiblen Rückzahlung ihrer Schulden zu helfen, anstatt auf einen festen Koeffizienten für die Liquidation beschränkt zu sein, wie er von Protokollen wie Compound und Aave verwendet wird. Soft Liquidation bedeutet, dass je geringer der Gesundheitszustand einer Position ist, desto mehr Sicherheiten für die Liquidation in Frage kommen – basierend auf den Daten dieses Vorfalls bis zu 75% im Falle uneinbringlicher Schulden. Die Liquidation erheblich rabattierter Sicherheiten ermöglichte es dem Angreifer daher, den Flash Loan zu begleichen und einen Gewinn zu erzielen.

Schwachstellenanalyse

Die Hauptschwachstelle, nämlich das Fehlen eines Insolvenzcheck, befindet sich in der Funktion donateToReserves(), die von Benutzern verwendet wird, um ETokens aus ihren Positionen als Spenden in die Reserve des Protokolls zu übertragen. Für reguläre Benutzer gibt es in der Regel keinen Anreiz oder keine Motivation, eine solche Aktion durchzuführen. Tatsächlich liegt die Schwachstelle darin, dass die Funktion donateToReserves() beim Übertragen von ETokens aus Benutzerpositionen keine Gesundheitsprüfung durchführt. Dies ermöglicht es Angreifern, die ETokens direkt aus der durch Leverage Borrowing erstellten großen Position zu spenden, wodurch der Gesundheitszustand der Position unter 100% fällt und uneinbringliche Schulden entstehen.

Gemäß dem Design verwendet Euler Finance einen dynamischen Close-Faktor, um Positionen „soft zu liquidieren". Kurz gesagt, je ungesünder eine Position ist, desto höher ist der Anteil der Sicherheiten in dieser Position, der liquidiert werden kann. Im Falle uneinbringlicher Schulden kann der Liquidierungsanteil bis zu 75% der Sicherheiten innerhalb der Position betragen (berechnet auf Basis der tatsächlichen Angriffstransaktion). Infolgedessen ermöglicht die erhebliche Menge an rabattierten liquidierten Sicherheiten dem Angreifer, den Flash Loan zurückzuzahlen und Gewinne zu erzielen.

Angriffsanalyse

Es gibt mehrere Angriffstransaktionen, die auf verschiedene Pools abzielen:

  • 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d (DAI)
  • 0x71a908be0bef6174bccc3d493becdfd28395d8898e355d451cb52f7bac38617 (WBTC)
  • 0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4 (wstETH)
  • 0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed13d9 (USDC)
  • 0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311 (stETH)
  • 0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f (WETH)

Die Angriffsschritte sind wie folgt (am Beispiel der ersten Angriffstransaktion):

  1. Der Angreifer leiht 30M DAI in AAVE über einen Flashloan.
  2. Der Angreifer hinterlegte 20M DAI und erhielt 20M eDAI zurück.
  3. Da Euler Finance die Möglichkeit des Leverage Borrow bietet, kann der Angreifer 195M eDAI und 200M dDAI prägen. Der Angreifer hält nun 215M eDAI und 200M dDAI.
  4. Fortführung des obigen Schritts. 10M Schulden wurden zurückgezahlt, damit der Angreifer mehr eDAI prägen kann. Der Angreifer hält nun 215M eDAI und 190M dDAI.
  5. Schritt 3 wurde wiederholt. Der Angreifer hält nun 410M eDAI und 390M dDAI.
  6. Der Angreifer rief die Funktion donateToReserve auf, um 100M eDAI zu spenden. Während dieses Vorgangs wurde jedoch der Health-Faktor des Angreifers nicht überprüft. In diesem Fall kann die Position nun liquidiert werden (310M eDAI vs. 390M dDAI), was die Möglichkeit bietet, Gewinn zu erzielen.
  7. Der Angreifer liquidierte die Position mithilfe eines anderen Adressvertrags als Liquidator (0xa0b3...). Der Liquidator (0xa0b3...) erhielt 310M eDAI und 259M dDAI.
  8. Der Angreifer verbrannte 38,9M eDAI, um 38,9M DAI abzuheben (aufgrund von Insolvenzprüfungen können keine weiteren Abhebungen erfolgen) in der Position des Liquidators (0xa0b3...).
  9. Der Angreifer zahlte den Flashloan zurück.

Die wichtigsten Angriffsschritte 2–7 sind im Transaktions-Trace gekennzeichnet.

Zusammenfassung

Dies war der größte Hack im Jahr 2023, bei dem ein 20-jähriger Argentinier namens Federico Jaime einen Rekordbetrag von 197 Millionen US-Dollar stahl und den Medien „eine verschlungene, manchmal verwirrende und sogar widersprüchliche Geschichte" lieferte. Dennoch wurden „alle rückgewinnbaren Mittel" später an die Treasury-Adresse von Euler Finance zurückgegeben. Ein kleiner Teil (ca. 200.000 US-Dollar) wurde jedoch „unbeabsichtigt" an die Lazarus-Gruppe gesendet – ein mutmaßliches, vom nordkoreanischen Staat gefördertes Verbrecherkonsortium, das vom US-Finanzministerium sanktioniert wurde. Die detaillierte und interessante Geschichte können Sie unter diesen Links nachlesen: Link1 und Link2.

Die Grundursache dieses Vorfalls war das Fehlen von Insolvenzprüfungen, was als Lektion dienen sollte. Tatsächlich ist es für ein Lending-Protokoll entscheidend zu beurteilen, ob Positions-Gesundheitsprüfungen für alle Verfahren implementiert werden sollten, die Benutzerpositionen beeinflussen könnten. Darüber hinaus sollten Projektteams ihr Lending-Protokoll proaktiv auf erhebliche Liquidierungen überwachen und wirksame Alarmsysteme einrichten, um solche Ereignisse zeitnah zu erkennen und darauf zu reagieren.

Weitere Artikel dieser Serie lesen:

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit