2022年3月23日16:20:08 UTC+8に開始されたCashioAppは、約5200万ドルの損失で担保トークンアカウントを枯渇させるように悪用されました。このハッキングは、攻撃者が預け入れなしで200億ドルの$CASHトークンを鋳造することを可能にする、入力アカウントの不十分なチェックによって可能になりました。以下に、技術的な詳細を示します。
要約
このインシデントは、Saber LP Arrowsを担保として$CASHトークンの鋳造と燃焼を処理するように設計されたBrrrプログラムのバグが原因でした。具体的には、ユーザーはArrowLPトークンを預け入れることで$CASHを印刷(つまり、$CASHを鋳造)できます。Arrow LPトークンは、Saber LPトークンを基盤トークンとして受け取ることに注意してください。$CASHを鋳造できるprint_cash命令は、BankアカウントやCollateralアカウントを含むアカウントのリストを受け取ります。これらは、$CASHの鋳造に使用できる担保(つまり、ArrowLPトークン)を記録および追跡するために使用されます。設計上、これら2つのアカウントは管理者によってのみ初期化および承認される必要があります。しかし、プログラムはBankアカウントの有効性をチェックしません。その結果、攻撃者は一連の偽のアカウント(Bankアカウントを含む)をprint_cash命令にフィードするために作成し、ほぼ無料で$CASHを印刷できました(唯一のコストはトランザクション手数料です)。
詳細
まず、以下のprint_cash命令で使用されるアカウントから分析を開始しましょう。
属性common(75行目)は、プログラム内のBrrrCommon型の構造体です。BrrrCommonでは、bankアカウントとcollateralアカウントは管理者によって初期化および承認されます。crate_tokenは$CASHトークンアカウントであり、$CASHに関する情報(crate_mintの公開鍵(107行目)、管理者ロールの公開鍵など)を格納します。crate_collateral_tokensは、ユーザーから転送された担保トークンを保持するボルトアカウントです。担保はArrowLPトークンであるため、SaberのLPトークンを受け取るため、ユーザーはsaber_swapの関連アカウントを入力する必要があります。構造体BrrrCommonの最後の2つの属性は、命令で使用されるターゲットプログラムのプログラムIDです。構造体PrintCashの最後の4つの属性は、ユーザーのシステムアカウント(トランザクションの署名者でもあります)、ユーザーの担保アカウント、鋳造された$CASHを受け取るユーザーの$CASHトークンアカウント、および$CASHを鋳造する権限を持つアカウントの公開鍵です。
攻撃トランザクション
上記アカウントの機能を理解した後、攻撃トランザクション:0x4fgL…z2K5を分析します。この攻撃は、攻撃者アドレス(0x6D7fにある)から開始され、PrintCash命令の入力アカウントのリストは以下のとおりです。
Account #1(0x5aha)は、Bankアカウントに対応します。これは、CashioAppの公式ウェブサイト(0xEm1P)で提供されているアドレスとは異なることに注意してください。これは、Bankアカウントの検証が不十分であることを意味します!
検証
コード内の構造体BrrrCommonの検証を詳しく調べて、バイパスがどのように機能するかを理解しましょう。
入力Bankアカウントに対する唯一のチェックは、入力CollateralアカウントがBankアカウントに関連付けられていることを確認することです(12行目)。しかし、偽のCollateralアカウントを提供することでも簡単にバイパスできます。さらに、実際の担保資産を支払うことを避けるために、攻撃者は偽のsaber_swapアカウントも提供しました。攻撃者は価値のない担保資産を預けて価値のある$CASHトークンを印刷することを目的としていることに注意してください。したがって、攻撃者によって提供されたcrate_tokenとcrate_mintは実際の有効なアドレスである必要があります。つまり、Bankアカウントの不十分なチェックにより、攻撃者は一連の偽のアカウントを作成して、価値のない担保で$CASHを印刷することができました。
修正
修正は、assert_keys_eq!(self.bank.crate_mint, self.crate_mint)ステートメントを追加することです。このステートメントは、Bankアカウントのcrate_mintが$CASHの正しいcrate_mintであることを保証します。しかし、どのようにBankアカウントが有効であることを保証するのでしょうか?回答を見つけるために、(program bankmanの)NewBank構造体と、(program crate_tokenの)NewCrate構造体を見てみましょう。
実際、Bankアカウントはcrate_tokenのアドレスをシードとして含むPDAです。一方、crate_tokenもcrate_mintのアドレスをシードとして含むPDAです。これにより、入力crate_mintが有効であれば、Bankアカウントが有効であることが保証されます。正しいcrate_mintなしでは、攻撃者は$CASHを鋳造できず、攻撃を開始できません。
BlockSecについて
BlockSecは、2021年に世界的に著名なセキュリティ専門家チームによって設立された先駆的なブロックチェーンセキュリティ企業です。同社は、台頭するWeb3の世界のセキュリティと使いやすさを向上させ、その大規模な採用を促進することに尽力しています。この目的のため、BlockSecはスマートコントラクトとEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3ビルダーが暗号世界を効率的にサーフィンするためのMetaSuites拡張機能を提供しています。
現在までに、同社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300社以上の著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達で数千万米ドルを受け取っています。
公式ウェブサイト:https://blocksec.com/
公式Twitterアカウント:https://twitter.com/BlockSecTeam



