Gestartet am 23. März 2022 um 16:20:08 UTC+8 wurde CashioApp ausgenutzt, um das Collateral-Token-Konto mit einem 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 jegliche 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 Verbrennung von $CASH-Token mit dem Collateral von Saber LP Arrows zuständig ist. Insbesondere können Benutzer $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 print_cash-Anweisung, die $CASH prägen kann, empfängt eine Liste von Konten, darunter das Bank-Konto und das Collateral-Konto. 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. Dieses beiden Konten sollten laut Design 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 gefälschter 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 unten gezeigten verwendeten Konten der 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 die öffentliche Schlüsseladresse des crate_mint (Zeile 107), die öffentlichen Schlüsseladressen der Administratorrollen und mehr. crate_collateral_tokens ist ein Tresorkonto, das die von Benutzern übertragenen Collateral-Token hält. Da das Collateral Arrow LP-Token sein sollten, die LP-Token von Saber erhalten, müssen Benutzer die entsprechenden Konten von saber_swap eingeben. Die letzten beiden Attribute der Struktur BrrrCommon sind die Programm-IDs der in der Anweisung verwendeten Zielprogramme. Beachten Sie, dass die letzten vier Attribute der Struktur PrintCash das Systemkonto des Benutzers (auch der Unterzeichner der Transaktion), das Collateral-Konto des Benutzers, das $CASH-Token-Konto des Benutzers, das die geprägten $CASH-Token empfängt, und die öffentliche Schlüsseladresse des Kontos sind, das die Autorität 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 (0x6D7f) aus initiiert, und die Liste der Eingabekonten in der PrintCash-Anweisung ist unten gezeigt.
Das Konto #1 (0x5aha) oben entspricht dem Bank-Konto. Wir stellen fest, dass es sich von der auf der offiziellen Website von CashioApp (0xEm1P) angegebenen Adresse 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 Überprüfung des Eingabe-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 Angabe eines gefälschten Collateral-Kontos umgangen werden. Darüber hinaus hat der Angreifer, um die Zahlung von echten Collateral-Assets zu vermeiden, auch gefälschte saber_swap-Konten angegeben. Beachten Sie, dass der Angreifer unbezahlbare Collateral-Assets hinterlegen möchte, um wertvolle $CASH-Token zu prägen. Daher 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 gefälschter Konten zu erstellen, um $CASH mit unbezahlbarem 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 der crate_mint des Bank-Kontos der korrekte crate_mint für $CASH ist. Aber wie stellt sie 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. Währenddessen ist das crate_token ebenfalls ein PDA, dessen Seeds die Adresse des crate_mint enthalten. Dies stellt sicher, 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 anerkannter Sicherheitsexperten gegründet wurde. Das Unternehmen engagiert sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufkommenden Web3-Welt, um deren Massenadoption zu erleichtern. Zu diesem Zweck bietet BlockSec Dienstleistungen für die Prüfung von Smart Contracts und EVM-Ketten an Sicherheitsaudits, die Phalcon-Plattform für die Entwicklung von Sicherheit und die proaktive Blockierung von Bedrohungen, die MetaSleuth-Plattform für die Verfolgung und Untersuchung von Geldern sowie die MetaSuites-Erweiterung für Web3-Entwickler, die effizient in der Krypto-Welt surfen.
Bis heute hat das Unternehmen über 300 angesehene Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von erstklassigen Investoren, darunter Matrix Partners, Vitalbridge Capital und Fenbushi Capital, zweistellige Millionenbeträge erhalten.
Offizielle Website: https://blocksec.com/
Offizieller Twitter-Account: https://twitter.com/BlockSecTeam



