Zum Inhalt springen
Gegr. MMXXVIBd. VI · № 273RSS
Blockchain Breaches

Ein Archiv von Sicherheitsvorfällen im Kryptobereich — Hacks, Exploits, Bridge-Ausfälle und Rug Pulls, dokumentiert mit On-Chain-Belegen.

Dossier № 049Flash-Loan-Angriff

Popsicle Finance Reward-Buchhaltung

20,7 Mio. $ aus Popsicles Sorbetto-Fragola-Pool abgezogen, nachdem Flash-Kredite plus Anteilstransfers den Vertrag täuschten, TVL-Belohnung zu schulden.

Datum
Chain(s)
Status
Mittel entwendet

Am 4. August 2021 verlor die DeFi-Plattform Popsicle Finance etwa 20,7 Millionen $ aus ihrem Sorbetto-Fragola-Liquiditätspool. Der Angreifer nutzte Flash-Kredite und eine Sequenz von Anteilstransfers zwischen Adressen, um die Belohnungs-Tracking-Logik des Vertrags glauben zu lassen, dass ihm Belohnungen in Höhe des gesamten TVL des Pools geschuldet würden.

Was geschah

Sorbetto Fragola war ein Uniswap-v3-Aktiv-Liquiditäts-Manager — Nutzer hinterlegten Vermögenswerte, erhielten "Anteile", die ihre LP-Position repräsentierten, und verdienten Gebühren proportional zu ihrem Anteil. Der Pool verfolgte Belohnungen, indem er für jede Adresse den Block aufzeichnete, in dem sie zuerst Anteile erhielt, und Gebührenakkumulation ab diesem Block vorwärts anwendete.

Der fatale Fehler: Der Vertrag aktualisierte den Belohnungs-Tracking-Zustand nicht, wenn Anteile zwischen Adressen übertragen wurden. Konkret:

  • Wenn Nutzer A seine Anteile an Nutzer B übertrug, registrierte der Vertrag Nutzer B als berechtigt für Belohnungen ab Block 0 (dem ursprünglichen Deployment-Block des Pools), nicht ab dem tatsächlichen Transferblock.
  • Dieselben Anteile konnten mehrmals an verschiedene Adressen übertragen werden, und jede empfangende Adresse würde Belohnungen gutgeschrieben bekommen, als hätte sie diese Anteile seit Beginn des Pools gehalten.

Der Angriff:

  1. Flash-borgte etwa 30 Mio. USDT und 32 Mio. ETH aus verschiedenen Quellen.
  2. Hinterlegte die geliehenen Vermögenswerte in Sorbetto Fragola und erhielt Sorbetto-Anteile.
  3. Übertrug die Anteile an eine Sequenz angreiferkontrollierter Adressen — jeder Transfer registrierte den Empfänger als "berechtigt für Belohnungen seit Block 0".
  4. Forderte Belohnungen von jeder der angreiferkontrollierten Adressen — der Vertrag berechnete den Belohnungsanteil jeder Adresse, als hätte sie den maximalen Einsatz seit dem Deployment gehalten.
  5. Nettoergebnis: Über alle Angreiferadressen geforderte Belohnungen summierten sich auf etwa den gesamten TVL des Pools.
  6. Hob die Belohnungen als reale Vermögenswerte ab, zahlte die Flash-Kredite zurück, ging mit ~20,7 Mio. $ davon.

Bemerkenswert: Der Angreifer nahm hauptsächlich USDC und USDT (zusammen etwa 10 Mio. $) plus mehrere andere Vermögenswerte. Popsicles andere Verträge waren nicht betroffen — der Bug war spezifisch für Sorbetto Fragolas Belohnungs-Tracking-Logik.

Folgen

  • Popsicle pausierte Sorbetto Fragola und kündigte eine Neugestaltung der Belohnungs-Buchhaltungs-Logik an.
  • Das Team veröffentlichte ein Post-Mortem, das die Lücke bei Zustands-Update beim Anteilstransfer als Grundursache identifizierte.
  • Ein neu gestaltetes Sorbetto mit ordnungsgemäßen Zustands-Updates beim Anteilstransfer wurde schließlich gestartet, aber Popsicles Ansehen in der Kategorie Aktiv-Liquiditätsmanagement erholte sich nicht.
  • Keine öffentliche Wiederherstellung gestohlener Mittel.

Warum es wichtig ist

Popsicle ist der Lehrbuchfall dafür, warum jede zustandsändernde Operation in einem Belohnungs-Tracking-System jede abhängige Zustandsvariable aktualisieren muss. Die transfer-Funktion des Vertrags bewegte die Anteile, ohne den Belohnungs-Berechtigungs-Zeitstempel zu berühren, was die beiden Zustandsteile inkonsistent ließ — und die Inkonsistenz war der gesamte Exploit.

Das Muster wiederholt sich in DeFi jedes Mal, wenn ein Protokoll Gebühren-/Belohnungs-Tracking implementiert, indem es einen "Berechtigungs-Start"-Zeitstempel speichert, der bei jedem Transfer aktualisiert werden sollte:

  • MasterChef-Forks, die Reward Debt bei Anteilstransfers nicht aktualisieren.
  • Staking-Verträge, die Belohnungen basierend auf einem "Ersteinzahlungs"-Block berechnen.
  • Yield-Aggregatoren, die Nutzerzustand über Einzahlungs-Lots aggregieren.

Das defensive Muster — alle Reward-Debt-Zustände bei jedem Anteilstransfer aktualisieren, nicht nur bei Deposit/Withdraw — ist jetzt Standard im modernen Belohnungs-Tracking-Code. Popsicles 20,7 Mio. $ ist einer der grundlegenden Fälle, die es zum Standard machten.

Es ist auch bemerkenswert, dass Certora später eine formale Verifikationsanalyse veröffentlichte, die zeigte, dass der Bug von ihrem Tool gefangen worden wäre. Formale Verifikation von Belohnungs-Tracking-Invarianten ist seitdem bei Protokollen, die bedeutendes TVL handhaben, häufiger geworden.

Quellen & On-Chain-Belege

  1. [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-popsicle-finance-hack-august-2021
  2. [02]coindesk.comhttps://www.coindesk.com/markets/2021/08/04/popsicle-finance-loses-207m-in-cyberattack
  3. [03]theblock.cohttps://www.theblock.co/linked/113482/defi-platform-popsicle-finance-suffers-20-million-exploit

Verwandte Einträge