Seite auswählen
Dieser Artikel wurde ursprünglich auf dieser Seite veröffentlicht.

Am 22. August hat jemand die erste Runde von Fomo3D gewonnen. Eine Analyse von SECBIT Labs zeigt, dass hinter diesem Sieg ein kontrollierter Angriff auf das Spiel stand. 

Auch wenn es schon vor über einer Woche passierte, lohnt sich ein detailreicher Blick: Am 22. August 2018 gewann ein Unbekannter die erste Runde von Fomo3D – und damit fast 10.500 Ether. Das entspricht nach aktuellem Preis ungefähr 3 Millionen US-Dollar.

Alles deutet darauf hin, dass der Gewinner kein normaler Teilnehmer war, sondern verschiedene Tricks anwandte, um das Spiel zu seinen Gunsten zu manipulieren. SECBIT Labs haben die Strategie des hinter der Adresse 0xa169df5ed3363cfc4c92ac96c6c5f2a42fccbf85 stehenden Gewinners/Hackers genauer untersucht. Die Details hinter dem Gewinn der ersten Runde von Fomo3D lesen sich wie ein Cyberkrimi, in der ein großer Scammer ein Spiel/Schneeballsystem manipulierte.

Wie funktioniert Fomo3D?

BTC-ECHO hat Fomo3D in einem Artikel kurz beschrieben. Das grobe Spielprinzip lässt sich als „Spiel mit der Gier“ zusammenfassen: Ein Timer zählt herunter. Während dieses Countdowns können Mitspieler sich einen „Private Key“ kaufen. Mit jedem Kauf werden diese Keys teurer. Wenn jedoch für eine bestimmte Zeit kein Kauf stattfindet oder ein globaler Countdown abgelaufen ist, hat jener, der den letzten Key kaufte, 48 Prozent des gespeicherten Ethers. Der Rest wird zwischen verschiedenen Teams aufgeteilt, die für unterschiedliche Strategien stehen. Wer mehr über die Regeln erfahren möchte, sei auf das Wiki von Fomo3D verwiesen.

Spurensuche auf der Blockchain

Dank der Transparenz der Ethereum-Blockchain lässt sich der Sieg der Entität hinter der Adresse  0xa169df5ed3363cfc4c92ac96c6c5f2a42fccbf85 gut nachvollziehen. Für uns interessant ist die Entwicklung zwischen 6:48 und 6:50 des 22. August 2018.

Die entsprechenden Blöcke auf der Ethereum-Blockchain, Block 6191898 und 6191908, sind ungewöhnlich klein. Sie enthalten durchschnittlich 14 Transaktionen – was deutlich geringer als die 100 Transaktionen ist, die es durchschnittlich alle 15 Sekunden in einen Block schaffen.

Im Kontrast dazu beinhalten die Blöcke Transaktionsgebühren von durchschnittlich 21 US-Dollar, was fast viermal so hoch wie das Allzeithoch Anfang 2018 ist. Der Angreifer hat also bewusst Transaktionen mit hohen Gebühren initiiert.

Das allein wäre für so manchen Miner ein Honeypot, der schnell wenige, aber lukrative Transaktionen zu einem Block zusammenfasst und so diese vor anderen Minern bearbeitet. Über Etherscan lässt sich jedoch bestätigen, dass die relevanten Blöcke von unterschiedlichen Minern gemint wurden. Einige der erfolgreichen Miner waren SparPool, BitClubPool, Nanopool oder Ethermine.

Wir können über die Blockchain nachvollziehen, dass alle relevanten Transaktionen indirekt an den Gewinner von Fomo3D gingen; dazwischen war ein Smart Contract geschaltet. Der Quellcode von diesem ist leider nicht einsehbar, aber man kann vermuten, was der Smart Contract tat. SECBIT Labs vermutet, dass der Smart Contract zwei Funktionen durchführte.

Ein Block hinter den Contract des Hackers

Zum einen griff er auf eine Funktion hinter Fomo3D zu: Über getCurrentRoundInfo() kann man Informationen wie das Ende der Runde oder den letzten Käufer erhalten.

Mit diesen Transaktionen wird es noch seltsamer: sie schlugen alle fehl. Außerdem ist immer das Gas-Limit erschöpft. Anscheinend wandte der Smart Contract zum zweiten einen Trick an, mit dem das Block Limit, welches die jeweiligen Miner vorgaben, schnell erreicht werden konnte. Es ist bekannt, dass der Solidity-Befehl assert(), speziell wenn dies zu einem Fehler führt, viel Gas benötigt. Da dieser zu dem Fehler „Bad Instruction“ beziehungsweise dem 0xfe-Opcode führt, kann man bestätigen, dass alle fehlgeschlagenen Transaktionen eben assert() nutzten.

Fassen wir zusammen: Der Angreifer konnte über getCurrentInfo() abschätzen, wie knapp aktuell die Deadline ist und ob er der aktuell letzte Key-Käufer ist. Über den Missbrauch der assert()-Funktion konnten Blöcke bezüglich des Gases schnell gefüllt werden. Wenn die Zeit zu Ende ging und der letzte Käufer der Angreifer war wurde das Gas Limit der Blöcke wie oben beschrieben durch Manipulation erreicht. Durch vielfaches Anwenden konnte der Angreifer das Spiel beschleunigen und die Gewinnwahrscheinlichkeit für sich selbst extrem hochmanipulieren.

Soweit war es schon recht genial. So genial, dass der Smart Contract auch bei anderen derartigen Spielen genutzt wurde, beispielsweise bei Super Card. Auch Last Winner zeigt ähnliche Auffälligkeiten, würde jedoch hier den Rahmen sprengen.

Lessons Learned nach Fomo3D

Bei Spielen mit starkem Schneeball-Charakter wie Fomo3D oder Last Winner passt es, zynisch betrachtet, dass der Gewinner mit unlauteren Mitteln gewann. Außerdem zeigt die Raffinesse der Hacker sowohl die Möglichkeiten als auch die Risiken von Smart Contracts, speziell wenn diese miteinander interagieren.

Im März haben wir eine Studie diskutiert, nach der drei Prozent aller Smart Contracts Sicherheitslücken besitzen. In dem verlinkten Artikel wurde darauf hingewiesen, dass man auf Formulierungen wie xxx is yyy achten und ohnehin besonders skeptisch sein sollte bei Smart Contracts im Opcode oder Bytecode, sprich sie nicht in Solidity sein sollten. Was die Entwicklungen im Kontext um Fomo3D und ähnlichen Spielen betrifft, heißt das auch, dass man sich um andere Smart-Contract-basierte Spiele Sorgen machen sollte. Die wichtigste zusätzliche Lesson learned ist, dass man das Verhalten der Mitspieler genauer beobachten sollte. Dank der Transparenz der Blockchain ist das, wie SECBIT bewiesen, auch möglich.

Dieser Artikel erschien zuerst auf BTC-ECHO.

Bildquellen: https://pixabay.com