Rumah  >  Artikel  >  Bagaimanakah $100 boleh memanfaatkan $6.5 juta? Analisis serangan Sonne Finance

Bagaimanakah $100 boleh memanfaatkan $6.5 juta? Analisis serangan Sonne Finance

WBOY
WBOYasal
2024-06-08 16:17:02608semak imbas

Analisis serangan Sonne Finance: Bagaimanakah $100 boleh memanfaatkan $6.5 juta? Intipati serangan ini ialah apabila pasaran (soToken) dicipta, penyerang melakukan operasi pemutus gadai janji pertama dan menghasilkan sangat sedikit soToken dengan sejumlah kecil token asas, menyebabkan nilai "totalSupply" soToken menjadi terlalu kecil. Penyerang kemudian mengeksploitasi kelemahan kehilangan ketepatan kontrak Solidity, dan kemudian menghantar token asas terus kepada kontrak soToken (soToken tidak akan ditempa, yang bermaksud "totalSupply" kekal tidak berubah dan "totalCash" menjadi lebih besar) dan bukannya kaedah staking + casting untuk mendepositkan token asas. Operasi sedemikian menjadikan pembolehubah "totalCash" dalam kontrak menjadi lebih besar, tetapi "totalSupply" kekal tidak berubah, menyebabkan ExchangeRate menjadi lebih besar. Pada akhirnya, apabila penyerang menebus token asas, soToken yang perlu dimusnahkan adalah kurang daripada soToken yang dicetak semasa gadai janji Penyerang menggunakan soToken yang diperoleh untuk meminjamkan token pendasar WETH dan USDC kepada soToken lain (seperti soWETH. , soUSDC), dan akhirnya memperoleh Keuntungan setinggi AS$20 juta.

0如何撬动0万?Sonne Finance攻击分析

Pada 15 Mei 2024, Sonne Finance telah diserang pada rangkaian Optimisme, menyebabkan kerugian sehingga $20 juta. Selepas serangan, pengguna @tonyke_bot dihidupkan . . Protokol Sonne Finance mengagregatkan aset token pengguna untuk membentuk kumpulan kecairan pinjaman, menyediakan pengguna dengan perniagaan pinjaman seperti bank. Seperti Compound, peserta protokol boleh menggadaikan token mereka ke dalam kumpulan kecairan pinjaman Sonne Finance dan mendapatkan sijil soToken (sama seperti cToken). SoToken ialah sijil aset berfaedah, yang akan menjana sejumlah pendapatan semasa blok itu berjalan, dan juga akan menerima insentif token SONE. Peserta juga boleh meminjam token lain daripada kumpulan aset pinjaman Sonne dengan soToken di tangan mereka Sebagai contoh, peserta boleh menggadaikan sejumlah USDC untuk mendapatkan sijil soUSDC, dan kemudian meminjamkan WETH untuk edaran selanjutnya. Pinjaman gadai janji dalam protokol Sonne Finance boleh menjadi hubungan aset banyak-ke-banyak Semasa proses pinjaman gadai janji, protokol akan mengira secara automatik faktor kesihatan (Faktor Kesihatan) alamat peserta Apabila faktor kesihatan lebih rendah daripada 1. gadai janji alamat Produk akan menyokong pembubaran, dan pelikuidasi juga boleh menerima ganjaran pembubaran tertentu.

Hubungan antara token asas yang didepositkan oleh pengguna dan soToken yang dicetak terutamanya berkaitan dengan pembolehubah yang dipanggil Kadar pertukaran Pembolehubah ini secara kasar boleh digunakan untuk menunjukkan nilai token asas setiap soToken. Formula pengiraan Kadar pertukaran adalah seperti berikut:

0如何撬动0万?Sonne Finance攻击分析

Dalam formula di atas, totalCash merujuk kepada bilangan token pendasar yang dipegang oleh soToken, totalBorrows merujuk kepada bilangan token pendasar yang dipinjamkan dalam pasaran tertentu, dan totalReserves merujuk kepada jumlah bilangan rizab (yang mengandungi faedah yang dibayar oleh peminjam), totalSupply merujuk kepada bilangan soToken yang dicetak.

Apabila menebus, pengguna boleh menentukan bilangan token asas yang ingin ditebus, redeemAmount, untuk mengira bilangan soToken yang perlu dimusnahkan, redeemTokens Kaedah pengiraan secara kasarnya adalah "redeemTokens = redeemAmount / exchangeRat". tiada ketepatan di sini.

Intipati serangan ini ialah apabila pasaran (soToken) dicipta, penyerang melakukan operasi pemutus gadai janji pertama dan menghasilkan sangat sedikit soToken dengan sejumlah kecil token asas, menyebabkan nilai "totalSupply" soToken menjadi terlalu kecil . Penyerang kemudian mengeksploitasi kelemahan kehilangan ketepatan kontrak Solidity, dan kemudian menghantar token asas terus kepada kontrak soToken (soToken tidak akan ditempa, yang bermaksud "totalSupply" kekal tidak berubah dan "totalCash" menjadi lebih besar) dan bukannya kaedah staking + casting untuk mendepositkan token asas. Operasi sedemikian menjadikan pembolehubah "totalCash" dalam kontrak menjadi lebih besar, tetapi "totalSupply" kekal tidak berubah, menyebabkan ExchangeRate menjadi lebih besar. Pada akhirnya, apabila penyerang menebus token asas, soToken yang perlu dimusnahkan adalah kurang daripada soToken yang dicetak semasa gadai janji Penyerang menggunakan soToken yang diperoleh untuk meminjamkan token pendasar WETH dan USDC kepada soToken lain (seperti soWETH. , soUSDC), dan akhirnya memperoleh Keuntungan setinggi AS$20 juta.

Alamat utama yang terlibat dalam serangan

Transaksi penyediaan serangan:

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

Urus niaga keuntungan serang:

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

attack EOA related address:

0x5d0d99e9886581ff8fcb01f35804317f5ed80 bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Attacker (contract) related address:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa 2625825917e9b1f8346a465de1bbc150c5b9

underlying token (VELO Token V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Vulnerability Contract (soVELO, Serupa dengan Compound's cToken):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

X pada transaksi penyelamatan pengguna @tonyke_bot:

https://optimistic.etherf9escan. 86 c200c0470c6456603c967f82ab559a5931fd181c2

Analisis proses serangan

Ringkasan awal

Projek Sonne Finance Fang baru-baru ini meluluskan cadangan untuk menambah pasaran VELO kepada Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) dan mengatur lima transaksi melalui dompet berbilang tandatangan untuk dilaksanakan dua hari kemudian (https:/ /optimistic .etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), lima urus niaga ini digunakan untuk mencipta pasaran VELO (kontrak soVELO) dan menetapkan kadar pasaran beberapa konfigurasi utama seperti penetapan faktor harga, penetapan faktor harga, penetapan harga tidak. , dan lain-lain. Selepas pasaran VELO dicipta, pengguna boleh mendepositkan token VELO untuk mencetak token soVELO, yang seterusnya boleh digunakan untuk meminjam soToken lain.

Persediaan serangan

Peringkat penyediaan serangan terutamanya melibatkan penyerang mewujudkan pasaran VELO (kontrak soVELO) berdasarkan maklumat dalam cadangan projek Sonne Finance selepas tempoh kunci masuk dua hari cadangan, menyediakan konfigurasi utama, dan mempertaruhkan token VELO Mata wang memasuki kontrak soVELO untuk mencetak token soVELO Pada masa yang sama, ia juga menghantar token VELO yang dipegangnya terus ke kontrak soVELO untuk meningkatkan Kadar pertukaran dan bersedia untuk serangan seterusnya untuk mendapat keuntungan.

Langkah khusus adalah seperti berikut:

  • Selepas tempoh kunci masuk dua hari, penyerang mula-mula membungkus operasi empat transaksi pertama yang diatur dalam cadangan ke dalam satu transaksi (transaksi 0x45c0cc), yang digunakan untuk cipta pasaran VELO (kontrak soVELO) dan tetapkan konfigurasi utama. Apabila pasaran VELO dimulakan, Kadar pertukaran ditetapkan kepada "200,000,000,000,000,000,000,000,000".

  • Penyerang memanggil fungsi "mint" kontrak soVELO untuk mendepositkan token VELO dan token soVELO mint. Penyerang menentukan "mintAmount" sebagai "400,000,001" (bilangan token VELO). Seperti yang boleh dilihat daripada fungsi "exchangeRateStoredInternal", memandangkan "_totalSuppl" token soVELO ialah 0 pada masa ini, ExchangeRate ialah nilai yang ditetapkan dalam langkah 1. Menurut formula " mintTokens = actualMintAmount / exchangeRate ", bilangan token soVELO yang dikira yang perlu dicetak pada masa ini ialah 2. Ringkasnya, dalam langkah ini, penyerang mendepositkan token VELO dengan nilai "400,000,001" ke dalam kontrak soVELO, dan penyerang memperoleh token soVELO dengan nilai 2. MSoveLo.Mint:

    0如何撬动0万?Sonne Finance攻击分析

    Penyerang menghantar token Velo terus ke kontrak SOVELO untuk menghantar token Velo dengan nilai "2,552,964,259,704,265,837,526, tetapi kontrak AtVELO kali ini meningkat kepada no token dicetak, jumlah Bekalan kekal tidak berubah, yang bermaksud bahawa Kadar pertukaran yang dikira mengikut formula pengiraan Kadar pertukaran akan menjadi lebih besar pada masa ini.
  • Penyerang memindahkan pegangan token soVELO beberapa kali, akhirnya kepada serangan lain EOA 0xae4a.

Untung serangan

Fasa keuntungan serangan terutamanya melibatkan penyerang yang melaksanakan transaksi kelima cadangan dan meminjamkan token VELO terus kepada kontrak soVELO melalui pinjaman kilat untuk meningkatkan lagi Kadar pertukaran. Kemudian penyerang menggunakan token soVELO dengan nilai 2 di tangannya untuk meminjam token asas seperti WETH dan USDC daripada kontrak soToken lain (seperti soWETH, soUSDC, dll.), dan bahagian ini menjadi keuntungan penyerang. Kemudian penyerang pergi untuk menebus token asasnya dalam kontrak soVELO Disebabkan oleh peningkatan dalam Kadar pertukaran dan kehilangan ketepatan dalam mengira token soVELO yang perlu dimusnahkan untuk penebusan, penyerang akhirnya hanya menggunakan token soVELO dengan nilai sebanyak. 1. Hampir semua token VELO yang didepositkan sebelum ini telah ditebus, yang boleh difahami sebagai penyerang menggunakan token soVELO tambahan dengan nilai 1 untuk memperoleh token asas seperti WETH dan USDC dengan meminjam daripada soToken lain. Penyerang menggunakan teknik yang sama untuk mengulangi serangan berkali-kali dan akhirnya mendapat keuntungan yang besar.

Langkah khusus adalah seperti berikut:

  • Penyerang melaksanakan transaksi kelima dalam cadangan dan menetapkan faktor pinjaman yang dinyatakan dalam cadangan.

  • Penyerang kilat meminjamkan token VELO dengan nilai "35,469,150,965,253,049,864,450,449" daripada kumpulan VolatileV2 AMM - USDC/VELO, yang mencetuskan fungsi cangkuk penyerang. Dalam fungsi cangkuk, penyerang terus melakukan operasi serangan.

  • Penyerang menghantar token VELO yang dipegangnya kepada kontrak soVELO untuk meningkatkan lagi Kadar pertukaran. Pada masa ini, terdapat sejumlah token VELO dengan nilai "35,471,703,929,512,754,530,287,976" dalam kontrak soVELO (jumlah token VELO yang dipindahkan oleh penyerang sebanyak tiga kali).

  • Penyerang mencipta kontrak baharu 0xa16388a6210545b27f669d5189648c1722300b8b Dalam pembina, dia memindahkan 2 token soVELO yang dipegangnya kepada kontrak 10xa163 yang baru dirujuk sebagai 10inxa163 yang baru dibuat.

  • Penyerang 0xa163 menggunakan token soVELO yang dipegangnya untuk meminjam WETH dengan nilai "265,842,857,910,985,546,929" daripada soWETH.

  • Penyerang 0xa163 memanggil fungsi "redeemUnderlying" soVELO, menyatakan nilai token VELO yang ditebus sebagai "35,471,603,929,512,754,530,287,976 penyerang yang sebelumnya telah dipindahkan ke dalam hampir semuaOG kontrak soVELO). bilangan token soVELO yang perlu dimusnahkan untuk penebusan perlu dikira mengikut formula "redeemTokens = redeemAmountIn / ExchangeRate".

    Ia boleh dilihat daripada fungsi "exchangeRateStoredInternal" memandangkan _totalSupply ialah 2 dan bukan 0 pada masa ini, nilai ExchangeRate perlu dikira melalui formula "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply" , Kadar pertukaran semasa ialah "17,735,851,964,756,377,265,143,988,000,000,000,000,000,000", nilai ini jauh lebih besar daripada kadar pertukaran awal yang ditetapkan "200,000,000,000,000".

    Nilai "redeemTokens" yang dikira berdasarkan Kadar pertukaran baharu ialah "1.99". Ini bermakna penyerang 0xa163 menggunakan token soVELO dengan nilai 1 untuk menebus hampir semua token VELO yang disimpan sebelum ini. Pada masa yang sama, penyerang 0xa163 juga memperoleh WETH dengan nilai "265,842,857,910,985,546,929" yang dipinjam daripada soWETH.

    sovelo.redeemunderlying:

    0如何撬动0万?Sonne Finance攻击分析

    sovelo.exchangeratestoredinternal:

    0如何撬动0万?Sonne Finance攻击分析

  • The penyerang 0xa163 memindahkan semua token Velo yang dipinjam dan ditebus ke penyerang peringkat atas, dan kemudian memusnahkan diri.

  • Penyerang memanggil fungsi "liquidateBorrow" soWETH untuk mencairkan beberapa aset yang dipinjam daripada kontrak 0xa163 yang baru dibuat untuk mendapatkan kembali token soVELO yang dikunci dengan nilai 1. Pada masa ini penyerang hanya memegang token soVELO dengan nilai 1.

  • Penyerang memanggil fungsi "pudina" soVELO dan gadai janji serta memint token soVELO sekali lagi Tujuannya adalah untuk mengumpul token soVELO yang mencukupi dengan nilai 2, dan kemudian melakukan langkah 3-8 di atas sekali lagi untuk mendapat keuntungan daripada token yang tidak bermasalah. .

  • Penyerang melakukan langkah 9 beberapa kali, membayar balik pinjaman kilat, dan pergi dengan keuntungan.

Bagaimana $100 memanfaatkan $6.5 juta

Selepas serangan, pengguna @tonyke_bot Sebab mengapa operasi ini boleh menghalang penyerang daripada serangan selanjutnya adalah kerana transaksi ini mengubah saiz totalSupply dalam soVELO dan bilangan token VELO totalCash yang dipegang, dan kesan pertumbuhan totalSupply pada pengiraan Kadar pertukaran adalah lebih besar daripada kesan. daripada pertumbuhan totalCash Oleh itu, Kadar pertukaran menjadi lebih kecil, menyebabkan penyerang tidak lagi boleh menggunakan kehilangan ketepatan untuk mendapatkan soVELO apabila menyerang, menjadikan serangan tidak lagi boleh dilakukan.

0如何撬动0万?Sonne Finance攻击分析

Penjejakan Dana

Penyerang memindahkan dana sejurus selepas memperoleh hasil haram Kebanyakan dana telah dipindahkan ke 4 alamat berikut, beberapa untuk menukar alamat untuk meneruskan serangan, dan beberapa untuk mencuci wang:

  • .

    0x4ab93fc50b82d4dc457db858888dfdae28d2 9b98d

kepada 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

0如何撬动0万?Sonne Finance攻击分析

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

  • Penyerang memindahkan 724277 USDC, 2353 dan VELO ke alamat USDC ini. Sebahagian daripada dana telah segera dipindahkan ke jambatan rantaian Stargate, dan kebanyakan dana haram kekal di alamat ini:

0xbd18100a168321701955e348f03d0df4f dipindahkan 33 WETH ke alamat dan pakai Try peel rantaian untuk membasuh wang. 21 bde5e53f537ff208970152b75a003093c2b4->0x9f09ec563222fe52712dc413d0b7b66cb5c7c795. . 1e2aCf9C68, tiada tindakan lanjut buat masa ini. 0如何撬动0万?Sonne Finance攻击分析

Kaedah pengubahan wang haram penyerang kali ini agak profesional, dan kaedahnya menunjukkan trend kepelbagaian. Oleh itu, bagi kami peserta Web3, kami mesti terus meningkatkan keupayaan anti-pengubahan wang haram kami dari segi keselamatan, dan meningkatkan keselamatan projek Defi melalui KYT, AML dan produk keselamatan transaksi blockchain lain yang berkaitan.
  • Nasihat keselamatan

Kehilangan ketepatan perlu diambil serius. Isu keselamatan yang disebabkan oleh kehilangan ketepatan muncul tanpa henti, terutamanya dalam projek Defi, di mana kehilangan ketepatan sering membawa kepada kerugian kewangan yang serius. Adalah disyorkan bahawa pihak projek dan juruaudit keselamatan menyemak dengan teliti kod dengan kehilangan ketepatan dalam projek dan menjalankan ujian untuk mengelakkan kerentanan ini sebanyak mungkin.

Adalah disyorkan bahawa penciptaan pasaran yang serupa dengan cToken in Compound dan operasi penempaan gadai janji pertama dilakukan oleh pengguna istimewa untuk mengelak daripada dikendalikan oleh penyerang dan dengan itu memanipulasi kadar pertukaran.
  • Apabila terdapat pembolehubah utama dalam kontrak yang bergantung pada nilai " this.balance " atau " token.balanceOf() ", anda perlu mempertimbangkan dengan teliti syarat untuk perubahan pembolehubah utama, seperti sama ada ia dibenarkan untuk memindahkan terus mata wang asli kepada kontrak atau kaedah Token untuk menukar nilai pembolehubah, atau hanya boleh menukar nilai pembolehubah dengan memanggil fungsi tertentu.

Atas ialah kandungan terperinci Bagaimanakah $100 boleh memanfaatkan $6.5 juta? Analisis serangan Sonne Finance. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn