BlockSecによる

2022年11月8日、Sushiの公式KashiPairMediumRiskV1コントラクト(またはそこから分岐した一部のコントラクト)上に構築されたプールから資産が流出した攻撃がいくつかあったことを検出しました。調査の結果、根本的な原因はトークン価格の誤算を引き起こすロジックのバグによるものであることがわかりました。

私たちはすぐに Sushi のセキュリティ チームに連絡し、私たちの調査結果を確認しました。幸いにも、彼らは価値はあるが脆弱なプールを攻撃から守るための対策を講じていました。さらに、彼らはこのエクスプロイトで資金を失った人々に補償する手順も提供しました。そのため、私たちは現在、この脆弱性と攻撃についての詳細を公開しても安全だと考えています。このレポートでは、詳細な分析を提供したいと思います。

脆弱性分析

KashiPairMediumRiskV1コントラクトのソースコードを分析した結果、このバグはborrow関数にあると結論付けられました。borrow関数は、solvent修飾子の借入シェアを検証するために古いexchangeRateを使用しています。具体的には、_isSolvent関数のexchangeRateの現在の値に基づいて検証が実行されます。

liquidate 関数では、updateExchangeRate 関数が最初に呼び出されます。したがって、検証と計算は更新された値に基づいて実行されます。

明らかに、このバグを悪用すると(莫大な)価格差が生じる可能性があります。

攻撃分析

私たちは 2 つの攻撃を観察しました:

  1. https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: 被害者はKashiPairMediumRiskV1契約を使用しており、損失は約9,466 USDCです。

  2. https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: 被害者は CauldronMediumRiskV1 (KashiPairMediumRiskV1 のフォーク) を使用する戦略コントラクトであり、損失は約 110,911 MIM です。

最初の攻撃トランザクションは、元の攻撃トランザクションを先導するボットによって開始されたことに注意してください: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18、元の攻撃者のアドレスは 0xb7ea0f0f8c6df7a61bf024db21bbe85ac5688005 です。

ここでは、次の手順で構成される最初の攻撃トランザクションを例として取り上げます。

  1. Balancer から 40,900 BADGER と 121,904 USDC のフラッシュローンを借り入れます。

  2. 40,900 BADGERと113,599 USDCをBentoBoxに入金します。

  3. kmBADGER/USDC-LINK の addCollat​​eral 関数を呼び出して、BADGER の 40,900,000,000,000,000,000,000 株を預け入れます。

  4. kmBADGER/USDC-LINKのaddAsset関数を呼び出して、112,529,000,000株のUSDCを入金します。

  5. 借入機能を呼び出して、120,755,095,093 株の USDC を借り入れます。

  6. UpdateExchangeRate関数を呼び出します。

  7. 清算関数を呼び出して自身を清算します。

  8. BentoBoxから40,899 BADGERと123,006 USDCを引き出します。

  9. フラッシュローンを返済し、約9466 USDCの利益を得ました。

借用関数はUpdateExchangeRate関数を呼び出すため、手順6は不要であることに注意してください。

主な手順は次のとおりです。borrow 関数で使用される exchangeRate の値が、liquidate 関数で使用される値と異なることは容易に理解できます。

  • 借用関数の場合: 250,997,938,545,109,237,740,214,705,193

  • 清算関数の場合: 328,266,883,541,864,569,505,752,156,794

影響

このバグの影響を受ける可能性のあるプールは数十あります(Ethereum と BSC の両方)。この問題を軽減する一時的な方法は、UpdateExchangeRate 関数を時々(または定期的に)呼び出すことで偏差を減らすか、なくすことです。この方法はすでに多くの影響を受けるプロジェクトで採用されており、対応するトランザクションは実際に観察されています。