Sicherheitsprobleme in Smart Contracts
Wie ein Angreifer 60 Millionen Dollar aus einem Smart Contract stehlen konnte (05.12.2018)
Förderjahr 2017 / Project Call #12 / ProjektID: 2158 / Projekt: EtherTrust

Fehlerhafte Smart Contracts wurden in der Vergangenheit schon häufiger ausgenutzt um Geld zu erbeuten. Wie das funktionieren kann und welche Art von Fehlern in Smart Contracts dafür verantwortlich sind, erklären wir hier.

Hallo zusammen,

Heute wollen wir ein bisschen etwas über die typischen Probleme in Smart contracts erzählen und wie man mithilfe von EtherTrust (hoffentlich bald!) testen kann, ob diese Probleme auftreten.

Das bekannteste Beispiel für einen verheerenden Fehler in einem Smart contract, war der sogenannte TheDAO contract. DAO steht für „Decentralized autonomous organization“ - also eine dezentrale, autonome Organisation. Etwas spezifischer kann man sich das ganze vorstellen wie eine Crowdfunding Platform (wie beispielsweise Kickstarter). Auf so einer Platform können Menschen ihr Geld spenden um ein Projekt zu finanzieren, aber falls zum Beispiel der notwendige Mindestbetrag nicht erreicht wird, bekommen sie ihr Geld sicher wieder zurück.

Jetzt stellt sich natürlich die Frage, was bei so einen Vertrag schief gehen kann?

Wie so häufig bei Programmierfehlern, liegt das Problem darin, dass es leider nicht ganz so einfach ist als Programmierer eine eher abstrakte Idee in ein Stück Code zu übersetzten, dass genau diese Idee widerspiegelt. Das kann zum einen daran liegen, dass man die genaue Semantik (siehe hier) der verwendeten Programmiersprache nicht kennt, oder man nicht alle Randfälle bedenkt. Genau das ist im Fall des DAO Contracts passiert:

Dieser Contract stellte nämlich eine Funktionalität bereit, damit Spender ihr Geld wieder zurück erhalten konnten und genau diese Funktionalität hatte einen entscheidenden Fehler: Sie erlaubte es nämlich einem Angreifer nicht nur das eigene Geld zurück zu erhalten, sondern auch das Geld von allen anderen Spendern zu stehlen!

Der Grund dafür ist eine Eigenheit in der Semantik von Smart Contracts, die vielen Entwicklern nicht bewusst ist. Das problematische Konstrukt haben wir schon im letzten Beitrag kurz angesprochen: Nämlich, dass es ein Konstrukt gibt, das gleichzeitig Geld überweist und Code ausführt.

Um das Problem, das daraus im DAO Contract entstanden ist, besser zu verstehen, versuche ich einen kurzen Überblick über die problematische Funktionalität zu geben. Diese bestand nämlich aus den folgenden Schritten:

  1. Überprüfe (in einem internen Register, in dem das aufgezeichnet wird), ob die Person, die ihr Geld zurück will auch wirklich etwas gespendet hat
  2. Falls ja: Überweise dieser Person das Geld zurück
  3. Verzeichne im internen Register, dass die Person kein Spender mehr ist

Das Problem ist nun aber, dass in Ethereum “Geld überweisen” nicht einfach nur meint, dass einem anderen Account Geld gutgeschrieben wird, sondern eben gleichzeitig auch meint, dass wenn der Account wiederum ein Smart Contract ist, dass dessen Code ausgeführt wird. Diese Funktionalität kennen die Entwickler nicht aus dem Kontext anderer Programmiersprachen und somit ist es leicht, sie falsch zu verwenden.

So ist es auch im DAO passiert: Dort konnte ein bösartiger Nutzer einfach einen Smart Contract (nennen wir in mal X) erstellen, der das folgende macht:

  1. X spendet Geld an den DAO (das ist nun im internen Register des DAO Contracts gespeichert)
  2. X ruft die Funktionalität des DAO Contracts auf um das Geld zurück zu holen
    1.     Da X bereits Geld gespendet hat (was im internen Register steht) wird das Geld zurück überwiesen
    2.     Beim zurück überweisen, wird aber jetzt gleichzeitig wieder Code von X ausgeführt: Und dieser ist nun so geschrieben, dass er noch einmal die Funktionalität des DAOs zum Geld zurück holen aufruft
      1.         Im internen Register des DAO steht immer noch, dass X Geld gespendet hat und daher wird dieses Geld wieder überwiesen (obwohl X sein Geld schon zurück bekommen hat!)
      2.         Beim zurück überweisen wird wieder Code von X ausgeführt: Der ruft wieder die Funktionalität zum Geld zurück holen auf
        1.           … und so geht es immer weiter, bis das gesamte Geld des DAO contracts von X gestohlen wurde!

Für uns ist es nun interessant, wie man testen kann, ob ein Contract ein solches Sicherheitsproblem hat. Dazu müssen wir erstmal genau definieren, was das Problem des DAO contracts denn eigentlich war - und das machen wir natürlich am besten mit Hilfe unserer formalen Semantik! Mehr dazu gibt es nächstes Mal!

Liebe Grüße, Euer EtherTrust Team

CAPTCHA
Diese Frage dient der Überprüfung, ob Sie ein menschlicher Besucher sind und um automatisierten SPAM zu verhindern.

    Weitere Blogbeiträge

    Datenschutzinformation
    Der datenschutzrechtliche Verantwortliche (Internet Privatstiftung Austria - Internet Foundation Austria, Österreich) würde gerne mit folgenden Diensten Ihre personenbezogenen Daten verarbeiten. Zur Personalisierung können Technologien wie Cookies, LocalStorage usw. verwendet werden. Dies ist für die Nutzung der Website nicht notwendig, ermöglicht aber eine noch engere Interaktion mit Ihnen. Falls gewünscht, treffen Sie bitte eine Auswahl: