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
- Opfer
- MonoX Finance
- 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:
- Das "Verkaufs"-Bein des Swaps drückte den MONO-Preis nach unten (typisches AMM-Verhalten).
- Das "Kauf"-Bein drückte den MONO-Preis nach oben.
- 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:
- MONO gegen MONO tauschen wiederholt, was den aufgezeichneten MONO-Preis aufpumpte.
- Das künstlich teure MONO tauschen gegen reale Vermögenswerte — WETH, WMATIC, WBTC, USDC, USDT, LINK, GHST, DUCK, MIM, IMX.
- 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
- [01]slowmist.medium.comhttps://slowmist.medium.com/detailed-analysis-of-the-31-million-monox-protocol-hack-574d8c44a9c8
- [02]cryptobriefing.comhttps://cryptobriefing.com/monox-finance-drained-of-31m-in-latest-defi-hack/
- [03]immunebytes.comhttps://immunebytes.com/blog/monox-hack-incident-nov-30-2021-detailed-analysis/