Am 5. Dezember 2023 gab die prominente Web3-Entwicklungsplattform Thirdweb signifikante Sicherheitslücken in ihren vorkompilierten Smart Contracts bekannt. Dieser kritische Fehler betraf alle ERC-20-, ERC-721- und ERC-1155-Token, die über diese spezifischen anfälligen Verträge bereitgestellt wurden. In den Tagen nach der Bekanntgabe wurden Token, die mit diesen anfälligen Verträgen bereitgestellt wurden, nach und nach in einer Reihe von Angriffen ausgenutzt, was die Schwere der zugrunde liegenden Inkompatibilität unterstreicht.
Verständnis der ThirdWeb Smart Contract Schwachstelle
Die Ursache des ThirdWeb-Vorfalls liegt in der unerwarteten Interaktion zwischen zwei grundlegenden Komponenten der Smart Contract-Entwicklung: ERC-2771 und der Multicall-Implementierung von OpenZeppelin. Um die Schwachstelle vollständig zu verstehen, ist es unerlässlich, jede Komponente einzeln zu betrachten und dann zu analysieren, wie ihre Interaktion einen ausnutzbaren Pfad geschaffen hat.
ERC-2771: Meta-Transaktionen und vertrauenswürdige Forwarder
EIP-2771 definiert ein Protokoll auf Contract-Ebene, das es Recipient-Verträgen ermöglicht, Meta-Transaktionen über vertrauenswürdige Forwarder-Verträge zu akzeptieren. Dieser Standard ist entscheidend für die Verbesserung der Benutzererfahrung, indem er es Dritten (Forwardern) ermöglicht, Gasgebühren im Namen von Benutzern zu zahlen und so die Notwendigkeit für Benutzer, native Blockchain-Token zu halten, zu abstrahieren.
In der Praxis ist OpenZeppelins ERC2771Context eine weit verbreitete Implementierung. Ihre Kernfunktionalität besteht darin, die letzten 20 Bytes des Calldata von einem vertrauenswürdigen Forwarder als effektiven _msgSender() zu behandeln. Für Entwickler, die diese Bibliothek verwenden, ist es üblich, alle direkten Verwendungen von msg.sender durch _msgSender() zu ersetzen, um die Kompatibilität mit Meta-Transaktionen zu gewährleisten. Ebenso wird _msgData() verwendet, um die ursprünglichen Transaktionsdaten abzurufen, ohne die angehängten Senderinformationen.
function _msgSender() internal view virtual override returns (address) {
uint256 calldataLength = msg.data.length;
uint256 contextSuffixLength = _contextSuffixLength();
if (isTrustedForwarder(msg.sender) && calldataLength >= contextSuffixLength) {
return address(bytes20(msg.data[calldataLength - contextSuffixLength:]));
} else {
return super._msgSender();
}
}
function _msgData() internal view virtual override returns (bytes calldata) {
uint256 calldataLength = msg.data.length;
uint256 contextSuffixLength = _contextSuffixLength();
if (isTrustedForwarder(msg.sender) && calldataLength >= contextSuffixLength) {
return msg.data[:calldataLength - contextSuffixLength];
} else {
return super._msgData();
}
}
Multicall: Bündeln von Transaktionen zur Effizienz
Die Multicall-Funktionalität ermöglicht es Benutzern, mehrere Funktionsaufrufe zu einer einzigen Transaktion zu bündeln, was die Gaskosten erheblich reduziert und die Transaktionseffizienz verbessert. OpenZeppelins MulticallUpgradeable ist eine beliebte Implementierung für diesen Zweck. Sie nimmt ein Array von Calldata-Bytes entgegen und führt für jeden Eintrag einen delegatecall aus, der diese im Kontext des aufrufenden Vertrags ausführt.
function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; i++) {
results[i] = _functionDelegateCall(address(this), data[i]);
}
return results;
}
(Hinweis: Der hier diskutierte Fehler wurde in späteren Versionen von OpenZeppelins Multicall inzwischen behoben.)
Die Inkompatibilität: ERC-2771 und Multicall Konflikt
Der Kern der Smart Contract-Schwachstelle im ThirdWeb-Vorfall ergab sich aus einer kritischen Inkonsistenz in der Art und Weise, wie Calldata von ERC-2771 und Multicall verarbeitet wird. ERC-2771 erwartet, dass der vertrauenswürdige Forwarder die Nachrichtendaten und Senderinformationen zusammenpackt. Der Empfängervertrag verwendet dann _msgData() und _msgSender(), um diese Informationen korrekt zu entpacken.
Die Multicall-Funktion war jedoch in ihrer anfälligen Implementierung nicht darauf ausgelegt, mit der Art und Weise kompatibel zu sein, wie ERC-2771 Daten für Meta-Transaktionen packt. Insbesondere, wenn Multicall eine Charge von Aufrufen verarbeitet, hätte sie _msgSender() korrekt aus der anfänglichen Meta-Transaktion extrahieren und dann diese Senderinformationen an das Calldata jedes einzelnen Aufrufs anhängen müssen, bevor sie ausgeführt wurden. Dieser entscheidende Schritt fehlte.
Ohne dass die Senderinformationen korrekt an das Calldata innerhalb jedes von Multicall verarbeiteten Unteraufrufs angehängt wurden, versuchte der ERC-2771-Kontext innerhalb des Zielvertrags, Senderinformationen aus den letzten 20 Bytes von _msgData() des Unteraufrufs zu entpacken. Entscheidend ist, dass ein Angreifer diese letzten 20 Bytes kontrollieren konnte. Dies ermöglichte es einem böswilligen Akteur, spezifisches Calldata zu erstellen, das, wenn es von Multicall verarbeitet und dann von einem ERC-2771-aktivierten Vertrag interpretiert wurde, beliebige Logik mit einem manipulierten _msgSender()-Wert (z.B. eine vom Angreifer kontrollierte Adresse oder sogar die Pooladresse eines Protokolls) ausführen würde. Dies umging effektiv die beabsichtigten Sicherheitsprüfungen und verletzte die Erwartungen, die von beiden Spezifikationen aufgestellt wurden, was zu unbefugten Aktionen führte.
ThirdWeb Vorfall: Angriffsanalyse und Ausnutzung
Betrachten wir ein reales Beispiel der Smart Contract-Schwachstelle im ThirdWeb-Vorfall, anhand einer Angriffstransaktion, die von der Phalcon-Plattform von BlockSec analysiert wurde.
Die Strategie des Angreifers beinhaltete die Manipulation von _msgSender(), um sich als Uniswap-Pool auszugeben und dadurch dessen Token-Guthaben abzuziehen.
-
Schritt 1: Anfängliche Token-Beschaffung. Der Angreifer tauschte zunächst 5 WETH gegen 3.455.399.346 TIME-Token an einer dezentralen Börse. Dies lieferte die notwendigen Token für die nachfolgende Manipulation.
-
Schritt 2: Bösartige Multicall-Ausführung. Dies ist der Kern des Exploits. Der Angreifer rief einen vertrauenswürdigen Forwarder mit sorgfältig erstelltem Calldata auf, das darauf ausgelegt war, die Inkompatibilität von ERC-2771/Multicall auszunutzen. Als dieses Calldata von der
Multicall-Funktion analysiert wurde, führte dies zum Aufruf derburn-Funktion des TIME-Token-Vertrags. Entscheidend war, dass aufgrund der Schwachstelle_msgSender()fälschlicherweise als Uniswap Pool-Adresse interpretiert wurde. Dies ermöglichte es dem Angreifer, einen erheblichen Teil der von Uniswap gehaltenen TIME-Token zu verbrennen, ohne tatsächliche Berechtigung. Die BlockSec Phalcon-Plattform bietet detaillierte Transaktionsverfolgung zur Visualisierung dieses Ablaufs.
Transaktionsverfolgung, die den bösartigen Multicall zeigt Das obige Bild illustriert, wie der
Forwarder.execute-Aufruf des Angreifers verarbeitet wird. Diemulticall-Funktion empfängt ein Byte-Array, das dann zum Aufruf derburn-Funktion mit dem manipulierten_msgSender()führt.
Detaillierte Ansicht der Multicall-Analyse und des burn-Funktionsaufrufs Diese detaillierte Ansicht von Phalcon zeigt die
bytes[]der Länge 1, die als Daten zum Aufrufen des Vertrags verwendet werden, was zur Ausführung derburn-Funktion unter der gefälschten_msgSender()führt. -
Schritt 3: Preismanipulation. Durch die Verbrennung einer großen Menge TIME-Token aus dem Uniswap-Pool reduzierte der Angreifer drastisch die Liquidität des Pools für TIME. Diese künstliche Verknappung führte zu einem skyrocketartigen Anstieg des TIME-Preises im Verhältnis zu WETH innerhalb des Pools.
-
Schritt 4: Profitabler Arbitrage. Mit dem künstlich aufgeblähten TIME-Preis tauschte der Angreifer dann seine verbleibenden 3.455.399.346 TIME-Token zurück gegen 94 WETH und realisierte so einen erheblichen Gewinn aus dem manipulierten Preis.
Diese Abfolge von Ereignissen demonstriert einen raffinierten Angriff, der eine subtile Smart Contract-Schwachstelle ausnutzt, die aus der Modulin-Inkompatibilität resultiert.
Sichern Sie Ihre Smart Contracts mit BlockSec
Lassen Sie nicht zu, dass versteckte Inkompatibilitäten Ihr Projekt Risiken aussetzen. Unsere erfahrenen Prüfer führen umfassende Smart Contract Audits durch, um Schwachstellen zu identifizieren und zu beheben, bevor sie ausgenutzt werden können.
Bester Sicherheitsauditor für Web3
Validieren Sie Design, Code und Geschäftslogik vor dem Start
Wichtige Erkenntnisse und Lehren aus dem ThirdWeb-Vorfall
Der ThirdWeb-Vorfall ist eine kritische Erinnerung an die Komplexität der Web3-Sicherheit, insbesondere im Hinblick auf die Interaktion von Drittanbieter-Bibliotheken.
- Interoperabilitätsrisiken: Im sich schnell entwickelnden DeFi-Bereich verlassen sich Projekte stark auf einen Stapel von Drittanbieter-Bibliotheken und Modulen. Während diese Komponenten die Entwicklung beschleunigen, können ihre Interaktionen unerwartete und verdeckte Schwachstellen einführen. Der ThirdWeb-Vorfall zeigt deutlich, dass selbst weit verbreitete, scheinbar robuste Komponenten wie OpenZeppelins
ERC2771ContextundMulticallUpgradeablekritische Sicherheitslücken schaffen können, wenn ihre Integration nicht sorgfältig gehandhabt wird. - Tiefgreifende technische Überprüfung ist unerlässlich: Diese Art von Smart Contract-Schwachstelle wird nicht leicht durch oberflächliche Prüfungen aufgedeckt. Sie erfordert tiefes technisches Fachwissen, um zu analysieren, wie verschiedene Module Daten verarbeiten und interpretieren, insbesondere Calldata, und um potenzielle Inkonsistenzen zu identifizieren. Eine gründliche Smart Contract-Überprüfung, die sich auf Modulübergreifende Interaktionen und Grenzfälle konzentriert, ist von größter Bedeutung.
- Kontinuierliche Überwachung und Reaktion auf Vorfälle: Selbst mit robusten Audits können neue Angriffsmuster entstehen. Eine kontinuierliche Blockchain-Sicherheitsüberwachung, wie sie von BlockSecs Phalcon angeboten wird, ist entscheidend, um verdächtige Aktivitäten in Echtzeit zu erkennen und eine schnelle Reaktion auf Vorfälle zu ermöglichen, um Schäden zu minimieren.
- Jenseits der individuellen Modulsicherheit: Entwickler müssen über die Sicherheit einzelner Komponenten hinausdenken und die ganzheitliche Sicherheitsposition ihres gesamten Smart Contract-Systems betrachten. Wie Daten zwischen verschiedenen Modulen fließen, wie Kontexte erhalten oder verändert werden und wie externe Aufrufe behandelt werden, sind alles kritische Überlegungen.
Der ThirdWeb-Vorfall unterstreicht die Bedeutung eines proaktiven und umfassenden Ansatzes zur Blockchain-Sicherheit. Sich allein auf den Ruf einzelner Bibliotheken zu verlassen, ist nicht ausreichend; die Interaktionen zwischen ihnen müssen rigoros überprüft werden.
Untersuchen Sie On-Chain-Vorfälle mit Phalcon
BlockSecs Phalcon ist die führende Web3-Sicherheitsplattform für Echtzeitüberwachung, Reaktion auf Vorfälle und detaillierte Transaktionsanalyse. Verstehen Sie komplexe Exploits wie den ThirdWeb-Vorfall mit beispielloser Klarheit.
Lesen Sie weitere Artikel in dieser Serie:
- Lead-In: Die Top Ten "Awesome" Sicherheitsvorfälle 2023
- #1: MEV-Bots durch Ausnutzung von Schwachstellen im Flashbots Relay ernten
- #2: Euler Finance Vorfall: Der größte Hack von 2023
- #3: KyberSwap Vorfall: Meisterhafte Ausnutzung von Rundungsfehlern mit äußerst subtilen Berechnungen
- #4: Curve Vorfall: Compiler-Fehler erzeugt fehlerhaften Bytecode aus unschuldigem Quellcode
- #5: Platypus Finance: Drei Angriffe mit einem glücklichen Zufall überstehen
- #6: Hundred Finance Vorfall: Katalysator für die Welle von Präzisionsbezogenen Exploits in anfälligen, geforkten Protokollen
- #7: ParaSpace Vorfall: Ein Wettlauf gegen die Zeit, um den bisher kritischsten Angriff der Branche abzuwehren
- #8: SushiSwap Vorfall: Ein ungeschickter Rettungsversuch führt zu einer Reihe von Nachahmungsangriffen
- #9: MEV Bot 0xd61492: Vom Räuber zur Beute in einem genialen Exploit



