Zwei verschiedene Bugs in einem Fork des Leveraged-Trading-Protokolls von Gains Network hätten es Händlern ermöglichen können, bei jedem Trade einen Gewinn von 900 % zu erzielen, unabhängig vom Preis des gehandelten Tokens, heißt es in einem Bericht des Blockchain-Sicherheitsunternehmens Zellic vom 19. April. Einer der Bugs existierte in einer früheren Version von Gains, wurde aber später gepatcht. Der andere wurde nur in einem Fork des Protokolls gefunden.

Laut Zellic informierten seine Mitarbeiter die Entwickler der Gains-Forks Gambit Trade, Holdstation Exchange und Krav Trade über die Sicherheitslücke und diese Entwicklungsteams haben sichergestellt, dass ihre Protokolle keine derartigen Fehler enthalten. Andere Gains-Forks könnten jedoch immer noch anfällig sein, warnte Zellic.

Laut seiner offiziellen Website ist Gains Network ein Ökosystem dezentraler Finanzprodukte (DeFi) auf Polygon und Arbitrum. Der offizielle Name seiner Leveraged-Trading-App lautet „gTrade“. Laut der Blockchain-Analyseplattform DefiLlama hat es seit seiner Gründung im Mai 2023 ein Derivatevolumen von über 25 Milliarden US-Dollar ermöglicht.

Benutzeroberfläche für gTrade, die Leveraged-Trading-App von Gains Network. Quelle: Gains Network

Zellic behauptete, dass mehrere beliebte DeFi-Handels-Apps vom Basiscode von Gains Network abgeleitet sind, darunter die bereits erwähnten Gambit Trade und Holdstation sowie viele andere Protokolle. Sie entdeckten den Exploit beim Studium eines bestimmten Forks, lehnten es jedoch ab, zu sagen, in welchem ​​Fork sie ihn entdeckten.

Dem Bericht zufolge können Benutzer mit Gains Network-Verträgen entweder eine Markt-, Umkehr- oder Momentum-Handelsorder eröffnen. Eine Marktorder kauft oder verkauft einen Vermögenswert sofort, unabhängig vom Preis.

Wenn ein Benutzer die Eröffnung eines Momentum- oder Umkehrhandels anfordert, zeichnet der Smart Contract eine „Order“ auf, die Daten darüber enthält, zu welchem ​​Preis der Benutzer bereit ist zu handeln. Sobald dieser Preis erreicht ist, kann jeder Benutzer die Funktion „executeLimitOrder“ aufrufen, um die Order auszuführen. Der Benutzer, der die Ausführung aufruft, muss nicht derselbe sein, der die Order aufgegeben hat. Benutzer, die die Ausführung aufrufen, erhalten für die Ausführung dieser Rolle eine kleine „Ausführungsgebühr“.

Auf diese Weise können Benutzer Limit- (Momentum-) und Stop-Limit-Orders (Umkehr-Orders) auf ähnliche Weise platzieren wie bei einer zentralisierten Börse, allerdings ohne dass für die Auftragsausführung eine zentralisierte Stelle erforderlich ist.

Wenn ein Benutzer eine Bestellung aufgibt, kann er einen Take-Profit-Preis, einen Stop-Loss-Preis oder beides festlegen. Ziel dieses Designs ist es, Händlern zu ermöglichen, einen profitablen Handel automatisch am Take-Profit-Punkt oder einen Verlusthandel am Stop-Loss-Punkt zu beenden.

Fehler im Gains Fork ermöglichte 900 % Gewinn bei Kaufaufträgen

Zellic entdeckte in dem untersuchten Gains-Fork, dass beim Öffnen einer Order der Stop-Loss-Preis in der Variable „currentPrice“ gespeichert wurde, die zur Berechnung von Gewinn und Verlust verwendet wird. Das bedeutete, dass ein Benutzer, der den Stop-Loss über dem Eröffnungspreis setzen konnte, automatisch von jedem Handel profitieren konnte.

Stellen Sie sich beispielsweise ein Szenario vor, in dem der Preis von Bitcoin (BTC) 63.000 USD beträgt und der Benutzer 62.000 USD als Eröffnungspreis und 64.000 USD als Stop-Loss eingegeben hat. In diesem Fall würde die Bestellung ausgeführt, wenn der Preis auf 62.000 USD fallen würde. Der Preis würde jedoch unmittelbar unter seinem Stop-Loss liegen, was einen automatischen Ausstieg auslösen würde.

Darüber hinaus würde der vom Benutzer festgelegte Stop-Loss als aktueller Preis aufgezeichnet. Dies bedeutete, dass der Benutzer einen Gewinn von 2.000 USD erzielen würde, obwohl der korrekte Gewinn ungefähr 0 USD hätte betragen müssen. Dies hätte es einem Angreifer ermöglichen können, von jedem Handel zu profitieren und schließlich das Protokoll vollständig zu entleeren.

Um diesen Exploit zu verhindern, enthielt das Protokoll eine Prüfung, die einen „wrong_sl“-Fehler auslöste, wenn der Benutzer versuchte, seinen Stop-Loss bei einer Kauforder über dem Eröffnungskurs festzulegen.

Gains Network Fork Check, um falsche Take-Profit- oder Stop-Loss-Bestimmungen zu vermeiden. Quelle: Zellic

Allerdings stellten die Ermittler fest, dass diese Kontrolle unter bestimmten Umständen umgangen werden könnte.

Wenn ein Benutzer zum ersten Mal eine Bestellung eröffnete, legte er den Preis fest, zu dem er den Handel eröffnen wollte. Dieser wurde dann in der Variable „openPrice“ aufgezeichnet. An diesem Punkt wurde die Prüfung durchgeführt. Die Funktion, die zur Ausführung einer Bestellung verwendet wurde, änderte diese Variable jedoch in den Wert „a.Price“, der dem aktuellen Preis zuzüglich der Preiseinflüsse aus der eröffneten Bestellung entsprach.

Das bedeutete, dass ein Ausführender die Prüfung umgehen konnte, indem er den Auftrag einfach ausführte, wenn der Benutzer einen extrem hohen Eröffnungskurs eingab. Außerdem konnte der Ausführende den Auftrag zu einem Eröffnungskurs ausführen, der unter dem ursprünglich festgelegten lag.

Als Beispiel betrachtete Zellic die Idee eines Angreifers, der eine Bestellung zum Kauf eines Tokens für 100.000 $ (1 Billiarde $) aufgibt und einen Stop-Loss bei 1 $ weniger oder 999,999999999999 Billionen $ festlegt. Sobald die Bestellung aufgegeben wurde, führt der Angreifer seine eigene Bestellung aus, wodurch sich der OpenPrice von 100.000 $ auf den aktuellen Preis ändert, nachdem die Preiseinflüsse des Handels berücksichtigt wurden.

Der Trade wird dann ausgeführt und eröffnet. Solange der resultierende Eröffnungskurs unter dem ursprünglich festgelegten Stop-Loss liegt, kann er nun durch Ausführen des Stop-Loss geschlossen werden. Wenn der Angreifer seinen eigenen Stop-Loss ausführt, profitiert er von der Differenz zwischen dem Schlusskurs und dem Kurs des Stop-Loss.

Der Handel hätte dem Angreifer einen Gewinn von 900 % eingebracht, behauptete Zellic.

Beispiel für einen Gains Fork Exploit. Quelle: Zellic

Dieser Fehler war zum Zeitpunkt, als das Zellic-Team ihn entdeckte, in Gains Network nicht vorhanden. Er existierte nur in der gegabelten Version, die es untersuchte. Bei der Untersuchung dieses Problems stieß es jedoch auf einen zweiten Fehler, der in einer früheren Version von Gains selbst vorhanden war.

Zweiter Fehler ermöglichte 900 % Gewinn bei Verkaufsaufträgen

Durch den zweiten Fehler konnten Händler unabhängig von der Kursentwicklung mit Verkaufsaufträgen einen Gewinn von 900 % erzielen.

Wenn ein Trade im Gains-Fork geschlossen wurde, konvertierte er den Stop-Loss- oder Take-Profit-Punkt des Benutzers in eine Variable namens „int“, die dann zur Berechnung des Gewinns in Prozent verwendet wurde. Wenn ein Benutzer jedoch einen Stop-Loss- oder Take-Profit-Wert eingegeben hätte, der genau 2^256-1 gewesen wäre, hätten die resultierenden Berechnungen dazu geführt, dass „int“ negativ geworden wäre.

Dies lag daran, dass 2^256-1 der Maximalwert für positive Zahlen in Ethereum ist, wodurch jeder Wert darüber „überläuft“ oder bei Null neu beginnt, und daran, dass bei der Berechnung der Eröffnungskurs zum Gesamtwert addiert wurde. In der Programmiersprache Solidity wird 2^256-1 auch als „type(uint256).max“ bezeichnet.

Laut Zellic könnte ein Angreifer, der einen Hebel von mehr als dem 9-Fachen nutzt, von diesem Exploit einen Gewinn von 900 % erzielen:

„Betrachten wir eine Verkaufsorder mit currentPrice als type(uint256).max. Der resultierende Wert von diff wäre openPrice + 1 (int(type(uint256).max) = -1), und daher wäre der Gewinnprozentsatz fast gleich 100 * Leverage. Wenn der Leverage also größer als 9 ist, gibt die Funktion den Gewinn als 900 % zurück.“

Es gab eine Prüfung im Vertrag, die verhindern sollte, dass 2^256-1 als Take-Profit eingegeben wurde. Diese Prüfung wurde jedoch nur durchgeführt, als die Bestellung zum ersten Mal geöffnet wurde. Wenn der Benutzer seinen Take-Profit-Punkt nach der Eröffnung der Bestellung änderte, konnte er die Prüfung umgehen und 2^256-1 als Take-Profit eingeben, wodurch er bei jedem Handel automatisch einen Gewinn von 900 % erzielen konnte.

Dieser zweite Fehler war in einer früheren Version von Gains vorhanden, wurde aber später behoben. Die aktuelle Version enthält diesen Fehler nicht, da sie die Prüfung sowohl bei der Aktualisierung von Take-Profit und Stop-Loss als auch bei deren erstmaliger Festlegung durchführt.

Zellic hat Berichten zufolge alle oben genannten Forks über diese beiden Sicherheitslücken informiert und die Crypto Security Alliance kontaktiert, um weitere Protokolle zu finden, die davon betroffen sein könnten. Die Allianz warnte jedoch, dass einige Gains-Forks diese Fehler immer noch enthalten könnten, wodurch die Gelder der Benutzer gefährdet seien.

Cointelegraph hat Gains Network, Gambit Trade, Holdstation Exchange und Krav Trade um einen Kommentar gebeten, bis zum Veröffentlichungszeitpunkt jedoch keine Antwort erhalten.

Gains Network behauptet, dass es den „echten Spotpreis“ der gelisteten Vermögenswerte angibt, im Gegensatz zu den seiner Ansicht nach weniger genauen Preisen auf Grundlage unbefristeter Verträge. Es behauptet auch, im Vergleich zu den Mitbewerbern einen besseren Devisenhandel anzubieten.

Verwandt: Libra-bezogene Sui-Blockchain behebt kritischen Fehler, der „Milliarden“ gefährdete