Der Mirror Protocol wurde laut @FatMan ausgenutzt. Der Blog enthält einen guten Bericht dazu. In diesem kurzen Artikel werden wir die Angriffstransaktion verwenden, um zu erläutern, wie dies geschah.

Haftungsausschluss: Dieser Artikel basiert auf der öffentlichen Transaktion und unserem Verständnis des Mirror-Protokolls und des Terra-Ökosystems. Bitte lassen Sie uns wissen, wenn etwas ungenau ist. Kommentare zu diesem Blog sind willkommen.
1 Angriff
1.1 Vorbereitung
Die Transaktion wird zur Vorbereitung der Angriffe verwendet.
SCHRITT 1: In dieser Transaktion sendete der Angreifer zuerst 100.000 USTC an den Lock-Vertrag. Dies ist nicht notwendig, um eine Position zu eröffnen, aber entscheidend für den Angriff.

SCHRITT 2: Danach eröffnete der Angreifer eine Position, indem er 10 USTC als Sicherheit hinterlegte und ein collateral_ratio von 2,5 angab.

Die short_params sind angegeben, damit der Mint-Vertrag die geminteten mAssets (d.h. mETH) verkauft und die erhaltenen USTC zum gesperrten Betrag der Position hinzufügt.
SCHRITT 2.1: Wir gehen die Transaktion Schritt für Schritt durch. Zuerst wird die Funktion open_position aufgerufen, um eine Short-Position mit der ID 43186 zu eröffnen.

SCHRITT 2.2: Da die optionalen short_params hinzugefügt wurden, mintet der Vertrag zunächst 0,001208 mETH (basierend auf dem aktuellen ETH-Preis) und tauscht ihn dann im mETH-UST Pair gegen USTC.

Die 0,001208 mETH werden in 4,06582 USTC getauscht. Die getauschten USTC werden nach Abzug der entsprechenden Gebühren (z.B. Steuern) an den Lock-Vertrag gesendet. Das liegt daran, dass die eröffnete Position erst nach einer bestimmten Zeit entsperrt werden kann.

SCHRITT 2.3: Danach wird lock_position_funds_hook aufgerufen. In dieser Funktion wird position_locked_amount berechnet, indem current_balance abgefragt und die current_balance mit den locked_funds verglichen wird.

Wie in Schritt 1 gesehen, wurden jedoch 100.000 USTC direkt in den Lock-Vertrag übertragen, sodass der gesperrte Betrag etwa 100.004 USTC und nicht 4 USTC beträgt.

SCHRITT 2.4: Schließlich wird increase_short_token aufgerufen, um die sLP-Tokens zu registrieren.

Bis hierhin hat der Angreifer eine Position eröffnet, indem er 100.000 USTC direkt an den Lock-Vertrag und 10 USTC als Sicherheit gesendet hat. Der gesperrte Betrag der Position beträgt etwa 100.004 USTC und kann nach einer gewissen Zeit entsperrt werden. Der Angreifer eröffnete viele solcher Positionen, indem er 1.000 bis 100.000 USTC einzahlte.

1.2. Angriff
Der Mirror Protocol überprüft die Duplizierung der Positions-ID nicht. In diesem Fall kann der Angreifer viele doppelte Positions-IDs eingeben, um den gesperrten Betrag in einer Position immer wieder zu entsperren.
Die Transaktion ist die Angriffstransaktion. Für die Positions-ID 43186 hat der Angreifer beispielsweise 437 Mal dupliziert.

Da der ursprüngliche Vertragscode die Duplizierung nicht prüft, wurden etwa 43,7 Mio. (437 * 0,1 Mio.) USTC freigeschaltet (in diesem einzigen Funktionsaufruf).

Beachten Sie, dass auch andere Positionen mit demselben Mechanismus entsperrt wurden.
2. Bugfix
Die Schwachstelle wurde in diesem Commit behoben.

Genauer gesagt ist unlockable_positions ein Vektor, der die zu entsperrenden Positions-IDs enthält. Im ursprünglichen Code gab es keine Prüfung, ob doppelte IDs in unlockable_positions vorhanden sind. Der gepatchte Code fügt eine Prüfung auf Duplikate der Positions-IDs hinzu.
3. Fazit
Wie von @FatMan und anderen Community-Mitgliedern hervorgehoben, existierte dieser Fehler mehrere Monate lang und wurde bereits ausgenutzt. Wir sind der Meinung, dass das stille Patchen einer Schwachstelle, die bereits ausgenutzt wurde, keine gute Sicherheitspraxis ist. Darüber hinaus sind wir der Meinung, dass hochkarätige DeFi-Projekte einige Gatekeeper einsetzen sollten, um den Status ihrer Apps aktiv zu überwachen und benachrichtigt zu werden, wenn etwas Ungewöhnliches passiert.



