Approval-Race-Condition beim ERC-20-Standard
Die ERC-20 Approval-Race-Condition ist eine Sicherheitslücke in Smart Contracts, die es einem Spender ermöglicht, Zeitunterschiede bei der Aktualisierung von Token-Freigaben auszunutzen. Dies kann zu unautorisierten Übertragungen oder
Struktur, Lesbarkeit, interne Verlinkung und SEO-Metadaten wurden automatisiert geprüft. Der Artikel wird fortlaufend aktualisiert und dient der Bildung, nicht als Finanzberatung.
Definition
Die ERC-20 Approval-Race-Condition ist eine Sicherheitslücke in Smart Contracts, die auftritt, wenn eine Token-Freigabe aktualisiert wird. Dabei entsteht ein Zeitfenster, in dem ein böswilliger Akteur die alte Freigabe ausnutzen kann, bevor die neue wirksam wird, was potenziell zu unautorisierten Token-Übertragungen oder doppelten Ausgaben führt.
Der ERC-20-Standard definiert einen gemeinsamen Satz von Regeln für fungible Token auf der Ethereum-Blockchain und ermöglicht eine nahtlose Interoperabilität zwischen Wallets, Börsen und dezentralen Anwendungen. Eine Kernfunktion dieses Standards ist die Möglichkeit für einen Token-Eigentümer, einer anderen Adresse (einem Spender) die Erlaubnis zu erteilen, einen bestimmten Betrag seiner Token in seinem Namen auszugeben. Dieser Mechanismus ist grundlegend für viele dezentrale Finanzanwendungen (DeFi), da er es Benutzern ermöglicht, mit Protokollen zu interagieren, ohne ihre Token direkt an den Vertrag des Protokolls zu senden. Die Art und Weise, wie dieser Freigabemechanismus, insbesondere die Funktion approve(), konzipiert ist, kann jedoch eine subtile, aber bedeutende Sicherheitslücke einführen, die als Race Condition bekannt ist. Dieser Zustand tritt auf, wenn das Timing mehrerer Transaktionen, insbesondere einer Freigabeaktualisierung und einer nachfolgenden Übertragung, manipuliert werden kann, um ein unbeabsichtigtes Ergebnis zu erzielen, das oft dazu führt, dass der Spender Zugriff auf mehr Token erhält, als der Eigentümer beabsichtigt hat.
Kernaussage
Das Kernproblem der ERC-20 Approval-Race-Condition liegt in der nicht-atomaren Natur der Aktualisierung einer Freigabe. Wenn ein Token-Eigentümer beschließt, eine bestehende Freigabe für einen Spender zu ändern, ruft er typischerweise die Funktion approve() mit einem neuen Betrag auf. Wenn ein böswilliger oder opportunistischer Spender diese ausstehende Transaktion beobachtet, kann er schnell einen transferFrom()-Aufruf unter Verwendung der ursprünglichen, höheren Freigabe ausführen, bevor die neue approve()-Transaktion des Eigentümers in der Blockchain bestätigt wird. Dies ermöglicht es dem Spender, Token basierend auf der alten Freigabe auszugeben und dann potenziell zusätzliche Token basierend auf der neu aktualisierten Freigabe auszugeben, was zu einem Gesamtbetrag führt, der über dem vom Eigentümer beabsichtigten neuen Limit liegt. Das Verständnis dieser Timing-Schwachstelle ist sowohl für Token-Inhaber als auch für Smart-Contract-Entwickler von entscheidender Bedeutung, um potenzielle finanzielle Verluste zu verhindern und die Integrität dezentraler Anwendungen zu gewährleisten.
Mechanik
Um die ERC-20 Approval-Race-Condition vollständig zu verstehen, ist es unerlässlich, die zwei primären beteiligten Funktionen zu kennen: approve(address spender, uint256 amount) und transferFrom(address sender, address recipient, uint256 amount). Die Funktion approve() ermöglicht es einem Token-Eigentümer, einer spender-Adresse die Erlaubnis zu erteilen, bis zu einem bestimmten amount an Token von seinem Guthaben abzuheben. Dies erzeugt eine "Freigabe" (Allowance). Die Funktion transferFrom() ermöglicht es dem spender dann, Token vom Konto des sender an das Konto eines recipient zu verschieben, vorausgesetzt, der spender hat eine ausreichende Freigabe vom sender.
Die Race Condition entfaltet sich in einer spezifischen Abfolge von Ereignissen. Stellen Sie sich vor, Alice besitzt 200 ERC-20-Token und hat Bob zuvor erlaubt, 100 ihrer Token auszugeben (d.h. allowance[Alice][Bob] = 100). Nun beschließt Alice, Bobs Freigabe auf 50 Token zu reduzieren. Ihre beabsichtigte Aktion ist der Aufruf von approve(Bob, 50). Bevor ihre Transaktion zur Festlegung der Freigabe auf 50 jedoch bestätigt und in die Blockchain geschrieben wird, beobachtet Bob, der die Blockchain auf ausstehende Transaktionen mit seiner Adresse überwachen könnte, Alices Absicht, seine Freigabe zu reduzieren.
An diesem kritischen Punkt kann Bob schnell eine transferFrom(Alice, Bob, 100)-Transaktion initiieren. Wenn Bobs Transaktion vor Alices approve(Bob, 50)-Transaktion verarbeitet und bestätigt wird, überweist Bob erfolgreich 100 Token von Alices Konto auf sein eigenes und verbraucht dabei die alte Freigabe. Nachdem Bobs Transaktion bestätigt wurde, wird Alices approve(Bob, 50)-Transaktion verarbeitet, wodurch Bobs Freigabe auf 50 aktualisiert wird. Nun hat Bob bereits 100 Token erhalten und hat immer noch eine Freigabe von 50. Er kann dann eine weitere transferFrom(Alice, Bob, 50)-Transaktion ausführen und so effektiv zusätzliche 50 Token nehmen. Insgesamt hat Bob es geschafft, 150 Token (100 + 50) zu überweisen, obwohl Alices ursprüngliche Absicht war, ihn auf 50 Token zu beschränken. Dieses Szenario zeigt, wie die Race Condition es einem Spender ermöglicht, die kurze Zeitspanne zwischen einer Freigabereduzierung und deren Bestätigung in der Blockchain auszunutzen, was zu einem unbeabsichtigten und potenziell böswilligen Ergebnis führt.
Trading-Relevanz
Obwohl die ERC-20 Approval-Race-Condition keine direkte Handelsstrategie darstellt, ist ihr Verständnis für jeden, der im Krypto-Ökosystem tätig ist, von größter Bedeutung, insbesondere für diejenigen, die mit dezentralen Börsen (DEXs), Kreditprotokollen, Yield-Farming-Plattformen und anderen DeFi-Anwendungen interagieren. Diese Plattformen verlassen sich stark auf den ERC-20 approve()-Mechanismus, um Benutzern das Einzahlen, Staking oder Tauschen von Token zu ermöglichen, ohne die volle Kontrolle abzugeben. Ein Benutzer könnte einer DEX erlauben, einen bestimmten Betrag seiner Token für einen Tausch auszugeben, und sich später entscheiden, diese Freigabe zu reduzieren. Wenn er sich der Race Condition nicht bewusst ist, könnte er sich unbeabsichtigt dem Risiko aussetzen, dass ein bösartiger Vertrag oder ein opportunistischer Akteur das Timing-Fenster ausnutzt.
Für Trader und Investoren liegt die primäre Relevanz im Risikomanagement und der Due Diligence. Bei der Interaktion mit neuen oder ungeprüften Smart Contracts wird das Verständnis dieser Schwachstelle zu einem kritischen Bestandteil der Bewertung der Sicherheitslage der Plattform. Wenn die Smart Contracts eines Protokolls keine geeigneten Minderungsstrategien für diese Race Condition implementieren, könnten Benutzer, die ihre Token-Freigaben häufig anpassen, gefährdet sein. Darüber hinaus müssen Entwickler, die Handelsbots oder automatisierte Strategien entwickeln, die mit ERC-20-Token interagieren, diese Schwachstelle in ihrem Code berücksichtigen, um unbeabsichtigte Token-Übertragungen oder Verluste zu verhindern. Die Integrität von Token-Freigaben wirkt sich direkt auf die Sicherheit von Geldern aus, was dies zu einem grundlegenden Konzept für jeden macht, der über einfache Token-Übertragungen hinaus agiert.
Risiken
Das primäre und bedeutendste Risiko, das mit der ERC-20 Approval-Race-Condition verbunden ist, ist die doppelte Ausgabe oder unautorisierte Token-Übertragungen. Wie im Abschnitt "Mechanik" erläutert, kann ein böswilliger oder sogar opportunistischer Spender das Zeitfenster ausnutzen, um mehr Token abzuheben, als der Eigentümer beabsichtigt hat, was effektiv zu einem Verlust von Geldern für den Token-Inhaber führt. Dies kann sich auf verschiedene Weisen manifestieren:
Erstens könnte ein Benutzer versuchen, eine Freigabe für eine Drittanbieteranwendung zu reduzieren, der er nicht mehr vertraut oder die er nicht mehr verwendet. Wenn diese Anwendung bösartig wäre, könnte sie die Blockchain auf die Transaktion zur Freigabereduzierung überwachen und schnell einen transferFrom()-Aufruf unter Verwendung der alten, höheren Freigabe ausführen, bevor die Reduzierung abgeschlossen ist. Dies könnte die Gelder des Benutzers bis zum alten Freigabelimit abziehen, selbst wenn der Benutzer beabsichtigte, sie zu widerrufen oder erheblich zu senken. Zweitens könnten selbst in nicht-bösartigen Szenarien ein schlecht entworfener Vertrag oder ein ehrlicher Fehler im Transaktions-Timing zu unerwarteten Token-Bewegungen führen, was Verwirrung und potenzielle finanzielle Streitigkeiten verursacht. Die mangelnde Atomarität im Design der approve()-Funktion bedeutet, dass der Zustand der Freigabe während des Übergangs inkonsistent sein kann, wodurch ein Fenster für Ausnutzung entsteht.
Um diese Schwachstelle zu mindern, sind mehrere Strategien entstanden. Der gängigste und am weitesten empfohlene Ansatz besteht darin, dass der Token-Eigentümer die Freigabe zuerst auf Null setzt, bevor er einen neuen, gewünschten Betrag festlegt. Dies beinhaltet zwei separate Transaktionen: zuerst approve(spender, 0) und dann, sobald diese Transaktion bestätigt ist, approve(spender, newAmount). Durch das Setzen der Freigabe auf Null würden alle ausstehenden transferFrom()-Aufrufe, die die alte Freigabe verwenden, fehlschlagen, wodurch das Race-Condition-Fenster effektiv geschlossen wird. Diese Methode erfordert jedoch zwei Transaktionen, was zusätzliche Gasgebühren verursacht und die Freigabeaktualisierung potenziell verzögert. Eine elegantere Lösung, die von vielen modernen ERC-20-Implementierungen (wie OpenZeppelins ERC20Permit und ERC20-Verträgen) übernommen wurde, besteht darin, dedizierte Funktionen wie increaseAllowance(address spender, uint256 addedValue) und decreaseAllowance(address spender, uint256 subtractedValue) bereitzustellen. Diese Funktionen ändern die Freigabe relativ zu ihrem aktuellen Wert, wodurch sie von Natur aus sicherer gegen Race Conditions sind, da sie die Freigabe nicht direkt überschreiben, sondern sie inkrementell anpassen. Entwicklern wird dringend empfohlen, diese sichereren Funktionen zu verwenden oder den zweistufigen Ansatz (Null setzen, dann neuen Betrag) bei der Verwaltung von ERC-20-Freigaben zu implementieren.
Geschichte und Beispiele
Der ERC-20-Standard selbst wurde im November 2015 von Fabian Vogelsteller vorgeschlagen und im September 2017 offiziell verabschiedet. Er entwickelte sich schnell zum dominierenden Standard für fungible Token auf Ethereum und ermöglichte die Verbreitung von ICOs und den anschließenden Boom dezentraler Anwendungen. Die Approval-Race-Condition, obwohl kein Fehler im Ethereum-Protokoll selbst, entwickelte sich als bekannte Schwachstelle, die dem ursprünglichen Design der approve()-Funktion innerhalb des ERC-20-Standards innewohnt. Sie wurde von Entwicklern und Sicherheitsforschern relativ früh in der Annahme des Standards identifiziert und diskutiert, was die Komplexität des sicheren Smart-Contract-Designs unterstreicht.
Obwohl es nicht viele weithin publizierte, groß angelegte Hacks gab, die ausschließlich der ERC-20 Approval-Race-Condition zugeschrieben werden, war ihre Existenz ein ständiges Anliegen für Smart-Contract-Auditoren und -Entwickler. Der Grund für das Fehlen größerer Vorfälle liegt größtenteils in den proaktiven Maßnahmen der Community. Als die Schwachstelle gut verstanden wurde, entwickelten sich schnell Best Practices für ein sicheres ERC-20-Freigabemanagement. Projekte, die seriöse Smart-Contract-Bibliotheken wie OpenZeppelin verwenden, haben sicherere Freigabemanagement-Funktionen wie increaseAllowance() und decreaseAllowance() in ihre Token-Verträge integriert. Diese Funktionen adressieren die Race Condition direkt, indem sie die Freigabe relativ zu ihrem aktuellen Wert ändern, anstatt sie zu überschreiben, wodurch die Ausnutzung des Timing-Fensters verhindert wird. Diese weit verbreitete Annahme sicherer Muster hat die praktischen Auswirkungen dieser theoretischen Schwachstelle erheblich reduziert und sie eher zu einer warnenden Geschichte und einem Beweis für die kontinuierliche Entwicklung von Smart-Contract-Sicherheitspraktiken gemacht.
Häufige Missverständnisse
Ein häufiges Missverständnis bezüglich der ERC-20 Approval-Race-Condition ist, dass sie einen grundlegenden Fehler in der Ethereum-Blockchain selbst darstellt. Dies ist falsch. Die Schwachstelle liegt nicht im zugrunde liegenden Konsensmechanismus oder im Sicherheitsmodell von Ethereum, sondern in den spezifischen Implementierungsdetails der approve()-Funktion, wie sie im ERC-20-Token-Standard definiert ist. Ethereum bietet die sichere Ausführungsumgebung, aber die Logik innerhalb des Smart Contracts selbst kann, wenn sie nicht sorgfältig entworfen wird, Schwachstellen einführen. Die Race Condition hebt eine Designentscheidung im ERC-20-Standard hervor, die, obwohl scheinbar unkompliziert, ein ausnutzbares Zeitfenster schafft. Es handelt sich um eine Schwachstelle auf Vertragsebene, nicht auf Protokollebene.
Ein weiteres häufiges Missverständnis ist, dass diese Race Condition immer einen hoch entwickelten, böswilligen Angreifer erfordert. Obwohl ein engagierter Angreifer sie sicherlich ausnutzen könnte, kann die Schwachstelle auch aus weniger bösartigen Umständen oder sogar ehrlichen Fehlern entstehen. Zum Beispiel könnte ein Benutzer einfach versuchen, eine Freigabe für eine legitime dezentrale Anwendung zu aktualisieren, und aufgrund von Netzwerküberlastung oder Transaktionsreihenfolge könnte seine Transaktion zur Freigabereduzierung verzögert werden. Ein opportunistischer Bot oder sogar eine andere legitime Transaktion könnte dann unbeabsichtigt die Race Condition auslösen, wenn sie zufällig während dieses kurzen Fensters transferFrom() mit der alten Freigabe aufruft. Darüber hinaus glauben einige Benutzer fälschlicherweise, dass das einfache Aufrufen von approve() mit einem neuen, niedrigeren Betrag ausreicht, um eine Freigabe sofort zu widerrufen oder zu reduzieren, ohne zu erkennen, dass der zweistufige Prozess (zuerst auf Null setzen) oder die Verwendung von increaseAllowance/decreaseAllowance für eine robuste Sicherheit gegen diese spezifische Art von Angriff notwendig ist. Es ist entscheidend zu verstehen, dass die Schwachstelle im Interaktionsmuster liegt und nicht ausschließlich von der Absicht des Spenders abhängt.
Zusammenfassung
Die ERC-20 Approval-Race-Condition stellt eine bedeutende, wenn auch gut verstandene, Sicherheitslücke innerhalb des weit verbreiteten ERC-20-Token-Standards dar. Sie resultiert aus der nicht-atomaren Natur der Aktualisierung von Token-Freigaben über die approve()-Funktion, wodurch ein kritisches Zeitfenster entsteht, das von einem böswilligen oder opportunistischen Spender ausgenutzt werden kann. Diese Ausnutzung kann zu unautorisierten Token-Übertragungen oder doppelten Ausgaben führen, bei denen ein Spender Zugriff auf mehr Token erhält, als der Eigentümer beabsichtigt hat. Obwohl es sich nicht um einen Fehler in der Ethereum-Blockchain selbst handelt, unterstreicht sie die Bedeutung eines sorgfältigen Smart-Contract-Designs und des Benutzerbewusstseins.
Um sich vor dieser Schwachstelle zu schützen, werden Entwickler und Benutzer ermutigt, sichere Praktiken anzuwenden. Die robustesten Minderungsstrategien umfassen entweder einen zweistufigen Freigabeaktualisierungsprozess (zuerst die Freigabe auf Null setzen, dann auf den gewünschten neuen Betrag) oder, vorzugsweise, die Verwendung sichererer Funktionen wie increaseAllowance() und decreaseAllowance(), die von modernen ERC-20-Implementierungen, wie sie in OpenZeppelins Verträgen zu finden sind, bereitgestellt werden. Das Verständnis dieser Race Condition ist nicht nur ein technisches Detail für Entwickler; es ist ein grundlegender Aspekt des Risikomanagements für jede Einzelperson oder Entität, die mit ERC-20-Token im dezentralen Ökosystem interagiert. Wachsamkeit bei Smart-Contract-Interaktionen und die Einhaltung bewährter Sicherheitspraktiken sind unerlässlich, um digitale Vermögenswerte vor solch subtilen, aber potenten Schwachstellen zu schützen.
OKX EU · Offizieller Biturai-Partner
OKX EU
Entdecke das aktuelle Angebot von OKX EU über den offiziellen Biturai-Partnerlink. Produkte und Verfügbarkeit können je Land abweichen.
OKX EU ansehenPartnerlink · Biturai kann bei Nutzung eine Vergütung erhalten · keine Anlageberatung
