Wie Hacker EOS-Verträge angreifen und wie Sie dies verhindern

Kürzlich hat EOS Bet - eine dApp für Glücksspiele, die EOS-Token verwendet, am 15. Oktober mindestens 338.000 US-Dollar von ihren operativen Brieftaschen an Hacker verloren. Dies ist nicht das erste Mal, dass diese dApp gehackt wurde, seit dasselbe Unglück vor dem 14. September stattgefunden hat. Nicht nur EOS Bet, andere Dapp-basierte EOS leiden ebenfalls unter dem gleichen Problem.

Wie haben Hacker EOS Dapps angegriffen und Token gestohlen? In diesem Artikel erhalten Sie eine detaillierte Erklärung zu diesem Problem sowie einige Erfahrungen, die EOS-Entwickler beim Schutz ihrer Dapps vor Hackerangriffen gesammelt haben.

Überblick
1. Die Methode apply (), die in EOS smart contract verwendet wird
2. Wie sie EOSDice zweimal gehackt haben
3. Die gängigen Methoden zur Verhinderung von Hacking

Die Methode apply (), die in EOS smart contract verwendet wird

Warum erwähne ich diese Methode?

Als DApp-Entwickler besteht die allgemeine Aufgabe darin, die Zahlung zu überprüfen und Token von den Benutzern an den Vertrag zu senden und umgekehrt. Um mit diesem EOS-internen Vertrag arbeiten zu können, sollte der Vertragsinhaber die Methode apply () verwenden, um die Übertragungsaktion vom Token-Vertrag abzurufen. EOSIO behandelt dieses Thema jedoch nicht offiziell. Aus diesem Grund wurden die meisten EOS-Verträge von dieser Funktion aus gehackt: EOSBet, DEOS, EOS.WIN… Ich werde dies im Detail erläutern und mit einigen Erfahrungen aus den in EOSbet gehackten und anderen DApps schließen.

Wie funktioniert apply ()?

Definieren Sie in Ihrem Vertrag die Methode apply (), um die Transaktionsbenachrichtigung von eosio.token abzurufen. Sobald jemand EOS-Token auf Ihren Vertrag überträgt, holt er diese Transaktion auf und führt dann die Funktion mytransfer () mit gepackten Daten aus. Sehen Sie sich das folgende Flussdiagramm an:

Beispiel für die Methode apply ()

Um zu verstehen, wie diese Funktion funktioniert, gehen wir auf ein Beispiel ein: In meinem EOS-Vertrag möchte ich EOS-Zahlungen von Benutzern akzeptieren und meinen Token mit einem bestimmten Verhältnis an diese zurücksenden. Der detaillierte Code ist wie folgt:

Wie sie zweimal gehackt werden EOSDice.

EOSBEet wurde zweimal gehackt und der Hacker hat mehr als 100.000 EOS erhalten. Sie haben zwar Sicherheitsüberprüfungen von 2 Drittanbietern nach dem ersten Hack durchgeführt. Der zweite Angriff ist sehr clever und knifflig.

Heute werde ich Ihnen detailliert zeigen, wie der Hacker es Schritt für Schritt gemacht hat. Hier ist der EOSBet-Vertragscode.

Bitte beachten Sie die folgenden Codefunktionen von EOSBet, bevor es gehackt wurde:

Der Hack Nummer 1:

Im erwarteten Szenario akzeptiert der Vertrag nur die Übertragung aus dem eosio.token-Vertrag und verarbeitet sie dann. Aber was passiert, wenn wir die Funktion transfer () direkt aufrufen, um einen Vertrag abzuschließen?

Diese Aktion wird vom Knoten absolut abgelehnt, da die abi-Datei diese Funktion sowie die Datenparameter nicht unterstützt. Aber was passiert, wenn wir es über die Inline-Funktion aufrufen oder den Knotencode ändern, um die aufrufende Aktion direkt anzunehmen?

Ich wähle einen einfachen Weg - schreibe einen einfachen Hack-Vertrag, um die Inline-Funktion wie folgt aufzurufen:

Hier ist das Ergebnis, nachdem ich eine Aktion zum Hackcontract mit gefälschten Datenparametern gestartet habe. Dann würde Hackcontract die Übertragungsfunktion aufrufen, um die Wette zu spielen.

$ cleos push action Hackcontract Hack '["Hackcontract", "10000000.0000 SYS", "50"]' -p Hackcontract
$ cleos get table eosbettest12 eosbettest12 activebets {
"Reihen": [{
"id": 3931680559943168590,
"Wetter": "Hackcontract",
"Überweisung": "eosbettest12",
"bet_amt": "100000000000",
"roll_under": 50,
"seed": 6799ccac87b63a34dcec107a860c2463b84b687ac5a8c88dca6970b58acf6bf1,
bet_time: 2018-11-28T10: 10: 19
}]}

Wie Sie sehen, befindet sich die Wettreihenfolge bereits in der Warteschlange.

Lösung für den Hack Nummer 1:

Um diesen Fehler zu beheben, fügen Sie einfach eine Zeile als folgenden Code hinzu. Dies bedeutet, dass der Vertrag nur die Funktion zum Übertragen von Anrufen aus dem eosio.token-Vertrag akzeptiert. Andernfalls wird der Fall abgelehnt. Oder Sie können diese Check-in-Versandfunktion hinzufügen.

Der Hack Nummer 2

Der Hacker hat einen Fehler in der Versandübertragungsfunktion ausgenutzt. In dieser Funktion werden Vertragsdaten aus eosio.token gepackt, die Übertragung von / nach wird jedoch nie überprüft. Grundsätzlich hat der Hacker 2 Accounts A und Hacking-Vertrag B. A sendet Token an B, B holt diese Aktion nach und leitet sie über require_recipient () an eosbet weiter. EOSBet würde missverstehen, dass diese Aktion von eosio.token stammt, und sie verarbeiten.

Hier ist der Detailcode:

Nach der Übertragung des Tokens an Hackcontract befindet sich die Wettreihenfolge bereits in der Warteschlange.

$ cleos transfer myaccount hackcontract "1234567.0000 SYS" "50" -p myaccount
$ cleos get table eosbettest12 eosbettest12 activebets {
"Reihen": [{
"id": 2817973050780582232,
"Wetter": "Mein Konto",
"Überweisung": "eosbettest12",
"bet_amt": "12345670000",
"roll_under": 50,
"seed": e2a32f55658ebfa76a9d335abe532253326b86910b52e1b8c81f319c3d71ab73,
bet_time: 2018-11-29T04: 15: 27
}]}

Lösung für den Hack Nummer 2:

Denken Sie daran, zu überprüfen, wohin die Überweisung bei der Überweisung erfolgt ().

Die üblichen Methoden, um Hackerangriffe zu verhindern

Aktualisieren Sie den letzten Patch für die Funktion "Apply"

Bitte lesen Sie hier: https://medium.com/@eoscafeblock/contract-vulnerability-patch-57b948cacc3a

Verwenden Sie im Vertrag mit require_auth2 eine andere Berechtigung

Derzeit verwenden DApp-Entwickler normalerweise die Methode require_auth (), um die Berechtigung vom Absender der Aktion zu erhalten. Für den Fall, dass die Aktion require_auth (self) ausgeführt wird, sollten Sie den privaten Schlüssel des Vertragsinhabers auf dem Server speichern, wenn Sie dies automatisch ausführen möchten. Aber was passiert, wenn der Hacker diesen privaten Schlüssel gestohlen hat? Es ist absolut eine Katastrophe.

Um dieses Problem zu beheben, müssen Sie die Berechtigungsstufe in Ihrem Vertrag trennen.

Beispiel: Die Berechtigung für wichtige Aktionen (Vertrag festlegen, Token übertragen ...) ist aktiv und diese Aktion sollte manuell ausgeführt werden. Der Berechtigungscode für Aktionen ist weniger wichtig, daher wird er mit größerer Wahrscheinlichkeit automatisch ausgeführt. Anschließend können Sie den privaten Schlüssel des Berechtigungscodes auf dem Server speichern. Wenn jemand diesen Schlüssel gestohlen hat, gibt es nichts zu verlieren.

Stellen Sie sicher, dass in Ihrem Vertrag der Wartungsmodus zum Einfrieren des Vertrags aktiviert ist, wenn ein Fehler festgestellt wird

Cybersicherheit ist eine wirklich große Sache, besonders für die junge Technologie als Blockchain. Vorstehend meine Erklärung und mein Vorschlag für das aktuelle Hacking-Problem. Vielen Dank für das Lesen und denken Sie daran, Ihre Dapp Cybersicherheit immer zu beachten.

Von Quoc Le @ Lecle Vietnam Blog