背景の紹介
2025 年 1 月 4 日、私たちはイーサリアム チェーン上の Sorra プロジェクトに対する複数の攻撃を監視しました。攻撃ハッシュは次のとおりです。
https://etherscan.io/tx/0x6439d63cc57fb68a32ea8ffd8f02496e8abad67292be94904c0b47a4d14ce90d
https://etherscan.io/tx/0x03ddae63fc15519b09d716b038b2685f4c64078c5ea0aa71c16828a089e907fd
https://etherscan.io/tx/0xf1a494239af59cd4c1d649a1510f0beab8bb78c62f31e390ba161eb2c29fbf8b
https://etherscan.io/tx/0x09b26b87a91c7aea3db05cfcf3718c827eba58c0da1f2bf481505e0c8dc0766b
攻撃を受けたプロジェクトはSorraで、攻撃により合計 41,000 米ドルの損失が発生しました。
攻撃とインシデントの分析
2024 年 12 月 21 日、攻撃者はステーキングを通じて攻撃の準備を開始しました。
ステーキング時に選択された _tier が 0 であるため、契約によれば、ロックアップ期間は 14 日間です。
14 日後の 2025 年 1 月 4 日に、攻撃者は攻撃を開始しました。攻撃者は、_amount を引き出すことで _amount を 1 にします。引き出し関数の具体的な実装を見てみましょう。
上記のコードの全体的なロジックは次のとおりです。最初のステップは、ユーザーの預金資産の有効期限が切れているかどうかを判断し、次に報酬を計算し、最後にポジションを減算することです。
まず、報酬の計算方法を見てみましょう。
コードから、期限切れのすべてのデポジットに対して報酬計算が計算されていることがわかります。これには問題ないようです。
位置を更新する方法を見てみましょう。
updatePosition では vaultExtension が設定されていないため、直接 _decreasePosition 関数に進みます。 _decreasePosition 関数では、出金額とポジションの削減操作のみが実行されます。したがって、ここに抜け穴があり、ユーザーのデポジットの有効期限が切れると、任意の金額のデポジットを引き出すことができ、同時に、期限切れのデポジットの報酬もすべて引き出すことになります。ただし、報酬が抽出されたかどうかは判定されないため、繰り返し報酬が抽出されることになります。
要約する
この脆弱性の原因は、Sorra プロジェクト チームが、ユーザーが退会するときに、ユーザーが特典をすでに引き出しているかどうかを判断できなかったため、その結果、ユーザーが多数の操作を通じて報酬を繰り返し引き出してしまう可能性があることです。攻撃者は上記の脆弱性を悪用して複数のトランザクションを開始し、Sorra プロジェクト内のすべての SOR トークンを抽出しました。プロジェクト当事者は、コード操作ロジックを設計するときに複数の当事者による検証を実施し、契約がオンラインになる前に相互監査のために複数の監査会社を選択するよう努めることをお勧めします。