📢 #GateOpinionQuest# は #50# でオンラインです! Ola (OLA)でDYORを行い、Gate.ioの投稿で意見を共有し、$100のOLA賞金プールを手に入れましょう!
💰 10人の幸運な参加者を選び、簡単に$OLAの報酬$10を獲得してください!
👉 参加方法:
1. オラ(OLA)の調査を行い、Gate.ioの投稿で意見を共有してください。
2.Ola (OLA)の取引リンクを含める:https://www.gate.io/trade/OLA_USDT、上場日$OLA 2024年11月15日午前10:00(UTC)に注意してください。
3.Ola(OLA)活動の推
Web3セキュリティ警告|最大2000万ドルの損失、Sonne Finance攻撃事件の分析
2024 年 5 月 15 日、Sonne Finance は Optimism オンチェーン への攻撃を受け、最大 2 千 0000 ドルの損失を被りました。
攻撃が発生した後、@tonyke_bot ユーザーは、約100ドルを使用してSonne Financeのトークン担保プール(またはマーケット、CompoundのcTokenに類似)の残り約650万ドルを保護したとツイートしました。
(\_bot/status/1790547461611860182)
攻撃を発見した後、Sonne FinanceのプロジェクトチームはすぐにOptimismのすべての市場を停止し、Baseの市場は安全であると述べました。
(**)
攻撃ブリーフィング
Sonne FinanceはOptimism上のCompound V2の分散型貸借プロトコルのフォークであり、個人、組織、およびプロトコルが金融サービスにアクセスできるようにしています。Sonne Financeプロトコルは、ユーザーのトークン資産を集約し、貸借の流動性プールを形成し、ユーザーに銀行のような貸借ビジネスを提供します。Compoundと同様に、プロトコル参加者は所持しているトークンをSonne Financeの貸借の流動性プールに担保として預けることができ、同時にsoToken(cTokenと同様)の証明書を受け取ることができます。soTokenは利息を生む資産証明書であり、ブロックの進行とともに一定の収益を生み出し、さらにSONNEトークンのインセンティブを受け取ることもできます。また、所持しているsoTokenを利用してSonneの貸借資産プールから他のトークンを借りることもできます。たとえば、参加者は一定数量のUSDCを担保にしてsoUSDCの証明書を受け取り、その後WETHを借り出してさらなる流通を行うことができます。Sonne Financeプロトコルの担保貸借は、多対多の資産関係になることがあります。担保貸借のプロセスでは、プロトコルは参加者のアドレスのヘルスファクターを自動的に計算します。ヘルスファクターが1未満の場合、そのアドレスの担保物は清算の対象となり、清算者は一定の清算報酬を受け取ることができます。
ユーザーが預けた基礎となるトークンとミンティングするsoTokenの数との関係は、主にexchangeRateと呼ばれる変数に関連しており、各soTokenの最長またはそれ以下の基礎となるトークンの値を表すために大まかに使用できます。 exchangeRate は次のように計算されます。
上記の式では、totalCashはsoTokenが保有する原資産トークンの数、totalBorrowsは市場で貸し出された原資産トークンの量、totalReservesは準備金の総額(借り手が支払った利息を含む)、totalSupplyはミンティングされたsoTokenの数を指します。
償還の際、ユーザーは償還する基礎となるトークンの量を指定することができ、redeemAmount、バーンする必要があるsoTokenの数を計算するためにredeemTokens、計算方法は大まかに「redeemTokens = redeemAmount / exchangeRat」であり、ここでは精度損失の処理がないことに注意してください。
本次攻撃事件の本質は、market(soToken)が作成された際に、攻撃者が最初の担保鋳造操作を行い、少量のunderlying tokenで少量のsoTokenを鋳造したことにより、soTokenの「totalSupply」の値が非常に小さくなったことです。その後、攻撃者はSolidityコントラクトの精度損失の脆弱性を利用し、underlying tokenをsoTokenコントラクトに直接送信することで、「totalSupply」の変化がないまま「totalCash」を増やしました。この操作により、コントラクト内の「totalCash」変数が増加しましたが、「totalSupply」は変化しなかったため、exchangeRateが増加しました。最終的に、攻撃者はunderlying tokenを償還する際に、担保時に鋳造されたsoTokenよりも少ないsoTokenを破棄する必要がありました。攻撃者は獲得したsoTokenを他のsoToken(例:soWETH、soUSDC)に貸し出してunderlying tokenであるWETHやUSDCを借りることで、最終的に2,000万ドルの利益を得ました。
**攻撃に関連する重要なアドレス
アタックレディトレーディング:
> \u003e
収益性の高い取引の攻撃:
\u003e > \u003e ** \u003e \u003e
攻撃EOA関連のアドレス:
\u003e -> \u003e \u003e
\u003e \u003e
攻撃者(契約)関連アドレス:
\u003e
基礎となるトークン(VELO トークン V2):
\u003e
漏洞合約(soVELO,类似于 Compound 的 cToken):
\u003e
X 上 @tonyke_bot ユーザーレスキュートレード:
\u003e \u003e **
>
攻撃プロセスの分析
前書き
Sonne Finance プロジェクトは最近、Sonne Finance に VELO マーケットを追加するための提案()を通過し、2日後に実行されるようにマルチ署名ウォレットで5つのトランザクション()を手配しました。これらのトランザクションは VELO マーケット(soVELO コントラクト)の作成と、利率モデルの設定、価格オラクルの設定、担保ファクターの設定など、そのマーケットのいくつかの重要な構成を行うためのものです。VELO マーケットが作成されると、ユーザーは VELO トークンを入金して soVELO トークンを鋳造することができます。そして、soVELO トークンを使って他の soToken を借りることができます。
攻撃の準備
攻撃準備の段階では、攻撃者は提案の2日間のロック時間が終了した後、Sonne Financeのプロジェクト提案の情報に基づいて、VELOマーケット(soVELO契約)を作成し、重要な設定を行い、VELOトークンをsoVELO契約に担保として預けてsoVELOトークンを鋳造します。同時に、自身が保有するVELOトークンをsoVELO契約に直接送信することで、exchangeRateを増やし、後続の攻撃で利益を得るための準備を行います。
具体步骤如下:
soVELO.mint:
3. 攻击者は、soVELOコントラクトにVELOトークンを直接送信することで、数値「2,552,964,259,704,265,837,526」のVELOトークンをsoVELOコントラクトに送信しました。この時点で、soVELOコントラクトが保持するVELOトークンの数量が増えますが、新しいsoVELOトークンのミントが存在しないため、totalSupplyは変わらずに保持されます。つまり、exchangeRate計算式に基づいて計算されたexchangeRateは大きくなります。 4. 攻击者将持有的 soVELO 代币转移多次,最终转移给了另一个攻击 EOA 0xae4a。
利益を得るための攻撃
攻撃者は、利益を得る段階で、その提案の第5トランザクションを実行し、VELOトークンをsoVELO契約に直接送信するために、フラッシュローンを使用します。これにより、exchangeRateがさらに増加します。その後、攻撃者は手持ちの値が2のsoVELOトークンを使用して、WETHやUSDCなどのアンダーラインのトークンを他のsoToken(例:soWETH、soUSDCなど)契約から借り出します。これらの部分が攻撃者の利益となります。その後、攻撃者はsoVELO契約から自分のアンダーラインのトークンを引き換えます。exchangeRateが大きくなり、引き換えに必要なsoVELOトークンの精度の損失の問題があるため、結果として、攻撃者は値が1のsoVELOトークンだけを使用して、以前に預けたほぼすべてのVELOトークンを引き換えることができました。攻撃者は、値が1のsoVELOトークンを使用し、他のsoTokenからWETH、USDCなどのアンダーラインのトークンを借り出すことで利益を得たと言えます。攻撃者は同じ手法を繰り返し、最終的に大きな利益を得ます。
具体步骤如下: -> 具体の手順は次のとおりです:
攻撃者は、事件の第5トランザクションを実行し、提案で定められた貸借倍率を設定します。 2. 攻撃者はVolatileV2 AMM - USDC/VELOプールから「 35,469,150,965,253,049,864,450,449 」のVELOトークンをフラッシュローンで借り出し、これにより攻撃者のフック関数がトリガーされます。フック関数内で、攻撃者は攻撃操作を継続します。 3. 攻撃者は自身が保有するVELOトークンをsoVELO契約に送り、exchangeRateをさらに増やします。現在、soVELO契約には合計「35,471,703,929,512,754,530,287,976」のVELOトークン(攻撃者が3回転送したVELOトークンを含む)があります。 攻撃者が新しい契約 0xa16388a6210545b27f669d5189648c1722300b8b を作成し、コンストラクタで保持している2つのsoVELOトークンを新しく作成された契約0xa163(以下、攻撃者0xa163と呼ぶ)に移動します。 5. 攻撃者は0xa163保有するsoWETHトークンから「265,842,857,910,985,546,929」という値のWETHを貸し出します。 6. 攻撃者の0xa163は、soVELOの「redeemUnderlying」関数を呼び出し、「35,471,603,929,512,754,530,287,976」という値でVELOトークンを引き換えることを指定します(これはほぼ攻撃者が以前にsoVELO契約に入金または担保したVELOトークンの数量です)。この場合、「redeemTokens = redeemAmountIn / exchangeRate」の式に基づいて、破棄する必要のあるsoVELOトークンの数量を計算する必要があります。
「exchangeRateStoredInternal」関数からわかるように、この時点での_totalSupplyは0ではなく2であるため、exchangeRateの値を計算する必要があります。公式「exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply」によって、現在のexchangeRateは「17,735,851,964,756,377,265,143,988,000,000,000,000,000,000」となります。この値は、設定された初期のexchangeRate「200,000,000,000,000,000,000,000,00」よりもはるかに大きいです。
根据新的exchangeRate計算出的「redeemTokens」の値は「1.99」ですが、Solidityの特性により、「redeemTokens」の値は最終的に1になります。これは、攻撃者である0xa163が値が1のsoVELOトークンを使用して、以前に預けたほぼすべてのVELOトークンを引き出したことを意味します。同時に、攻撃者の0xa163は、soWETHから借りた値が「265,842,857,910,985,546,929」のWETHも獲得しました。
soVELO.redeemUnderlying:
soVELO.exchangeRateStoredInternal: 7.攻撃者は0xa163借りたWETHと償還したVELO トークンをすべて上位の攻撃者に譲渡し、自爆します。 8. 攻撃者は、soWETHの「liquidateBorrow」関数を呼び出し、先ほど作成された契約0xa163の一部の資産を清算し、ロックされた値が1のsoVELOトークンを回収するために使用します。現時点では、攻撃者は値が1のsoVELOトークンのみを所有しています。 9. 攻撃者はsoVELOの「mint」関数を呼び出し、再びsoVELOトークンを鋳造し、値が2のsoVELOトークンを集め、上記の3-8ステップを再度実行して他の下位トークンの利益を得ます。 10.攻撃者はステップ9を数回実行し、フラッシュローンを完済し、利益を上げて市場から撤退します。
$100 で $650 万を引き出す方法
攻撃が発生した後、ユーザーの@tonyke_botはトランザクション0x0a284cdで1144個のVELOトークンをsoVELOコントラクトに担保として預け、0.00000011個のsoVELOを作成しました。この操作によって攻撃者のさらなる攻撃が防止されたのは、このトランザクションによってsoVELOのtotalSupplyと保有しているVELOトークンの数量totalCashが変化したためです。そして、totalSupplyの増加がexchangeRateに与える影響はtotalCashの増加よりも大きいため、exchangeRateが小さくなります。その結果、攻撃者は精度の損失を利用してsoVELOを獲得できず、攻撃を継続することができません。
資金のトラッキング
攻撃者は違法な収益をつかんだ直後に資金を送金し、そのほとんどは次の4つのアドレスに送金され、一部は別のアドレスで攻撃を継続し、一部は取引手数料に送金されました。
攻撃者は198 WETHをアドレスに転送し、アドレスは同じ攻撃戦術を使用して、次のトランザクションで不正な収益を得ました。
攻撃後、アドレスは収益を0x5d0d99e9886581ff8fcb01f35804317f5ed80bbbに送金しました。
攻撃者は、724277 USDCと2353 VELOをこのアドレスに送り込み、USDCをEtherに交換しました。その後、一部の資金をStargateクロスチェーンブリッジに送り、大部分の不正な資金はこのアドレスに残っています。
攻撃者は33 WETHをアドレスに転送し、ピールチェーンを使用して取引手数料を試みましたが、取引手数料のリンクは次のとおりです。
0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003093c2b4 -> * 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795*。
攻撃者は、563 WETHをこのアドレスに送り、その後 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68 に転送しましたが、現時点ではそれ以上の行動はありません。
攻撃者の洗浄手法は比較的専門的であり、手法は多様性の傾向を示しています。そのため、私たちのWeb3参加者としては、セキュリティ面でのアンチマネーロンダリング能力を継続的に向上させる必要があります。KYT、AMLなどの関連するブロックチェーン取引セキュリティ製品を使用して、Defiプロジェクトのセキュリティを向上させることが重要です。
セキュリティのアドバイス
1.精度の低下に注意を払う必要があります。 精度の低下によるセキュリティの問題が次々と発生し、特にDefiプロジェクトでは、精度の低下が深刻な経済的損失につながることがよくあります。 プロジェクト チームとセキュリティ監査者は、プロジェクトの精度が低下しているコードを慎重にレビューし、脆弱性を可能な限り回避するために適切にテストすることをお勧めします。 2. コンパウンドのcTokenに似たマーケットの作成と最初のステーキングミンティング操作は、為替レートを操作するために、攻撃者による操作を避けるために特権ユーザーが実行することをお勧めします。 3. 合約において、「this.balance」または「token.balanceOf()」の値に依存する重要な変数が存在する場合、その変数の変化条件を慎重に考慮する必要があります。例えば、その変数の値をネイティブトークンまたはトークンを提供する方法で直接変更することが許可されているか、または特定の関数の呼び出しによってのみ変更することができるかなど、変更条件を検討してください。
本文はZANチームのCara(Xアカウント@Cara6289)とXiG(Xアカウント@SHXiGi)によって共同で執筆されました。