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 № 064Smart-Contract-Bug

MonoX Same-Token-Swap

31 Mio. $ aus MonoX' Single-Token-Pools abgezogen, nachdem der Angreifer einen Token mit sich selbst tauschte und MONO im Orakel des Protokolls aufpumpte.

Datum
Status
Mittel entwendet

Am 30. November 2021 verlor der Single-Pool-AMM MonoX Finance etwa 31 Millionen $ über seine Ethereum- und Polygon-Deployments. Der Bug war fast zu einfach, um real zu sein: Der Swap-Vertrag prüfte nicht, ob der Eingabe-Token und der Ausgabe-Token derselbe waren.

Was geschah

MonoX verwendete ein neuartiges "Single-Pool"-AMM-Design, bei dem jeder Token intern gegen den MONO-Governance-Token des Protokolls gepaart wurde, anstatt direkt gegen andere Tokens. Ein Swap von Token A zu Token B wurde als A → MONO → B in zwei internen Schritten implementiert, jeder Schritt aktualisierte die relevanten Token-Preise.

Das fatale Versäumnis: Die Swap-Funktion validierte nicht, dass tokenIn ≠ tokenOut. Wenn ein Nutzer MONO gegen MONO tauschte, lief die Preis-Update-Logik auf beiden Beinen:

  1. Das "Verkaufs"-Bein des Swaps drückte den MONO-Preis nach unten (typisches AMM-Verhalten).
  2. Das "Kauf"-Bein drückte den MONO-Preis nach oben.
  3. Entscheidend: Die Preis-Update-Funktionen liefen sequenziell, und das tokenOut-Preis-Update geschah zuletzt — sodass das Protokoll die Transaktion mit massiv aufgeblähtem MONO-Preis beendete.

Die Angriffsschleife:

  1. MONO gegen MONO tauschen wiederholt, was den aufgezeichneten MONO-Preis aufpumpte.
  2. Das künstlich teure MONO tauschen gegen reale Vermögenswerte — WETH, WMATIC, WBTC, USDC, USDT, LINK, GHST, DUCK, MIM, IMX.
  3. Wiederholen, bis jeder Pool geleert war.

Gesamtverluste auf Polygon + Ethereum: ~2.100 WETH, 1,9 Mio. WMATIC, 36 WBTC, 8,2 Mio. $ USDC, 9,1 Mio. $ USDT und eine lange Liste anderer Tokens, in Summe ~31 Mio. $.

Folgen

  • MonoX pausierte beide Deployments und kündigte einen Wiederherstellungsplan an.
  • Der Angreifer wusch über Tornado Cash; keine öffentliche Wiederherstellung.
  • MonoX kehrte nie zu seinem Stand vor dem Vorfall zurück.

Warum es wichtig ist

MonoX ist der Lehrbuchfall dafür, wie eine einzige fehlende Gleichheitsprüfung ein voll geladenes Exploit-Primitiv sein kann. Der Bug — require(tokenIn != tokenOut) — ist genau eine Codezeile. Sein Fehlen kostete 31 Mio. $.

Die tiefere Lektion ist die wiederkehrende für neuartige AMM-Designs: Jede behauptete Invariante des AMM muss über den gesamten Eingaberaum getestet werden, einschließlich offensichtlich degenerierter Fälle. Der Fall "tausche einen Token gegen sich selbst" ist aus Nutzersicht degeneriert — niemand würde das jemals tun wollen. Aus Sicht des Protokolls ist es ein Zustands-Update-Pfad, der unbeschränkte Preis-Drift produziert. Moderne AMM-Test-Frameworks (Echidna, Foundry-Invarianten) generieren speziell degenerierte Eingaben, um genau diese Bug-Klasse aufzudecken.

Quellen & On-Chain-Belege

  1. [01]slowmist.medium.comhttps://slowmist.medium.com/detailed-analysis-of-the-31-million-monox-protocol-hack-574d8c44a9c8
  2. [02]cryptobriefing.comhttps://cryptobriefing.com/monox-finance-drained-of-31m-in-latest-defi-hack/
  3. [03]immunebytes.comhttps://immunebytes.com/blog/monox-hack-incident-nov-30-2021-detailed-analysis/

Verwandte Einträge