Kurz erklärt: Reentrancy (Wiedereintritt) bezeichnet eine Angriffsklasse bei Smart Contracts, bei der ein aufgerufener externer Vertrag den ursprünglichen Vertrag erneut aufruft, bevor dessen erster Aufruf abgeschlossen ist, und so einen inkonsistenten Zwischenzustand ausnutzt.
Funktionsweise des Angriffs
Reentrancy tritt auf, wenn ein Vertrag Werte an eine externe Adresse überweist, bevor er seinen internen Zustand aktualisiert. Überweist der Vertrag beispielsweise Ether an einen anderen Vertrag, kann dessen Empfangsfunktion sofort wieder die ursprüngliche Abhebefunktion aufrufen.
Da der interne Kontostand zu diesem Zeitpunkt noch nicht verringert wurde, lässt sich der Vorgang mehrfach wiederholen und der Vertrag wird über sein tatsächliches Guthaben hinaus geleert. Der Angriff nutzt somit die Reihenfolge von Auszahlung und Zustandsänderung aus.
Historische Bedeutung
Bekanntheit erlangte Reentrancy durch den Angriff auf „The DAO“ im Juni 2016, einen dezentralen Investmentfonds auf Ethereum. Ein Angreifer entzog dem Vertrag über wiederholten Wiedereintritt Ether im damaligen Gegenwert eines zweistelligen Millionenbetrags.
Als Reaktion spaltete sich die Ethereum-Blockchain: Die Mehrheit führte eine Hard Fork durch, um die Transaktionen rückgängig zu machen, während die ursprüngliche Kette als Ethereum Classic fortbestand. Der Vorfall gilt als prägend für das Bewusstsein zur Smart-Contract-Sicherheit.
Schutzmassnahmen
Gegen Reentrancy haben sich mehrere Muster in der Entwicklung mit Solidity etabliert:
- Checks-Effects-Interactions: Zuerst Bedingungen prüfen, dann den internen Zustand ändern und erst zuletzt externe Aufrufe ausführen.
- Reentrancy-Guards: Ein Sperr-Modifier (etwa
nonReentrant) verhindert, dass eine Funktion während ihrer Ausführung erneut betreten wird. - Pull-Zahlungen: Empfänger heben Beträge selbst ab, statt dass der Vertrag aktiv überweist.
- Audits und Tests prüfen Verträge systematisch auf diese und andere Fehlerklassen.
Bibliotheken wie OpenZeppelin stellen fertige, auditierte Schutzkomponenten bereit.
Häufige Fragen
Was ist eine Reentrancy-Lücke?
Es ist eine Schwachstelle, bei der ein externer Aufruf den ursprünglichen Vertrag erneut aufruft, bevor dieser seinen Zustand aktualisiert hat. So lassen sich Aktionen wie Abhebungen mehrfach ausführen.
Welcher bekannte Vorfall beruhte auf Reentrancy?
Der Angriff auf The DAO im Juni 2016. Er führte zu erheblichen Verlusten und in der Folge zur Hard Fork, aus der Ethereum und Ethereum Classic als getrennte Ketten hervorgingen.
Wie schützt man sich vor Reentrancy?
Durch das Checks-Effects-Interactions-Muster, Reentrancy-Guards, Pull-Zahlungen sowie durch Audits und den Einsatz auditierter Bibliotheken wie OpenZeppelin.
Warum ist Reentrancy besonders gefährlich?
Weil Smart Contracts oft Werte verwalten und nach Veröffentlichung meist unveränderlich sind. Ein erfolgreicher Angriff kann einen Vertrag vollständig leeren, ohne dass sich der Code nachträglich korrigieren lässt.
Betrifft Reentrancy nur Ethereum?
Nein. Das Grundproblem betrifft alle Plattformen mit Smart Contracts und externen Aufrufen, insbesondere EVM-kompatible Blockchains, die dieselbe Ausführungslogik verwenden.
Zusammenfassung
Reentrancy ist eine Angriffsklasse bei Smart Contracts, bei der ein externer Aufruf den ursprünglichen Vertrag erneut betritt, bevor dessen Zustand aktualisiert wurde. Der Angriff auf The DAO 2016 machte die Lücke bekannt und führte zur Spaltung in Ethereum und Ethereum Classic. Schutz bieten das Checks-Effects-Interactions-Muster, Reentrancy-Guards und Audits.
Weiterführende Quellen
- Ethereum.org: Sicherheit von Smart Contracts: ethereum.org
- Wikipedia: The DAO: de.wikipedia.org