Erneute Untersuchung des CashioApp-Sicherheitsvorfalls

CashioApp wurde wegen unzureichender Eingabekontenprüfung ausgenutzt. Dies führte zur unberechtigten Prägung von $CASH-Tokens mittels gefälschter Sicherheiten und Saber-Konten.

Erneute Untersuchung des CashioApp-Sicherheitsvorfalls

Am 23. März 2022 um 16:20:08 UTC+8 wurde die CashioApp ausgenutzt, um das Collateral-Token-Konto für einen Verlust von etwa 52 Millionen zu leeren. Der Hack wurde durch eine unzureichende Überprüfung der Eingabekonten ermöglicht, die es dem Angreifer erlaubte, 20 Milliarden $CASH-Token ohne Einzahlung zu prägen. Im Folgenden zeigen wir die technischen Details.

Zusammenfassung

Der Vorfall wurde durch einen Fehler im Brrr-Programm verursacht, das für die Prägung und das Verbrennen von $CASH-Token mit dem Collateral von Saber LP Arrows zuständig ist. Insbesondere können Benutzer $CASH drucken, d. h. $CASH prägen, indem sie Arrow LP-Token hinterlegen. Beachten Sie, dass Arrow LP-Token die Saber LP-Token als zugrunde liegende Token erhalten. Die Anweisung print_cash, die $CASH prägen 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-Token) aufzuzeichnen und zu verfolgen, das für die Prägung von $CASH verwendet werden darf. Standardmäßig 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, die in die Anweisung print_cash eingespeist wurden, und $CASH fast kostenlos prägen (die einzigen Kosten waren Transaktionsgebühren).

Details

Beginnen wir die Analyse mit den verwendeten Konten der unten gezeigten Anweisung print_cash.

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. Das crate_token ist das Konto des $CASH-Tokens, das Informationen über $CASH speichert, wie z. B. den öffentlichen Schlüssel des crate_mint (Zeile 107), die öffentlichen Schlüssel von Admin-Rollen und mehr. Das crate_collateral_tokens ist ein Vault-Konto, das die vom Benutzer übertragenen Collateral-Token hält. Da das Collateral Arrow LP-Token sein sollten, die die LP-Token von Saber erhalten, müssen Benutzer die zugehörigen Konten von saber_swap eingeben. Die letzten beiden Attribute in der Struktur BrrrCommon sind die Programm-IDs der in der Anweisung verwendeten Zielprogramme. 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 empfängt, und den öffentlichen Schlüssel des Kontos sind, das die Befugnis zum Prägen von $CASH hat.

Die Angriffstransaktion

Nachdem wir die Funktionalität der oben genannten Konten verstanden haben, beginnen wir mit der Analyse der Angriffstransaktion: 0x4fgL…z2K5. Dieser Angriff wurde von der Angreiferadresse (befindet sich unter 0x6D7f) initiiert, und die Liste der Eingabekonten in der Anweisung PrintCash ist unten dargestellt.

Das Konto Nr. 1 (0x5aha) entspricht dem Bank-Konto. Wir haben festgestellt, dass es sich vom auf der offiziellen Website von CashioApp angegebenen Adressunterscheidet (0xEm1P), was bedeutet, dass die Validierung des Bank-Kontos unzureichend ist!

Validierung

Betrachten wir die Validierung der Struktur BrrrCommon im Code genauer, um herauszufinden, wie die Umgehung funktioniert.

Die einzige Überprüfung des eingegebenen Bank-Kontos besteht darin, sicherzustellen, dass das eingegebene Collateral-Konto mit dem Bank-Konto verknüpft ist (Zeile 12). Dies kann jedoch leicht durch die Bereitstellung eines gefälschten Collateral-Kontos umgangen werden. Darüber hinaus stellte der Angreifer gefälschte saber_swap-Konten zur Verfügung, um die Zahlung echter Collateral-Assets zu vermeiden. Da der Angreifer darauf abzielt, unwertvolle Collateral-Assets einzuzahlen, um wertvolle $CASH-Token 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öglichte es dem Angreifer, eine Reihe von gefälschten Konten zu erstellen, um $CASH mit unwertvollem Collateral zu prägen.

Die Korrektur

Die Korrektur besteht darin, die Anweisung assert_keys_eq!(self.bank.crate_mint, self.crate_mint) hinzuzufügen. Diese Anweisung stellt sicher, dass das crate_mint des Bank-Kontos das richtige crate_mint für $CASH ist. Aber wie stellt sie sicher, dass das Bank-Konto gültig ist? Schauen wir uns die NewBank-Struktur (im Programm bankman) und die NewCrate-Struktur (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 gewährleistet, dass das Bank-Konto gültig ist, wenn das eingegebene crate_mint gültig ist. Ohne ein korrektes crate_mint können Angreifer $CASH nicht prägen und keine Angriffe starten.

Über BlockSec

BlockSec ist ein wegweisendes 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 (Sicherheitsprüfung), die Phalcon-Plattform für die sichere Entwicklung und proaktive Bedrohungsabwehr, die MetaSleuth-Plattform für die Verfolgung und Untersuchung von Geldern sowie die MetaSuites-Erweiterung für Web3-Entwickler, um effizient in der Krypto-Welt zu surfen.

Bis heute hat das Unternehmen über 300 geschätzte Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren wie Matrix Partners, Vitalbridge Capital und Fenbushi Capital zweistellige Millionenbeträge erhalten.

Offizielle Website: https://blocksec.com/

Offizielles Twitter-Konto: https://twitter.com/BlockSecTeam

Sign up for the latest updates