2022 年 4 月 23 日成都連南チェーン Bing-Blockchain セキュリティ状況認識プラットフォーム最初のレベルのタイトル
#1 イベント関連情報
4月23日、Solidity開発者のfoobar氏は、11,539ETH(3,400万ドル相当)がAkuDreams契約に永久にロックされており、個人ユーザーも開発チームも資金を引き出すことができないとツイートした。返金処理後、各入札ステータスを 1 に設定します。したがって、ユーザーはEmergencyWithdraw()を呼び出すことができません。また、チームは資金を受け取ることができなくなり、基本的には壊滅に等しい。
成都 LianAn 技術チームは直ちに分析を実施しました。
脆弱な契約:
0xf42c318dbfbaab0eee040279c6a2588fa01a961d
#2 脆弱性分析
脆弱性 1:
脆弱性 1:
1. 最初の契約の抜け穴は次のとおりです。processRefunds、デザイナーは、refundProgress カウンタに従って循環返金を実行します。
2. ここでは、返金処理にcall関数を使用し、返金結果をrequireの判定条件としています。
3. したがって、この時点で攻撃者がキュー内で返金操作を実行している場合、コール返金が攻撃者に呼び出されたときに、攻撃者はフォールバックで悪意のあるリバートを実行し、返金キューがその時点でスタックしてしまいます。攻撃者が攻撃したため、キューの後ろにいた全員は返金できなくなります。
脆弱性 2:
脆弱性 2:
このバグは、約 3,400 万ドル相当の ETH 資産が契約にロックされる原因となった犯人でもありました。
1.claimProjectFunds関数では、主にプロジェクト当事者の出金に使用される関数です。プロジェクト当事者が過度の権限を持ち、ユーザーが出金を完了する前に契約内のすべての資産を譲渡することを防ぐため、ユーザーは返金を受けることができません。プロジェクトが資金を引き出す前に、すべての返金操作を完了する必要があります。ビジネスロジックの設計上は問題ありません。ただし、特定のコード実装では、現在のコードが脆弱性 1 に対して脆弱であり、プロジェクト当事者が資金を引き出すことができなくなりますが、これは潜在的なリスクにすぎず、今回の資金ロックアップの原因はその理由ではありません。
2. 関数のコードの 620 行目に注目してください: require (refundProgress >= totalBids) ここで、refundProgress は処理されたユーザーの数を示し、totalBids はすべてのユーザーが入札した NFT の数を示します。ユーザーは複数の NFT に入札できるため、数値比較では、refundProgress が totalBids よりも小さくなる可能性があることに注意してください。
返金関数 processRefunds を見てみましょう: require(_refundProgress < _bidIndex); bidIndex は入札に参加しているすべてのユーザーを意味し、refundProgress が bidIndex より大きくなることはありません。
この時点で、bidIndex の値 (3669) を見てみましょう。
totalBids の値は 5495 です。
3. したがって、refundProgress>=5495 と返金Progress最初のレベルのタイトル
#3 まとめ
この事件を受けて、成都 LianAn 技術チームは次のように提案しました。
1. 開発者はセキュリティ開発の基本的な認識を持ち、スマートコントラクト開発で注意すべきセキュリティ問題に精通している必要があります。
2. 契約を設計および実装するときは、コード実装の正確さに注意してください。プロジェクトがオンラインになる前に、専門のセキュリティ監査会社を選択して包括的なセキュリティ監査を実施し、セキュリティ リスクを回避できます。