Sonne Finance攻撃の分析

中級Jun 11, 2024
この攻撃の本質は、市場(soToken)の作成にあり、攻撃者は少量の基礎となるトークンで最初の担保ミンティング操作を実行し、soTokenの「totalSupply」値が非常に小さくなります。
Sonne Finance攻撃の分析

2024 年 5 月 15 日、Sonne Finance は Optimism チェーンへの攻撃を受け、最大 2,000 万ドルの損失を被りました。攻撃後、Twitterユーザー@tonyke_botは、Sonne Financeの担保プール(CompoundのcTokenに似たマーケットとも呼ばれる)の残りの650万ドルを約100ドルで保護したとツイートしました。


(https://twitter.com/tonyke_bot/status/1790547461611860182)

攻撃を発見すると、Sonne FinanceチームはすぐにOptimismのすべての市場を一時停止し、Baseの市場は安全であると述べました。

(https://twitter.com/SonneFinance/status/1790535383005966554)

攻撃の概要

Sonne Financeは、OptimismでCompound V2をフォークする分散型レンディングプロトコルであり、個人、機関、プロトコルに金融サービスへのアクセスを提供します。Sonne Financeプロトコルは、ユーザーのトークン資産を集約して貸付流動性プールを形成し、ユーザーに銀行のような貸付ビジネスを提供します。コンパウンドと同様に、プロトコル参加者はトークンをSonne Financeの貸付流動性プールに抵当に入れ、証明書soToken(cTokenと同じ)を取得できます。SoTokenは有利子資産証明書であり、ブロックが進むにつれて一定額の収入を生み出し、SONEトークンのインセンティブも受け取ります。参加者は、soTokenを手にして、Sonneの貸付資産プールから他のトークンを借りることもできます。たとえば、参加者は一定額のUSDCを抵当に入れてsoUSDC証明書を取得し、WETHを貸し出してさらに流通させることができます。Sonne Financeのプロトコルにおける住宅ローンの貸付は、多対多の資産関係にすることができます。住宅ローンの貸付プロセス中に、プロトコルは参加者の住所の健康係数(健康係数)を自動的に計算します。健康係数が1未満の場合、住所の抵当権がサポート 清算され、清算人も特定の清算報酬を受け取ることができます。

ユーザーが預けた基礎となるトークンの数と鋳造されたsoTokensの関係は、主にexchangeRateと呼ばれる変数に関連しています。この変数は、各soTokenの基になるトークンの価値を大まかに示すために使用できます。exchangeRateの計算式は次のとおりです。

上記の式において、totalCashはsoTokenが保有する原資産トークンの数を指し、totalBorrowsは特定の市場で貸し出された原資産トークンの数を指し、totalReservesは総準備金額(借り手が支払った利息を含む)を指し、totalSupplyはsoTokenが鋳造された数を指します。

償還時に、ユーザーは償還する基になるトークンの数 redeemAmount を指定して、破棄する必要がある soToken の数 (redeemTokens) を計算できます。計算方法は大まかに「redeemTokens=redeemAmount/exchangeRat」となります。ここでは精度の低下はないことに注意してください。と対処します。

この攻撃の本質は、市場(soToken)が作成されたときに、攻撃者が最初の住宅ローンキャスティング操作を実行し、基礎となるトークンが少量であるsoTokenを非常に少数鋳造したため、soTokenの「totalSupply」値が小さすぎることです。その後、攻撃者はSolidityコントラクトの精度低下の脆弱性を悪用し、ステーキング+キャスト方式で基礎となるトークンを入金する代わりに、基礎となるトークンをsoTokenコントラクトに直接送信しました(soTokenはミントされないため、「totalSupply」は変更されず、「totalCash」が大きくなります)。このような操作により、コントラクトの「totalCash」変数は大きくなりますが、「totalSupply」は変更されないため、exchangeRateが大きくなります。最終的に、攻撃者が基礎となるトークンを償還すると、破棄する必要があるsoTokenは、住宅ローン中に鋳造されたsoTokenよりも少なくなります。攻撃者は獲得したsoTokenを使用して、基礎となるトークンWETHとUSDCを他のsoToken(soWETH、soUSDCなど)に貸し出し、最終的に利益は2,000万米ドルにもなります。

攻撃に関与するキーアドレス

攻撃準備トランザクション:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

収益性の高い取引を攻撃する:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

攻撃EOA関連のアドレス:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

攻撃者(コントラクト)関連アドレス:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

基礎となるトークン(VELO トークン V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

脆弱性コントラクト(soVELO、CompoundのcTokenに類似):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot Xでのユーザーレスキュートランザクション:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

攻撃プロセス分析

まとめ

Sonne Financeプロジェクトチームは最近、Sonne FinanceにVELO市場を追加する提案を可決し(https://twitter.com/SonneFinance/status/1786871066075206044)、2日後に実行されるマルチシグウォレットを介した5つのトランザクションを手配しました(https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7)、これら5つのトランザクションは、VELO市場(soVELOコントラクト)を作成し、金利モデルの設定、価格オラクルの設定、住宅ローンの要因の設定など、市場のいくつかの重要な構成を設定するために使用されます。VELOマーケットが作成されると、ユーザーはトークンを入金 VELOしてsoVELOトークンミントことができ、そのトークンを使用して他のsoTokenを借りることができます。

攻撃準備

攻撃準備段階は、主に攻撃者が提案の2日間のロックイン期間が終了した後、Sonne Financeプロジェクト提案の情報に基づいてVELO市場(soVELOコントラクト)を作成し、主要な構成を設定し、トークンを抵当に入れてsoVELOコントラクトにトークンをミント VELOすることです。 soVELOトークンを作成し、保有しているVELOトークンをsoVELOコントラクトに直接送信してexchangeRateを増やし、準備しますその後の攻撃から利益を得るため。

具体的な手順は次のとおりです。

  1. 2日間のロックイン期間が終了すると、攻撃者はまず、プロポーザルで配置された最初の4つのトランザクションの操作を1つのトランザクション(トランザクション0x45c0cc)にパッケージ化し、それを使用してVELO市場(soVELOコントラクト)を作成し、キー構成を設定します。VELOマーケットを初期化すると、exchangeRateは「200,000,000,000,000,000,000,000,000,000」に設定されます。

  2. 攻撃者は、soVELOコントラクトの「ミント」機能を呼び出して、トークンを入金 VELOし、soVELOトークンをミントします。攻撃者は「mintAmount」を「400,000,001」(VELOトークンの数)と指定します。関数「exchangeRateStoredInternal」からわかるように、このときsoVELOトークンの「_totalSuppl」は0なので、exchangeRateは手順1で設定した値です。「mintTokens = actualMintAmount / exchangeRate」という式によると、このとき鋳造すべきsoVELOトークンの計算数は2です。ショートでは、このステップで、攻撃者は「400,000,001」の値を持つVELOトークンをsoVELOコントラクトに預け、攻撃者は2の値を持つsoVELOトークンを取得します。

ソベロミント:

  1. 攻撃者は、VELOトークンをsoVELOコントラクトに直接送信することにより、「2,552,964,259,704,265,837,526」の値を持つVELOトークンをsoVELOコントラクトに送信しました。このとき、soVELOコントラクトが保有するVELOトークンの数は増加しましたが、新しいsoVELOトークンがなかったため、通貨が鋳造されるため、totalSupplyは変更されず、このときexchangeRate計算式に従って計算されたexchangeRateが大きくなります。

  2. 攻撃者は、複数回保持されているsoVELOトークンを転送し、最終的に別の攻撃EOA 0xae4aに転送しました。

営利目的の攻撃

攻撃利益フェーズでは、主に攻撃者がプロポーザルの5番目のトランザクションを実行し、フラッシュローンを通じてVELOトークンをsoVELOコントラクトに直接貸し出し、exchangeRateをさらに増加させます。次に、攻撃者は手札に2の値を持つsoVELOトークンを使用して、他のsoToken(soWETH、soUSDCなど)コントラクトからWETHやUSDCなどの基礎となるトークンを借り、これらの部分が攻撃者の利益になります。その後、攻撃者はsoVELOコントラクトの基盤となるトークンを引き換えました。exchangeRateの増加と、償還のために破壊する必要があるsoVELOトークンの計算精度の低下により、攻撃者は最終的に値が1のsoVELOトークンのみを使用しました。以前に預けられたVELOトークンのほとんどが償還されましたが、これは攻撃者が他のsoTokenから借りてWETHやUSDCなどの基礎となるトークンを獲得するために、値が1の余分なsoVELOトークンを使用していると理解できます。攻撃者は同じ手法を使用して攻撃を何度も繰り返し、最終的に莫大な利益を上げました。

具体的な手順は次のとおりです。

  1. 攻撃者は、プロポーザルの 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トークンの合計)。

  4. 攻撃者は新しいコントラクト0xa16388a6210545b27f669d5189648c1722300b8bを作成します。コンストラクタでは、保有している2つのsoVELOトークンを、新しく作成されたコントラクト0xa163(以下、アタッカー 0xa163と呼ぶ)に転送します。

  5. 攻撃者は0xa163保有していたsoVELOトークンを使用して、soWETHから「265,842,857,910,985,546,929」のWETHを借りていました。

  6. 攻撃者0xa163は、soVELOの「redeemUnderlying」関数を呼び出し、償還されたVELOトークンの価値を「35,471,603,929,512,754,530,287,976」(攻撃者が以前に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,0 00,000,000,000,000」であり、この値は、最初に設定されたexchangeRate「200,000,000,000,000,000,000,000,000,000,000」よりもはるかに大きくなります。

新しいexchangeRateに基づいて計算された「redeemTokens」の値は「1.99」です。Solidityの下向きの四捨五入特性により、「 redeemTokens 」の値は最終的に1になります。これは、攻撃者が0xa163値が1のsoVELOトークンを使用して、以前に預けられたほぼすべてのVELOトークンを償還したことを意味します。同時に、攻撃者はsoWETHから借りた「265,842,857,910,985,546,929」という値でWETH 0xa163も獲得しました。

soVELO.redeemUnderlying:

soVELO.exchangeRateStoredInternal:

  1. 攻撃者は0xa163借用したすべてのWETHと償還したVELOトークンを上位レベルの攻撃者に転送し、自滅させました。

  2. 攻撃者は、soWETHの「liquidateBorrow」関数を呼び出して、注文に新しく作成されたコントラクト0xa163から借りた資産の一部を清算し、値1でロックされたsoVELOトークンを取り戻します。現在、攻撃者は値が1のsoVELOトークンのみを保持しています。

  3. 攻撃者は、soVELOの「ミント」機能を呼び出し、値2の十分なsoVELOトークンを収集する目的でsoVELOトークンを再度抵当および鋳造し、上記の手順3〜8を再度実行して、他のトークンから利益を得ます。

  4. 攻撃者はステップ9の操作を数回実行し、フラッシュローンを返済し、利益を上げて市場を去ります。

$100が650万ドルをレバレッジする方法

攻撃後、Xのユーザー@tonyke_botは、トランザクション0x0a284cdで1144 VELOトークンをsoVELOコントラクトにステーキングすることにより、0.00000011 soVELOをミントしました。

この操作が攻撃者のさらなる攻撃を防ぐことができる理由は、このトランザクションがsoVELOのtotalSupplyのサイズとtotalCashが保有するVELOトークンの数を変更し、totalRateの計算に対するtotalSupplyの増加の影響がtotalCashの成長の影響よりも大きいためです。したがって、exchangeRateが小さくなり、攻撃者は攻撃を行うときに精度の低下を利用してsoVELOを獲得することがロングできなくなり、攻撃がロングできなくなります。

お金の追跡

攻撃者は、違法な収益をつかんだ直後に資金を送金しました。資金の大部分は、以下の4つの住所に振り込まれました。攻撃を続けるために住所を変更するものもあれば、マネーロンダリングのためのものもありました。

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

攻撃者はこのアドレスに198 WETHを転送し、アドレスは同じ攻撃方法を使用して、次のトランザクションで不正な利益を取得しました。

攻撃後、アドレスは上記の違法な利益を0x5d0d99e9886581ff8fcb01f35804317f5ed80bbbに転送しました。

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

攻撃者は724277 USDCと2353 VELOをこのアドレスに転送し、USDCをエーテルと交換しました。その後、いくつかの資金はすぐにスターゲイトクロスチェーン ブリッジに送金されました。違法な資金のほとんどは、このアドレスに残っています。

3、0xbd18100a168321701955e348f03d0df4f517c13b

攻撃者は33 WETHをこのアドレスに転送し、ピールチェーンを使用してマネーロンダリングを試みました。マネーロンダリングのリンクは次のとおりです。

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

攻撃者は563 WETHをこのアドレスに転送し、その後0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68に転送しましたが、これまでのところそれ以上のアクションはありません。

今回の攻撃者のマネーロンダリングの手口は比較的専門的であり、その手口は多様性の傾向を示しています。したがって、私たちWeb3参加者は、セキュリティの観点からマネーロンダリング防止機能を改善し続け、KYT、AML、およびその他の関連するブロックチェーントランザクションセキュリティ製品を通じてDefiプロジェクトのセキュリティを向上させる必要があります。

セキュリティアドバイス

1、契約の監査とテストを最新の状態に保ちます。スマートコントラクトを展開する前に、財務計算を含むすべての部分に特別な注意を払いながら、包括的な監査を実施します。まず、自動テストを使用し、脆弱性ライブラリのリアルタイム更新を利用して、効率的なコントラクトセキュリティスキャンを実施し(業界では、ZAN AI SCANを含む成熟したセキュリティ監査ツールも徐々にオープンソース化されています)、手動監査を組み合わせて、業界の深いノウハウを必要とする問題のトラブルシューティングを行います。

2、精度の低下は真剣に受け止める必要があります。精度の低下によって引き起こされるセキュリティの問題は際限がなく、特にDefiプロジェクトでは、精度の低下が深刻な経済的損失につながることがよくあります。プロジェクト関係者とセキュリティ監査人は、プロジェクトの精度が低下しているコードを慎重にレビューし、この脆弱性を可能な限り回避するためのテストを実施することをお勧めします。

  1. 攻撃者による操作を回避し、それによって取引所レートを操作するために、CompoundのcTokenと同様の市場の作成と最初の住宅ローンキャスティング操作を特権ユーザーが実行することをお勧めします。

  2. コントラクトに「this.balance」や「token.balanceOf()」の値に依存するキー変数がある場合、ネイティブ通貨やトークンをコントラクトに直接転送できるかどうかなど、キー変数の変更条件を慎重に検討する必要があります。メソッドを使用して変数の値を変更するか、特定の関数を呼び出すことによってのみ変数の値を変更することができます。

免責事項:

  1. この記事は [ZAN] からの転載です。すべての著作権は原著作者[ZAN]に帰属します。この転載に異議がある場合は、Gate Learnチームまでご連絡いただければ、迅速に対応いたします。
  2. 免責事項:この記事で表明された見解や意見は、著者のものであり、投資アドバイスを構成するものではありません。
  3. 記事の他言語への翻訳は、Gate Learnチームによって行われます。特に明記されていない限り、翻訳された記事のコピー、配布、盗用は禁止されています。

Sonne Finance攻撃の分析

中級Jun 11, 2024
この攻撃の本質は、市場(soToken)の作成にあり、攻撃者は少量の基礎となるトークンで最初の担保ミンティング操作を実行し、soTokenの「totalSupply」値が非常に小さくなります。
Sonne Finance攻撃の分析

2024 年 5 月 15 日、Sonne Finance は Optimism チェーンへの攻撃を受け、最大 2,000 万ドルの損失を被りました。攻撃後、Twitterユーザー@tonyke_botは、Sonne Financeの担保プール(CompoundのcTokenに似たマーケットとも呼ばれる)の残りの650万ドルを約100ドルで保護したとツイートしました。


(https://twitter.com/tonyke_bot/status/1790547461611860182)

攻撃を発見すると、Sonne FinanceチームはすぐにOptimismのすべての市場を一時停止し、Baseの市場は安全であると述べました。

(https://twitter.com/SonneFinance/status/1790535383005966554)

攻撃の概要

Sonne Financeは、OptimismでCompound V2をフォークする分散型レンディングプロトコルであり、個人、機関、プロトコルに金融サービスへのアクセスを提供します。Sonne Financeプロトコルは、ユーザーのトークン資産を集約して貸付流動性プールを形成し、ユーザーに銀行のような貸付ビジネスを提供します。コンパウンドと同様に、プロトコル参加者はトークンをSonne Financeの貸付流動性プールに抵当に入れ、証明書soToken(cTokenと同じ)を取得できます。SoTokenは有利子資産証明書であり、ブロックが進むにつれて一定額の収入を生み出し、SONEトークンのインセンティブも受け取ります。参加者は、soTokenを手にして、Sonneの貸付資産プールから他のトークンを借りることもできます。たとえば、参加者は一定額のUSDCを抵当に入れてsoUSDC証明書を取得し、WETHを貸し出してさらに流通させることができます。Sonne Financeのプロトコルにおける住宅ローンの貸付は、多対多の資産関係にすることができます。住宅ローンの貸付プロセス中に、プロトコルは参加者の住所の健康係数(健康係数)を自動的に計算します。健康係数が1未満の場合、住所の抵当権がサポート 清算され、清算人も特定の清算報酬を受け取ることができます。

ユーザーが預けた基礎となるトークンの数と鋳造されたsoTokensの関係は、主にexchangeRateと呼ばれる変数に関連しています。この変数は、各soTokenの基になるトークンの価値を大まかに示すために使用できます。exchangeRateの計算式は次のとおりです。

上記の式において、totalCashはsoTokenが保有する原資産トークンの数を指し、totalBorrowsは特定の市場で貸し出された原資産トークンの数を指し、totalReservesは総準備金額(借り手が支払った利息を含む)を指し、totalSupplyはsoTokenが鋳造された数を指します。

償還時に、ユーザーは償還する基になるトークンの数 redeemAmount を指定して、破棄する必要がある soToken の数 (redeemTokens) を計算できます。計算方法は大まかに「redeemTokens=redeemAmount/exchangeRat」となります。ここでは精度の低下はないことに注意してください。と対処します。

この攻撃の本質は、市場(soToken)が作成されたときに、攻撃者が最初の住宅ローンキャスティング操作を実行し、基礎となるトークンが少量であるsoTokenを非常に少数鋳造したため、soTokenの「totalSupply」値が小さすぎることです。その後、攻撃者はSolidityコントラクトの精度低下の脆弱性を悪用し、ステーキング+キャスト方式で基礎となるトークンを入金する代わりに、基礎となるトークンをsoTokenコントラクトに直接送信しました(soTokenはミントされないため、「totalSupply」は変更されず、「totalCash」が大きくなります)。このような操作により、コントラクトの「totalCash」変数は大きくなりますが、「totalSupply」は変更されないため、exchangeRateが大きくなります。最終的に、攻撃者が基礎となるトークンを償還すると、破棄する必要があるsoTokenは、住宅ローン中に鋳造されたsoTokenよりも少なくなります。攻撃者は獲得したsoTokenを使用して、基礎となるトークンWETHとUSDCを他のsoToken(soWETH、soUSDCなど)に貸し出し、最終的に利益は2,000万米ドルにもなります。

攻撃に関与するキーアドレス

攻撃準備トランザクション:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

収益性の高い取引を攻撃する:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

攻撃EOA関連のアドレス:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

攻撃者(コントラクト)関連アドレス:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

基礎となるトークン(VELO トークン V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

脆弱性コントラクト(soVELO、CompoundのcTokenに類似):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot Xでのユーザーレスキュートランザクション:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

攻撃プロセス分析

まとめ

Sonne Financeプロジェクトチームは最近、Sonne FinanceにVELO市場を追加する提案を可決し(https://twitter.com/SonneFinance/status/1786871066075206044)、2日後に実行されるマルチシグウォレットを介した5つのトランザクションを手配しました(https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7)、これら5つのトランザクションは、VELO市場(soVELOコントラクト)を作成し、金利モデルの設定、価格オラクルの設定、住宅ローンの要因の設定など、市場のいくつかの重要な構成を設定するために使用されます。VELOマーケットが作成されると、ユーザーはトークンを入金 VELOしてsoVELOトークンミントことができ、そのトークンを使用して他のsoTokenを借りることができます。

攻撃準備

攻撃準備段階は、主に攻撃者が提案の2日間のロックイン期間が終了した後、Sonne Financeプロジェクト提案の情報に基づいてVELO市場(soVELOコントラクト)を作成し、主要な構成を設定し、トークンを抵当に入れてsoVELOコントラクトにトークンをミント VELOすることです。 soVELOトークンを作成し、保有しているVELOトークンをsoVELOコントラクトに直接送信してexchangeRateを増やし、準備しますその後の攻撃から利益を得るため。

具体的な手順は次のとおりです。

  1. 2日間のロックイン期間が終了すると、攻撃者はまず、プロポーザルで配置された最初の4つのトランザクションの操作を1つのトランザクション(トランザクション0x45c0cc)にパッケージ化し、それを使用してVELO市場(soVELOコントラクト)を作成し、キー構成を設定します。VELOマーケットを初期化すると、exchangeRateは「200,000,000,000,000,000,000,000,000,000」に設定されます。

  2. 攻撃者は、soVELOコントラクトの「ミント」機能を呼び出して、トークンを入金 VELOし、soVELOトークンをミントします。攻撃者は「mintAmount」を「400,000,001」(VELOトークンの数)と指定します。関数「exchangeRateStoredInternal」からわかるように、このときsoVELOトークンの「_totalSuppl」は0なので、exchangeRateは手順1で設定した値です。「mintTokens = actualMintAmount / exchangeRate」という式によると、このとき鋳造すべきsoVELOトークンの計算数は2です。ショートでは、このステップで、攻撃者は「400,000,001」の値を持つVELOトークンをsoVELOコントラクトに預け、攻撃者は2の値を持つsoVELOトークンを取得します。

ソベロミント:

  1. 攻撃者は、VELOトークンをsoVELOコントラクトに直接送信することにより、「2,552,964,259,704,265,837,526」の値を持つVELOトークンをsoVELOコントラクトに送信しました。このとき、soVELOコントラクトが保有するVELOトークンの数は増加しましたが、新しいsoVELOトークンがなかったため、通貨が鋳造されるため、totalSupplyは変更されず、このときexchangeRate計算式に従って計算されたexchangeRateが大きくなります。

  2. 攻撃者は、複数回保持されているsoVELOトークンを転送し、最終的に別の攻撃EOA 0xae4aに転送しました。

営利目的の攻撃

攻撃利益フェーズでは、主に攻撃者がプロポーザルの5番目のトランザクションを実行し、フラッシュローンを通じてVELOトークンをsoVELOコントラクトに直接貸し出し、exchangeRateをさらに増加させます。次に、攻撃者は手札に2の値を持つsoVELOトークンを使用して、他のsoToken(soWETH、soUSDCなど)コントラクトからWETHやUSDCなどの基礎となるトークンを借り、これらの部分が攻撃者の利益になります。その後、攻撃者はsoVELOコントラクトの基盤となるトークンを引き換えました。exchangeRateの増加と、償還のために破壊する必要があるsoVELOトークンの計算精度の低下により、攻撃者は最終的に値が1のsoVELOトークンのみを使用しました。以前に預けられたVELOトークンのほとんどが償還されましたが、これは攻撃者が他のsoTokenから借りてWETHやUSDCなどの基礎となるトークンを獲得するために、値が1の余分なsoVELOトークンを使用していると理解できます。攻撃者は同じ手法を使用して攻撃を何度も繰り返し、最終的に莫大な利益を上げました。

具体的な手順は次のとおりです。

  1. 攻撃者は、プロポーザルの 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トークンの合計)。

  4. 攻撃者は新しいコントラクト0xa16388a6210545b27f669d5189648c1722300b8bを作成します。コンストラクタでは、保有している2つのsoVELOトークンを、新しく作成されたコントラクト0xa163(以下、アタッカー 0xa163と呼ぶ)に転送します。

  5. 攻撃者は0xa163保有していたsoVELOトークンを使用して、soWETHから「265,842,857,910,985,546,929」のWETHを借りていました。

  6. 攻撃者0xa163は、soVELOの「redeemUnderlying」関数を呼び出し、償還されたVELOトークンの価値を「35,471,603,929,512,754,530,287,976」(攻撃者が以前に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,0 00,000,000,000,000」であり、この値は、最初に設定されたexchangeRate「200,000,000,000,000,000,000,000,000,000,000」よりもはるかに大きくなります。

新しいexchangeRateに基づいて計算された「redeemTokens」の値は「1.99」です。Solidityの下向きの四捨五入特性により、「 redeemTokens 」の値は最終的に1になります。これは、攻撃者が0xa163値が1のsoVELOトークンを使用して、以前に預けられたほぼすべてのVELOトークンを償還したことを意味します。同時に、攻撃者はsoWETHから借りた「265,842,857,910,985,546,929」という値でWETH 0xa163も獲得しました。

soVELO.redeemUnderlying:

soVELO.exchangeRateStoredInternal:

  1. 攻撃者は0xa163借用したすべてのWETHと償還したVELOトークンを上位レベルの攻撃者に転送し、自滅させました。

  2. 攻撃者は、soWETHの「liquidateBorrow」関数を呼び出して、注文に新しく作成されたコントラクト0xa163から借りた資産の一部を清算し、値1でロックされたsoVELOトークンを取り戻します。現在、攻撃者は値が1のsoVELOトークンのみを保持しています。

  3. 攻撃者は、soVELOの「ミント」機能を呼び出し、値2の十分なsoVELOトークンを収集する目的でsoVELOトークンを再度抵当および鋳造し、上記の手順3〜8を再度実行して、他のトークンから利益を得ます。

  4. 攻撃者はステップ9の操作を数回実行し、フラッシュローンを返済し、利益を上げて市場を去ります。

$100が650万ドルをレバレッジする方法

攻撃後、Xのユーザー@tonyke_botは、トランザクション0x0a284cdで1144 VELOトークンをsoVELOコントラクトにステーキングすることにより、0.00000011 soVELOをミントしました。

この操作が攻撃者のさらなる攻撃を防ぐことができる理由は、このトランザクションがsoVELOのtotalSupplyのサイズとtotalCashが保有するVELOトークンの数を変更し、totalRateの計算に対するtotalSupplyの増加の影響がtotalCashの成長の影響よりも大きいためです。したがって、exchangeRateが小さくなり、攻撃者は攻撃を行うときに精度の低下を利用してsoVELOを獲得することがロングできなくなり、攻撃がロングできなくなります。

お金の追跡

攻撃者は、違法な収益をつかんだ直後に資金を送金しました。資金の大部分は、以下の4つの住所に振り込まれました。攻撃を続けるために住所を変更するものもあれば、マネーロンダリングのためのものもありました。

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

攻撃者はこのアドレスに198 WETHを転送し、アドレスは同じ攻撃方法を使用して、次のトランザクションで不正な利益を取得しました。

攻撃後、アドレスは上記の違法な利益を0x5d0d99e9886581ff8fcb01f35804317f5ed80bbbに転送しました。

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

攻撃者は724277 USDCと2353 VELOをこのアドレスに転送し、USDCをエーテルと交換しました。その後、いくつかの資金はすぐにスターゲイトクロスチェーン ブリッジに送金されました。違法な資金のほとんどは、このアドレスに残っています。

3、0xbd18100a168321701955e348f03d0df4f517c13b

攻撃者は33 WETHをこのアドレスに転送し、ピールチェーンを使用してマネーロンダリングを試みました。マネーロンダリングのリンクは次のとおりです。

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

攻撃者は563 WETHをこのアドレスに転送し、その後0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68に転送しましたが、これまでのところそれ以上のアクションはありません。

今回の攻撃者のマネーロンダリングの手口は比較的専門的であり、その手口は多様性の傾向を示しています。したがって、私たちWeb3参加者は、セキュリティの観点からマネーロンダリング防止機能を改善し続け、KYT、AML、およびその他の関連するブロックチェーントランザクションセキュリティ製品を通じてDefiプロジェクトのセキュリティを向上させる必要があります。

セキュリティアドバイス

1、契約の監査とテストを最新の状態に保ちます。スマートコントラクトを展開する前に、財務計算を含むすべての部分に特別な注意を払いながら、包括的な監査を実施します。まず、自動テストを使用し、脆弱性ライブラリのリアルタイム更新を利用して、効率的なコントラクトセキュリティスキャンを実施し(業界では、ZAN AI SCANを含む成熟したセキュリティ監査ツールも徐々にオープンソース化されています)、手動監査を組み合わせて、業界の深いノウハウを必要とする問題のトラブルシューティングを行います。

2、精度の低下は真剣に受け止める必要があります。精度の低下によって引き起こされるセキュリティの問題は際限がなく、特にDefiプロジェクトでは、精度の低下が深刻な経済的損失につながることがよくあります。プロジェクト関係者とセキュリティ監査人は、プロジェクトの精度が低下しているコードを慎重にレビューし、この脆弱性を可能な限り回避するためのテストを実施することをお勧めします。

  1. 攻撃者による操作を回避し、それによって取引所レートを操作するために、CompoundのcTokenと同様の市場の作成と最初の住宅ローンキャスティング操作を特権ユーザーが実行することをお勧めします。

  2. コントラクトに「this.balance」や「token.balanceOf()」の値に依存するキー変数がある場合、ネイティブ通貨やトークンをコントラクトに直接転送できるかどうかなど、キー変数の変更条件を慎重に検討する必要があります。メソッドを使用して変数の値を変更するか、特定の関数を呼び出すことによってのみ変数の値を変更することができます。

免責事項:

  1. この記事は [ZAN] からの転載です。すべての著作権は原著作者[ZAN]に帰属します。この転載に異議がある場合は、Gate Learnチームまでご連絡いただければ、迅速に対応いたします。
  2. 免責事項:この記事で表明された見解や意見は、著者のものであり、投資アドバイスを構成するものではありません。
  3. 記事の他言語への翻訳は、Gate Learnチームによって行われます。特に明記されていない限り、翻訳された記事のコピー、配布、盗用は禁止されています。
今すぐ始める
登録して、
$100
のボーナスを獲得しよう!