Am 23. März 2022 um 16:20:08 UTC+8 wurde die CashioApp ausgenutzt, um das Collateral-Token-Konto mit einem Verlust von etwa 52 Millionen zu leeren. Der Hack wurde durch eine unzureichende Überprüfung von Eingabekonten ermöglicht, die es dem Angreifer erlaubte, 20 Milliarden $CASH-Tokens ohne Einzahlung zu prägen. Im Folgenden werden die technischen Details erläutert.
Zusammenfassung
Der Vorfall ereignete sich aufgrund eines Fehlers im Brrr-Programm, das für die Prägung und Verbrennung von $CASH-Tokens mit dem Collateral von Saber LP Arrows zuständig ist. Konkret konnten Benutzer $CASH drucken, also $CASH prägen, indem sie Arrow LP-Tokens hinterlegten. Beachten Sie, dass Arrow LP-Tokens die Saber LP-Tokens als zugrunde liegende Tokens erhalten. Die print_cash-Anweisung, mit der $CASH geprägt werden kann, empfängt eine Liste von Konten, einschließlich des Bank-Kontos und des Collateral-Kontos. Diese werden verwendet, um das Collateral (d. h. Arrow LP-Tokens) aufzuzeichnen und zu verfolgen, das für die Prägung von $CASH verwendet werden darf. Nach dem Design sollten diese beiden Konten nur vom Administrator initialisiert und autorisiert werden. Das Programm versäumt es jedoch, die Gültigkeit des Bank-Kontos zu überprüfen. Infolgedessen konnte der Angreifer eine Reihe von gefälschten Konten (einschließlich des Bank-Kontos) erstellen, um sie in die print_cash-Anweisung einzuspeisen und $CASH fast kostenlos zu prägen (die einzigen Kosten sind Transaktionsgebühren).
Details
Beginnen wir die Analyse mit den verwendeten Konten der unten stehenden print_cash-Anweisung.
Das Attribut common (Zeile 75) ist eine Struktur vom Typ BrrrCommon im Programm. In BrrrCommon werden das bank-Konto und das collateral-Konto vom Administrator initialisiert und autorisiert. crate_token ist das Konto des $CASH-Tokens, das Informationen über $CASH speichert, wie den öffentlichen Schlüssel des crate_mint (Zeile 107), die öffentlichen Schlüssel von Administratorrollen und mehr. crate_collateral_tokens ist ein Vault-Konto, das die von Benutzern übertragenen Collateral-Tokens hält. Da es sich bei dem Collateral um Arrow LP-Tokens handeln sollte, die die LP-Tokens von Saber erhalten, müssen Benutzer die zugehörigen Konten von saber_swap eingeben. Die letzten beiden Attribute in der Struktur BrrrCommon sind Programm-IDs von Zielprogrammen, die in der Anweisung verwendet werden. Beachten Sie, dass die letzten vier Attribute in der Struktur PrintCash das Systemkonto des Benutzers (auch Unterzeichner der Transaktion), das Collateral-Konto des Benutzers, das $CASH-Token-Konto des Benutzers, das die geprägten $CASH erhält, und den öffentlichen Schlüssel des Kontos sind, das die Berechtigung zum Prägen von $CASH hat.
Die Angriffstransaktion
Nachdem wir die Funktionalität der oben genannten Konten verstanden haben, analysieren wir die Angriffstransaktion: 0x4fgL…z2K5. Dieser Angriff wurde von der Angreiferadresse (befindet sich unter 0x6D7f) initiiert, und die Liste der Eingabekonten in der PrintCash-Anweisung ist unten aufgeführt.
Das Konto #1 (0x5aha) entspricht dem Bank-Konto. Wir stellten fest, dass es sich von der auf der offiziellen Website von CashioApp angegebenen Adresse (0xEm1P) unterscheidet, was bedeutet, dass die Validierung des Bank-Kontos unzureichend ist!
Validierung
Werfen wir einen genaueren Blick auf die Validierung der Struktur BrrrCommon im Code, um herauszufinden, wie die Umgehung funktioniert.
Die einzige Prüfung des Eingabe Bank-Kontos besteht darin, sicherzustellen, dass das Eingabe Collateral-Konto mit dem Bank-Konto verknüpft ist (Zeile 12). Dies kann jedoch leicht umgangen werden, indem auch ein gefälschtes Collateral-Konto angegeben wird. Darüber hinaus stellte der Angreifer gefälschte saber_swap-Konten zur Verfügung, um die Zahlung von realen Collateral-Assets zu vermeiden. Da der Angreifer wertlose Collateral-Assets hinterlegen möchte, um wertvolle $CASH-Tokens zu prägen, sollten das vom Angreifer bereitgestellte crate_token und crate_mint echte Adressen sein. Mit anderen Worten, die unzureichende Überprüfung des Bank-Kontos ermöglicht es dem Angreifer, eine Reihe von gefälschten Konten zu erstellen, um $CASH mit wertlosem Collateral zu prägen.
Die Behebung
Die Behebung besteht darin, die Anweisung assert_keys_eq!(self.bank.crate_mint, self.crate_mint) hinzuzufügen. Diese Anweisung stellt sicher, dass der crate_mint des Bank-Kontos der korrekte crate_mint für $CASH ist. Wie stellt sie jedoch sicher, dass das Bank-Konto gültig ist? Sehen wir uns die Struktur NewBank (im Programm bankman) und die Struktur NewCrate (im Programm crate_token) an, um die Antwort zu finden.
Tatsächlich ist das Bank-Konto ein PDA, dessen Seeds die Adresse des crate_token enthalten. Das crate_token ist ebenfalls ein PDA, dessen Seeds die Adresse des crate_mint enthalten. Dies stellt sicher, dass das Bank-Konto gültig ist, wenn der eingegebene crate_mint gültig ist. Ohne einen korrekten crate_mint können Angreifer $CASH nicht prägen und die Angriffe nicht starten.
Über BlockSec
BlockSec ist ein führendes Unternehmen für Blockchain-Sicherheit, das 2021 von einer Gruppe weltweit renommierter Sicherheitsexperten gegründet wurde. Das Unternehmen engagiert sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufstrebenden Web3-Welt, um deren Massenadoption zu fördern. Zu diesem Zweck bietet BlockSec Dienstleistungen für die Sicherheitsprüfung von Smart Contracts und EVM-Ketten, die Phalcon-Plattform für die Entwicklung von Sicherheitslösungen und die proaktive Abwehr von Bedrohungen, die MetaSleuth-Plattform für die Verfolgung und Untersuchung von Geldern sowie die Erweiterung MetaSuites für Web3-Entwickler, um effizient in der Krypto-Welt zu surfen.
Bislang hat das Unternehmen über 300 geschätzte Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren, darunter Matrix Partners, Vitalbridge Capital und Fenbushi Capital, zweistellige Millionenbeträge in US-Dollar erhalten.
Offizielle Website: https://blocksec.com/
Offizielles Twitter-Konto: https://twitter.com/BlockSecTeam



