Sicherheitslücken in der EOS-Blockchain bei ZeroNights 2018

Bild

In diesem Artikel werden einige echte Sicherheitslücken in der EOS-Blockchain (einer der Konkurrenten von Ethereum) und deren Einbettung in den Wettbewerb für sichere Spielautomaten der neuen Generation bei ZeroNights 2018 beschrieben. Wenn Sie wissen möchten, wie die Sicherheitslage ist dieses Blockchain-Netzwerk, dann willkommen unter Katze.

Eintrag


Alles begann damit, dass einer unserer Freunde uns kürzlich während eines Audits von Etherium-Smart-Verträgen auf Sicherheit einen Artikel über Schwachstellen in Smart-Verträgen im EOS-Netzwerk vorwirft. Dies hat uns sehr interessiert und wir haben uns entschlossen, die Sicherheitslücken genauer zu untersuchen.

All dies führte letztendlich zur Schaffung eines Wettbewerbs für ZeroNights 2018 mit dem Namen „Einarmiger Bandit“ mit Schwachstellen in einem intelligenten Vertrag.

Beginnen wir direkt mit dem Blick auf das EOS-Blockchain-Netzwerk, wie man damit arbeitet und wie alles darin angeordnet ist. Es gibt viele Artikel, die die Technologie im Internet beschreiben, daher wird es höchstwahrscheinlich keine technischen Details geben, aber wir werden versuchen, die allgemeine Bedeutung zu vermitteln, damit der durchschnittliche Benutzer eine grundlegende Vorstellung von den Arbeitsmechanismen der EOS-Blockchain erhalten kann.

Beschreibung der EOS-Technologie


EOS.io ist eine Blockchain der neuen Generation von Block.one , die auf dem Konzept von PoS ( Proof of Stake ) basiert.

Aus der Beschreibung der Ersteller des Netzwerks selbst: „EOS ist eine kostenlose Open-Source-Blockchain-Netzwerksoftware, die Entwicklern und Unternehmern eine Plattform zum Erstellen, Bereitstellen und Ausführen von dezentralen Hochleistungsanwendungen (DAPP) bietet.“

Wenn Sie versuchen, das Konzept auf den Punkt zu bringen, dann ist es ein gut reflektierter Auszug aus dem Wikipedia-Artikel:
Die Idee des Proof-of-Stake (PoS) besteht darin, das Problem des Proof-of-Work (PoW) zu lösen, das mit einem hohen Energieverbrauch verbunden ist. Anstelle der Rechenleistung der Teilnehmer spielt die Menge der Kryptowährung, die sie in ihrem Konto haben, eine Rolle. Anstatt eine große Menge Strom zur Lösung des PoW-Problems zu verwenden, hat der PoS-Teilnehmer einen begrenzten Prozentsatz möglicher Transaktionsprüfungen. Das Limit entspricht dem Betrag der Kryptowährung auf dem Konto des Teilnehmers
Das Netzwerk ist völlig neu und der erste Start des Hauptnetzwerks (Mainnet) fand am 10. Juni 2018 statt. Die Hauptkryptowährung ist EOS, und das Hauptportal für Entwickler ist developer.eos.io

Die EOS.io-Blockchain unterstützt Anwendungen, die von Benutzern mithilfe des WebAssembly-Codes (WASM) erstellt wurden, einem neuen Webstandard mit umfassender Unterstützung für große Unternehmen wie Google, Microsoft, Apple und andere.

Derzeit ist das neueste Toolkit zum Erstellen von Anwendungen, die Code in WASM kompilieren, clang / llvm mit dem C / C ++ - Compiler.

Zur besseren Kompatibilität empfehlen Entwickler die Verwendung des EOSIO CDT (Contract Development Toolkit) - einer Reihe von Dienstprogrammen der Entwickler selbst, mit denen Sie bequem und korrekt an der Erstellung intelligenter Verträge arbeiten können.

Der vorherige eosiocpp-Compiler ist bereits veraltet und wird nicht unterstützt. Daher wird jedem empfohlen, ein Upgrade auf das neue (zum Zeitpunkt des Schreibens) EOSIO CDT 1.5 durchzuführen.

Im Gegensatz zu Äther


Ether verwendet in seinem Konzept PoW (Proof of Work), was teure Berechnungen erfordert und die Belohnung an die erste Person gibt, die ein mathematisches Problem löst. Das heißt, diejenigen, die sich parallel entschieden, aber keine Zeit hatten, sich zu entscheiden, verschwendeten Energie. In dieser Situation kämpfen Bergleute untereinander um fortschrittlichere Technologien und Geräte. Schneller Blöcke generieren und damit verdienen.

Im Gegensatz zu Ether wählt das System im EOS-Netzwerk den Ersteller des neuen Blocks gemäß dem PoS-Konzept aus. Dies wird durch die Anzahl der persönlichen Status bestimmt - ein Bruchteil der Gesamtzahl der Kryptowährungen. Wer also mehr Glück hat, hat eine bessere Chance, vom System ausgewählt zu werden. Aber im Gegensatz zu PoW (Äther) gibt es im Prinzip keine Belohnung für die Erzeugung eines neuen Blocks, und das Einkommen der Bergleute ist ausschließlich die Provision aus Transaktionen.

Schlussfolgerung - Kryptowährungen, die auf PoW basieren, können 1000-mal energieeffizienter sein.

Wir entwickeln die Entwicklungsumgebung


Es scheint also, als hätten wir die Theorie beendet und wenden uns der Praxis zu. In der Praxis sieht aber alles viel interessanter aus. Mit der Dokumentation zu der Zeit, als wir im Sommer versuchten, es herauszufinden und etwas für ZeroNights 2018 zu tun, war alles sehr schlecht, und das Hauptentwicklungsportal war fehlerhaft, halb leer und funktionierte manchmal nicht einmal.

Testnetzwerke wurden noch nicht wirklich gestartet, daher musste ich meinen Knoten bereitstellen. Im Gegensatz zu den Meinungen im Internet stellte sich heraus, dass es nicht so schwierig war, es zu bekommen. Mithilfe der offiziellen Dokumentation haben wir sie über die Docker-Entwickler.eos.io/eosio-nodeos/docs/docker-quickstart gestartet

Lassen Sie uns über die wichtigsten Dienstprogramme sprechen, Programme für die Arbeit mit der EOS-Blockchain, mit denen ich mich zum Zeitpunkt der Arbeit am Wettbewerb befassen musste:

  • Knoten - in der Tat der Dienst des EOSIO-Knotens selbst; Sie können verschiedene Plugins konfigurieren und konfigurieren, z. B. CORS, Verlauf und andere.
  • Cleos ist ein Konsolendienstprogramm zum Arbeiten mit einem Knoten, zum Aufrufen von Vertragsmethoden und zum Interagieren mit einer Brieftasche, Schlüsseln und Zugriffen. Das häufigste Tool bei der Arbeit mit EOS.
  • Keosd ist eine Konsolenbrieftasche, genauer gesagt ein Brieftaschenservice, ein privater Schlüsselspeicher.
  • Eosio.cdt - Contract Development Toolkit, das sogenannte Set von Entwicklertools zum Debuggen und Kompilieren von Verträgen, Generieren von ABI-Dateien und mehr.
  • Eos.js - Javascript-API-Bibliothek für die bequeme Arbeit mit dem Knoten und Verträgen über das in die Site eingebettete Web.
  • Scatter ist eine Desktop-Brieftasche zur sicheren Aufbewahrung Ihrer Kontoschlüssel. Es gibt eine Webbibliothek dispers.js, die mit der Scatter-Desktop-Brieftasche auf Web-Sockets interagiert und dabei hilft, mit DAPP-Anwendungen im Browser zu arbeiten.

Uff! .. Ja, es gibt viele Programme, deren Verständnis auch nicht ganz einfach ist. Eine Beschreibung all dessen verdient einen separaten Beitrag und würde den Rahmen dieses Artikels sprengen. Stellen wir uns jedoch vor, wir haben einen Knoten auf unserem Server installiert und sogar gelernt, wie man Vertragsmethoden verwendet, um Vertragsmethoden aufzurufen, wenn wir eine hatten.

Ja, das Wichtigste. Wir müssen den intelligenten Vertrag selbst skizzieren. Wir werden es in C ++ schreiben und um zumindest etwas Vernünftiges zu tun, musste ich viel Dokumentation lesen.

Um die Verträge überall zu verstehen, geben Sie ein Beispiel für einen Hello- Vertrag. Die Hauptdatei ist hello.cpp und der gesamte Vertrag ist darin beschrieben.

#include <eosiolib/eosio.hpp> using namespace eosio; class hello : public eosio::contract { public: using contract::contract; /// @abi action void hi( account_name user ) { print( "Hello, ", name{user} ); } }; EOSIO_ABI( hello, (hi) ) 

Wenn Sie es kurz erklären wollen, dann ist hier alles einfach . Wir laden die Bibliothek eosio.hpp, erstellen dann die Hallo-Klasse (auch als Vertrag bezeichnet) und erben den Klassenvertrag. Wir erstellen die void hi-Methode und geben die Benutzervariable vom Typ account_name in die Parameter ein. Sie ist auch uint64_t. Drucken Sie in der Methode "Hallo" und den Namen, den wir beim Aufruf der Methode angeben. Die letzte Zeile, in der sich EOSIO_ABI befindet, ist ein Hilfsmakro, das unsere Klassen- und öffentlichen Methoden aus dieser Klasse akzeptiert und auch an der Bildung der .abi-Datei beteiligt ist, in der alle öffentlichen Methoden des Vertrags angegeben sind.

Sicherheitslücken erkunden


Im Rahmen dieses Artikels wurden mehrere Sicherheitslücken beschrieben. Lassen Sie uns diese nun genauer betrachten.

Numerischer Überlauf - Numerischer Überlauf


Wenn der Vertrag aufgerufen wird, überprüft der Knoten den Typ des Parameters, und wenn die Daten, die wir zu füttern versuchen, nicht passen, beginnt der Knoten zu schwören und solche Gräueltaten werden nicht übersehen. ABER! Wenn es einen Algorithmus zum Ändern der Zahl, der Summe der Zahlen oder beispielsweise der Multiplikation innerhalb des Vertrags gibt, kann sich die Zahl bereits innerhalb des Vertrags ändern. Dies bedeutet, dass Sie eine Nummer angeben können, die der Knoten überspringt, aber den Vertrag multipliziert. Die Nummer geht dann über den gültigen Datentyp hinaus, was zu einem Überlauf führt.

Was kann es geben? Beispielsweise wird nach einem numerischen Parameter gesucht, z. B. int Number <0, und es ist bekannt, dass int y eine vorzeichenbehaftete Zahl ist. Wenn ein Überlauf einer Zahl auftritt, ändert sich das Vorzeichen der Zahl für große Werte in negativ. Somit wird der Scheck übergelaufen. Und hier hängt natürlich alles von der Kritikalität dieser Prüfung ab.

Im selben Artikel über Sicherheitslücken gibt es beispielsweise einen realen Fall, in dem Angreifer den Balance-Parameter beeinflussen und so das System austricksen konnten. In den Codekommentaren wird der Mechanismus der Interaktion mit dem Vertrag ausführlicher beschrieben:

 //      typedef struct acnts { account_name name0; account_name name1; account_name name2; account_name name3; } account_names; //     (   1 EOS) //  ,     , //      «» void batchtransfer( symbol_name symbol, account_name from, account_names to, uint64_t balance ){ //    require_auth(from); //    account fromaccount; //      require_recipient(from); require_recipient(to.name0); require_recipient(to.name1); require_recipient(to.name2); require_recipient(to.name3); // ,       . //   is_balance_within_range   ( eosio_assert(is_balance_within_range(balance), "invalid balance"); // ,      «» //  , «» 1111111111111111  0,     eosio_assert(balance > 0, "must transfer positive balance"); //   amount    4 //     ,  amount   int64_t amount = balance * 4; //     from,    int itr = db_find_i64(_self, symbol, N(table), from); // ,    eosio_assert(itr >= 0, "wrong name"); //    fromaccount   db_get_i64(itr, &fromaccount, (account)); // ,       // ,    0.1 EOS //    ,    amount eosio_assert(fromaccount.balance >= amount, "overdrawn balance"); //   sub_balance(symbol, from, amount); //    4  add_balance(symbol, to.name0, balance); add_balance(symbol, to.name1, balance); add_balance(symbol, to.name2, balance); add_balance(symbol, to.name3, balance); } 

Das Hacken wurde höchstwahrscheinlich wie folgt durchgeführt. Der Angreifer hat 4 Konten vorab erstellt und die Batchtransfer- Methode direkt aufgerufen.

 cleos push action contractname batchtransfer \'{"symbol ":"EOS", "from":”attacker”, "to":{ “name0”:”acc0”, “name1”:”acc1”, “name2”:”acc2”, “name3”:”acc3”}, "balance":"111111111111111111 EOS"}' -p attacker@active 


Bild

Ich werde sofort eine Reservierung vornehmen, dies ist nur eine Annahme; Wie genau sie den Hack gemacht haben - wir wissen nicht, und wenn es andere Gedanken zu dieser oder genaueren Informationen gibt, schreiben Sie in die Kommentare.

Autherisierungsprüfung


Das Fehlen einer Überprüfung der Vertragsmethode require_auth () für die Benutzerautorisierung führt dazu, dass jeder, der nicht über die erforderlichen Rechte verfügt, die privilegierten Methoden des Vertrags verwenden kann, z. B. Geld vom Vertrag abheben kann.

Fehlende Überprüfung des Methodenaufrufs


Wenn Sie Geld an einen Vertrag (EOS) senden, können Sie in einem speziellen Makro angeben, was als nächstes passieren wird und was zu tun ist. Angenommen, wenn Sie Geld erhalten, wird ein bestimmter Algorithmus aufgerufen, um beispielsweise Roulette oder etwas anderes zu starten, sowie ein Scheck:

 if( code == self || code == N(eosio.token) || action == N(onerror) ) { \ TYPE thiscontract( self ); \ switch( action ) { \ EOSIO_API( TYPE, MEMBERS ) \ } } //    action == N(transfer) 

Bei dieser Prüfung gibt es keine Einschränkung für den Aufruf der Überweisungsmethode, weshalb Sie die Überweisungsmethode direkt aufrufen können, ohne Geld an den Vertrag zu senden. Und das bedeutet, den Mechanismus mit einem weiteren Gewinn zu starten, ohne einen Cent auszugeben.

ZeroNights 2018 Wettbewerb


Die Idee des Wettbewerbs wurde von selbst geboren: Da alles mit Spielen und drei Schwachstellen verbunden ist, werden wir das Spiel über den intelligenten Vertragsmechanismus in der EOS.io-Blockchain erstellen. Das Spiel sollte so einfach wie möglich, aber interessant sein.

Spielautomat "Einarmiger Bandit"! Leute, die sich nach einfachem Geld sehnen, haben mich immer überrascht - denken Sie daran, es gibt keine oder fast keine Werbegeschenke auf der Welt. Hier ist es übrigens ziemlich da, oder besser gesagt, es wird erscheinen, wenn Schwachstellen verwendet werden.

Frontend


Sie beschlossen, die Front-End-Spiele modisch, schön und dreidimensional zu gestalten. Vielen Dank an vtornik23, dass Sie sich nicht geweigert haben, daran teilzunehmen, und uns geholfen haben, ein vollständiges Frontend für die Unity3d-Engine zu erstellen.

Bild

Dreidimensionaler Spielautomat "einarmiger Bandit"; Wenn der Spieler 1 EOS darauf sendet und an einem intelligenten Hebel zieht, hat er die Möglichkeit, das Glücksrad zu starten und den Jackpot zu knacken!

Vertragsschwachstellen


Nach der Idee des Spiels wurde der Gewinn als Verlust von drei ZeroNights-Puppen angesehen, die im numerischen Koeffizienten entweder 777 oder 0 betragen würden. Die Gewinnchancen wurden mit 0,02% gleichgesetzt, und einige unaufmerksame Programmierer versuchten, den Zufallsalgorithmus zu komplizieren, indem sie nur einen Multiplikationsüberlauf hinzufügten die Menge des gesendeten Geldes, und war zu faul, um genauer über die Bedingungen nachzudenken, also schrieb ich nur if (Ergebnis == 777 || Ergebnis <1), was es möglich macht, einen negativen Wert zu verschieben.

  int rnd = random(999); int result = rnd * price.amount; uint64_t prize = 0; print("Result:", result); // BINGO 777 or 000 !!! ~ 0.02% if(result == 777 || result < 1 ) { prize = 100; sendtokens(from); } 

Der Smart-Vertrag selbst ist auf dem Github angelegt , sodass jeder ihn von allen Seiten genauer betrachten und andere Schwachstellen identifizieren kann. Sie wurden bereits etwas höher über sie geschrieben, daher sollte es keine Schwierigkeiten geben, sie zu finden.

Teilnahmebedingungen


Die Teilnahmebedingungen sind sehr einfach: Es musste versucht werden, die Mechanismen des Systems zu gewinnen oder zu hacken. Wenn 3 Matroschkas ausfallen - Jackpot !!! Das System berechnet 100 Einheiten Kryptowährung. Wenn ein Teilnehmer dreimal hintereinander einen Jackpot erhält, wird er ein Gewinner und erhält Preise von den Organisatoren - Marken-Hoodies, Abzeichen, eine Vielzahl von Merch.

Natürlich könnten Sie gewinnen, indem Sie lange auf den Hebel ziehen und auf Glück hoffen, aber das Glück ist unvorhersehbar und der Prozentsatz der Gewinne ist sehr gering, sodass es einfacher war, zu hacken.

Wettbewerbsergebnisse


Infolgedessen war der Wettbewerb unserer Meinung nach perfekt. Für 3 Personen waren Belohnungen geplant, und nur drei konnten den Wettbewerb vor dem geplanten Enddatum bewältigen. Der Wettbewerb dauerte 2 Tage, in denen die Teilnehmer die Aufgabe lösen mussten. Die offizielle Auszeichnung und Präsentation der Geschenke erfolgte zum Abschluss der Konferenz auf der Hauptbühne von ZeroNights 2018.

Das Hauptaugenmerk lag auf dem Wissen über die EOS-Blockchain-Technologie, und wir haben ein paar Tipps hinterlassen, von denen keiner einen finden konnte. Wir werden dieses Rätsel für später verlassen ...

Teilnehmerbewertungen


Alexey (1 Platz)
ZeroNights ist eine meiner Lieblingskonferenzen, beginnend mit der allerersten, in St. Petersburg habe ich keine einzige verpasst. Es gibt sicher immer Begeisterung für sechs Monate, und dort im Frühjahr PHDays :). In den letzten 3 Jahren habe ich Blockchain-Entwicklung gemacht. In diesem Jahr erreichte die Blockchain ZeroNights (in der Vergangenheit schien die Wahrheit dieselbe zu sein, sie war auf der Hackvest, aber ich habe sie verpasst). Nachdem ich mich für die Konferenz angemeldet hatte, ging ich zunächst nach, was und wie es mit der Blockchain gab. Ich dachte, es wäre so etwas wie PHDays, eine Art zufälliger Kurven- oder Rennzustand in der Luft. Aber hier war EOS, mit dem ich beim ersten EOS-Hackathon ein wenig vertraut war, aber es dauerte nicht lange, und außerdem gingen alle Einstellungen für die Entwicklung verloren. Der Kampfgeist ließ nach und ich wartete auf den Beginn der Konferenz. Aber die Neugier wurde immer größer, was mit der EOS los ist!

Stanislav Povolotsky (2. Platz)
Für mich war es ein langer, aber interessanter Wettbewerb. Und es war eine großartige Gelegenheit, die Architektur der EOS-Blockchain kennenzulernen. Der Wettbewerb begann mit der Überraschung, dass Sie nicht in das EOS-Netzwerk (Mainnet) gelangen - nur für $$$. Nachdem Sie aufgefordert wurden, den Vertrag im Testnetzwerk bereitzustellen, sich in diesem Netzwerk zu registrieren, Streuung einzurichten und den Transaktionsverlauf für den Spielvertrag anzuzeigen, wurde sofort klar, wie Sie den Spielautomaten betrügen sollten (der Autor des Vertrags hat dies während des Tests mehrmals getan). Das Vertrauen, dass es so schnell und einfach ist, den Wettbewerb zu verwalten, verschwand jedoch schnell, sobald das Netzwerk nicht alle meine Transaktionen mit Parametern genehmigte, die mit der Gewinntransaktion identisch waren.

Irina (3. Platz)
Bevor sie am Wettbewerb teilnahm, präsentierte sie die Arbeit von Smart Contracts nur theoretisch. Daher war es sehr interessant, sie „live zu treffen“, den Quellcode zu sehen, die Tools auszuprobieren (und erneut sicherzustellen, dass Python das Beste ist). Die Aufgabe erwies sich als sehr aufregend. Vielen Dank!

Und zum Schluss


Um nicht zu sagen, dass jeder leicht zurechtkam. Für einige war es 2 Tage lang schwierig, und nur am Ende gelang es den Glücklichen, mit den Mängeln einer Blockchain zu gewinnen. Wenn die Informationen in die Blockchain gelangt sind, sind sie für alle zugänglich, und wenn jemand bereits etwas gehackt hat, kann der andere sie sehen der Weg.

Wir danken allen Teilnehmern und denen, die bei der Organisation des Wettbewerbs mitgeholfen haben.
Wir sehen uns bei ZeroNights 2019, neue Abenteuer erwarten Sie!

Source: https://habr.com/ru/post/de433552/


All Articles