Von BlockSec
Am 08. November 2022 haben wir festgestellt, dass einige Angriffe erfolgreich Vermögenswerte aus Pools abgezogen haben, die auf Sushis offiziellem KashiPairMediumRiskV1-Vertrag (oder einigen davon abgeleiteten Verträgen) basieren. Nach der Untersuchung haben wir festgestellt, dass die Grundursache ein Logikfehler ist, der zur Fehlberechnung der Token-Preise führt.
Wir haben sofort das Sicherheitsteam von Sushi kontaktiert und sie haben unsere Ergebnisse bestätigt. Das Gute daran war, dass sie Maßnahmen ergriffen, um einige wertvolle, aber anfällige Pools vor Angriffen zu schützen. Außerdem haben sie Verfahren bereitgestellt, um diejenigen zu entschädigen, die durch den Exploit Geld verloren haben. Daher glauben wir nun, dass es sicher ist, die Details über die Sicherheitslücke und die Angriffe offenzulegen. In diesem Bericht möchten wir eine detaillierte Analyse bereitstellen.
Schwachstellenanalyse
Nach der Analyse des Quellcodes des KashiPairMediumRiskV1-Vertrags kommen wir zu dem Schluss, dass dieser Fehler in der Borrow-Funktion liegt, die den veralteten Wechselkurs verwendet, um den geliehenen Anteil im Solvent-Modifikator zu überprüfen. Insbesondere wird die Überprüfung basierend auf dem aktuellen Wert von Wechselkurs in der Funktion _isSolvent durchgeführt.


Während der Liquidationsfunktion wird die Funktion UpdateExchangeRate ganz am Anfang aufgerufen. Daher werden die Überprüfung und Berechnung auf Grundlage des aktualisierten Werts durchgeführt.

Offensichtlich könnte dieser Fehler ausgenutzt werden, um einen (großen) Preisunterschied herbeizuführen.
Angriffsanalyse
Wir haben zwei Angriffe beobachtet:
https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: Das Opfer verwendet den KashiPairMediumRiskV1-Vertrag und der Verlust beträgt ungefähr 9.466 USDC.
https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: Das Opfer ist ein Strategievertrag, der CauldronMediumRiskV1 verwendet (der Fork von KashiPairMediumRiskV1), und der Verlust beträgt ungefähr 110.911 MIM.
Beachten Sie, dass die erste Angriffstransaktion von einem Bot gestartet wurde, der die ursprüngliche Angriffstransaktion vorwegnimmt: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18, und die ursprüngliche Angreiferadresse ist 0xb7ea0f0f8c6df7a61bf024db21bbe85ac5688005.
Hier nehmen wir als Beispiel die erste Angriffstransaktion, die aus den folgenden Schritten besteht:
Aufnahme eines Blitzkredits in Höhe von 40.900 BADGER und 121.904 USDC von Balancer.
Einzahlung von 40.900 BADGER und 113.599 USDC auf BentoBox.
Aufrufen der Funktion „addCollateral“ von kmBADGER/USDC-LINK, um 40.900.000.000.000.000.000.000 Aktien von BADGER einzuzahlen.
Aufrufen der Funktion addAsset von kmBADGER/USDC-LINK, um 112.529.000.000 USDC-Aktien einzuzahlen.
Aufrufen der Ausleihfunktion zum Ausleihen von 120.755.095.093 USDC-Aktien.
Aufrufen der Funktion UpdateExchangeRate .
Aufrufen der Liquidationsfunktion, um sich selbst zu liquidieren.
40.899 BADGER und 123.006 USDC von BentoBox abheben.
Rückzahlung des Blitzkredits und Erzielung eines Gewinns von etwa 9466 USDC.
Beachten Sie, dass Schritt 6 nicht notwendig ist, da die Ausleihfunktion die Funktion UpdateExchangeRate aufruft.
Die wichtigsten Schritte sind wie folgt:
Es ist nicht schwer herauszufinden, dass der in der Borrow-Funktion verwendete Wert von ExchangeRate von dem in der Liquidate-Funktion verwendeten Wert abweicht:
In der Ausleihfunktion: 250.997.938.545.109.237.740.214.705.193
In der Liquidationsfunktion: 328.266.883.541.864.569.505.752.156.794
Der Aufprall
Es gibt Dutzende von Pools (sowohl auf Ethereum als auch auf BSC), die von diesem Fehler betroffen sein könnten. Eine temporäre Methode, dieses Problem zu mildern, besteht darin, die Abweichung zu reduzieren oder zu eliminieren, indem man gelegentlich (oder regelmäßig) die Funktion UpdateExchangeRate aufruft. Diese Methode wurde bereits von vielen betroffenen Projekten übernommen und die entsprechenden Transaktionen können in freier Wildbahn beobachtet werden.
