Pada 15 Mei 2024, Sonne Finance mengalami serangan terhadap rantai Optimisme, yang mengakibatkan kerugian hingga $20 juta. Setelah serangan itu, pengguna Twitter @tonyke_bot tweeted bahwa mereka melindungi sisa $ 6,5 juta di kolam jaminan Sonne Finance (juga dikenal sebagai pasar, mirip dengan cToken di Compound) dengan sekitar $ 100.
(https://twitter.com/tonyke_bot/status/1790547461611860182)
Setelah menemukan serangan itu, tim Sonne Finance dengan cepat menghentikan semua pasar di Optimism dan menyatakan bahwa pasar di Base aman.
(https://twitter.com/SonneFinance/status/1790535383005966554)
Sonne Finance adalah protokol pinjaman terdesentralisasi yang bercabang Compound V2 pada Optimisme, menyediakan individu, institusi, dan protokol dengan akses ke layanan keuangan. Sonne Finance protokol mengumpulkan aset token pengguna untuk membentuk pool likuiditas pinjaman, menyediakan pengguna dengan bisnis pinjaman seperti bank. Seperti Compound, protokol peserta dapat menggadaikan token mereka ke pool likuiditas pinjaman Sonne Finance dan mendapatkan sertifikat soToken (sama seperti cToken). SoToken adalah sertifikat aset berbunga, yang akan menghasilkan sejumlah pendapatan saat blok berlangsung, dan juga akan menerima insentif token ONE. Peserta juga dapat meminjam token lain dari kumpulan aset pinjaman Sonne dengan soToken di tangan mereka. Misalnya, peserta dapat menggadaikan sejumlah USDC untuk mendapatkan sertifikat soUSDC, dan kemudian meminjamkan WETH untuk sirkulasi lebih lanjut. Pinjaman hipotek di protokol Sonne Finance dapat menjadi hubungan aset banyak-ke-banyak. Selama proses peminjaman hipotek, protokol akan secara otomatis menghitung faktor kesehatan (Health Factor) dari alamat peserta. Ketika faktor kesehatan lebih rendah dari 1, hipotek produk alamat akan dukungan likuidasi, dan likuidator juga dapat menerima imbalan likuidasi tertentu.
Hubungan antara jumlah token dasar yang disimpan oleh pengguna dan soTokens yang dicetak terutama terkait dengan variabel yang disebut exchangeRate. Variabel ini secara kasar dapat digunakan untuk menunjukkan berapa banyak token yang mendasari setiap soToken bernilai. Rumus perhitungan untuk nilai tukar adalah sebagai berikut:
Dalam rumus di atas, totalCash mengacu pada jumlah token dasar yang dipegang oleh soToken, totalBorrows mengacu pada jumlah token dasar yang dipinjamkan di pasar tertentu, totalReserves mengacu pada jumlah cadangan total (termasuk bunga yang dibayarkan oleh peminjam), totalSupply Mengacu pada jumlah soToken yang dicetak.
Saat menukarkan, pengguna dapat menentukan jumlah token dasar yang ingin mereka tukarkan, redeemAmount, untuk menghitung jumlah soTokens yang perlu dihancurkan, redeemTokens. Metode perhitungannya kira-kira "redeemTokens = redeemAmount / exchangeRat". Perhatikan bahwa tidak ada kehilangan akurasi di sini. berurusan dengan.
Inti dari serangan ini adalah bahwa ketika pasar (soToken) dibuat, penyerang melakukan operasi pengecoran hipotek pertama dan mencetak sangat sedikit soTokens dengan sejumlah kecil token yang mendasarinya, sehingga nilai "totalSupply" soToken menjadi terlalu kecil. Penyerang kemudian mengeksploitasi kerentanan kerugian presisi kontrak Solidity, dan kemudian mengirim token yang mendasarinya langsung ke kontrak soToken (soToken tidak akan dicetak, yang berarti "totalSupply" tetap tidak berubah dan "totalCash" menjadi lebih besar) alih-alih mempertaruhkan + metode casting untuk setor token yang mendasarinya. Operasi semacam itu membuat variabel "totalCash" dalam kontrak menjadi lebih besar, tetapi "totalSupply" tetap tidak berubah, menyebabkan nilai tukar menjadi lebih besar. Pada akhirnya, ketika penyerang menebus token yang mendasarinya, soToken yang perlu dihancurkan kurang dari soToken yang dicetak selama hipotek. Penyerang menggunakan soToken yang diperoleh untuk meminjamkan token yang mendasarinya WETH dan USDC ke soToken lain (seperti soWETH, soUSDC), dan akhirnya memperoleh Keuntungan setinggi US $ 20 juta.
Persiapan Serangan:
Serang Transaksi yang Menguntungkan:
Serang alamat terkait EOA:
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
Alamat terkait penyerang (kontrak):
0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8
0x02fa2625825917e9b1f8346a465de1bbc150c5b9
token yang mendasarinya (VELO Token V2):
0x9560e827af36c94d2ac33a39bce1fe78631088db
Kontrak kerentanan (soVELO, mirip dengan cToken Compound):
0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
@tonyke_bot Transaksi User Rescue di X:
Tim proyek Sonne Finance baru-baru ini meloloskan proposal untuk menambahkan pasar VELO ke Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044), dan mengatur lima transaksi melalui dompet multi-tanda tangan untuk dieksekusi dua hari kemudian ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), kelima transaksi ini digunakan untuk membuat pasar VELO (kontrak soVELO) dan menetapkan beberapa konfigurasi utama pasar, seperti menetapkan model suku bunga, menetapkan oracle harga, dan menetapkan faktor hipotek, dll. Setelah pasar VELO dibuat, pengguna dapat setor VELO token untuk cetak token soVELO, yang pada gilirannya dapat digunakan untuk meminjam soToken lainnya.
Tahap persiapan serangan terutama bagi penyerang untuk membuat pasar VELO (kontrak soVELO) berdasarkan informasi dalam proposal proyek Sonne Finance setelah periode penguncian dua hari proposal telah berakhir, mengatur konfigurasi kunci, dan cetak VELO token ke dalam kontrak soVELO dengan menggadaikan mereka. token soVELO, dan juga mengirimkan token VELO yang dipegangnya langsung ke kontrak soVELO untuk meningkatkan nilai tukar dan mempersiapkan untuk mendapatkan keuntungan dari serangan berikutnya.
Langkah-langkah spesifiknya adalah sebagai berikut:
Setelah periode penguncian dua hari berakhir, penyerang pertama-tama mengemas operasi dari empat transaksi pertama yang diatur dalam proposal menjadi satu transaksi (0x45c0cc transaksi), yang digunakan untuk membuat pasar VELO (kontrak soVELO) dan mengatur konfigurasi kunci. Ketika pasar VELO diinisialisasi, nilai tukar diatur ke "200.000.000.000.000.000.000.000.000.000".
Penyerang menyebut fungsi "cetak" dari kontrak soVELO untuk setor VELO token dan cetak token soVELO. Penyerang menentukan "mintAmount" sebagai "400.000.001" (jumlah token VELO). Seperti dapat dilihat dari fungsi "exchangeRateStoredInternal", karena "_totalSuppl" token soVELO adalah 0 saat ini, exchangeRate adalah nilai yang ditetapkan pada langkah 1. Menurut rumus " mintTokens = actualMintAmount / exchangeRate ", jumlah token soVELO yang dihitung yang harus dicetak saat ini adalah 2. Secara short, pada langkah ini, penyerang menyetor token VELO dengan nilai "400.000.001" ke dalam kontrak soVELO, dan penyerang memperoleh token soVELO dengan nilai 2.
soVELO.cetak:
Penyerang mengirim token VELO dengan nilai "2.552.964.259.704.265.837.526" ke kontrak soVELO dengan langsung mengirimkan token VELO ke kontrak soVELO. Pada saat ini, jumlah token VELO yang dipegang oleh kontrak soVELO meningkat, tetapi karena tidak ada token soVELO baru koin dicetak, sehingga totalSupply tetap tidak berubah, yang berarti bahwa nilai tukar yang dihitung sesuai dengan rumus perhitungan nilai tukar akan menjadi lebih besar saat ini.
Penyerang mentransfer token soVELO yang dipegang beberapa kali, dan akhirnya mentransfernya ke 0xae4a EOA serangan lain.
Fase keuntungan serangan terutama melibatkan penyerang yang mengeksekusi transaksi kelima dari proposal dan meminjamkan token VELO langsung ke kontrak soVELO melalui pinjaman flash untuk lebih meningkatkan nilai tukar. Kemudian penyerang menggunakan token soVELO dengan nilai 2 di tangannya untuk meminjam token yang mendasarinya seperti WETH dan USDC dari kontrak soToken lainnya (seperti soWETH, soUSDC, dll.), Dan bagian-bagian ini menjadi keuntungan penyerang. Kemudian penyerang pergi untuk menebus token yang mendasarinya dalam kontrak soVELO. Karena peningkatan nilai tukar dan hilangnya akurasi dalam menghitung token soVELO yang perlu dihancurkan untuk penebusan, penyerang akhirnya hanya menggunakan token soVELO dengan nilai 1. Hampir semua token VELO yang disimpan sebelumnya ditebus, yang dapat dipahami sebagai penyerang menggunakan token soVELO tambahan dengan nilai 1 untuk mendapatkan token yang mendasarinya seperti WETH dan USDC dengan meminjam dari soToken lainnya. Penyerang menggunakan teknik yang sama untuk mengulangi serangan berkali-kali dan akhirnya menghasilkan keuntungan besar.
Langkah-langkah spesifiknya adalah sebagai berikut:
Penyerang mengeksekusi transaksi kelima dalam proposal dan menetapkan faktor pinjaman yang ditentukan dalam proposal.
Pinjaman flash penyerang VELO token dengan nilai "35.469.150.965.253.049.864.450.449" dari kumpulan AMM - USDC/VELO VolatileV2, yang memicu fungsi hook penyerang. Dalam fungsi hook, penyerang terus melakukan operasi serangan.
Penyerang mengirimkan token VELO yang dipegangnya ke kontrak soVELO untuk lebih meningkatkan nilai tukar. Saat ini, ada total VELO token dengan nilai "35.471.703.929.512.754.530.287.976" dalam kontrak soVELO (jumlah VELO token yang ditransfer tiga kali oleh penyerang).
Penyerang membuat 0xa16388a6210545b27f669d5189648c1722300b8b kontrak baru. Di konstruktor, dia mentransfer 2 token soVELO yang dia pegang ke 0xa163 kontrak yang baru dibuat (selanjutnya disebut sebagai penyerang 0xa163).
Penyerang 0xa163 menggunakan token soVELO yang dipegangnya untuk meminjam WETH dengan nilai "265.842.857.910.985.546.929" dari soWETH.
Penyerang 0xa163 menyebut fungsi "redeemUnderlying" soVELO, menentukan nilai token VELO yang ditebus sebagai "35.471.603.929.512.754.530.287.976" (hampir jumlah token VELO yang sebelumnya telah ditransfer atau digadaikan penyerang ke dalam kontrak soVELO). Pada saat ini, perlu untuk Rumus "redeemTokens = redeemAmountIn / exchangeRate" digunakan untuk menghitung jumlah token soVELO yang perlu dihancurkan untuk penebusan.
Seperti dapat dilihat dari fungsi "exchangeRateStoredInternal", karena _totalSupply adalah 2, bukan 0, nilai nilai tukar perlu dihitung. Menurut rumus "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply", nilai tukar saat ini adalah "17.735.851.964.756.377.265.143.988.000,0 00.000.000.000.000.000.000 ", nilai ini jauh lebih besar dari nilai tukar awal yang ditetapkan "200.000.000.000.000.000.000.000.000.000".
Nilai " redeemTokens " dihitung berdasarkan nilai tukar baru adalah " 1,99 ". Karena karakteristik pembulatan ke bawah dari Solidity, nilai " redeemTokens " akhirnya menjadi 1. Ini berarti bahwa penyerang 0xa163 menggunakan token soVELO dengan nilai 1 untuk menebus hampir semua token VELO yang disimpan sebelumnya. Pada saat yang sama, penyerang juga 0xa163 mendapatkan WETH dengan nilai "265.842.857.910.985.546.929" yang dipinjam dari soWETH.
soVELO.redeemUnderlying:
soVELO.exchangeRateStoredInternal:
Penyerang 0xa163 mentransfer semua WETH yang dipinjam dan menebus token VELO ke penyerang tingkat atas, dan kemudian dihancurkan sendiri.
Penyerang menyebut fungsi "liquidateBorrow" dari soWETH untuk melikuidasi beberapa aset yang dipinjam dari 0xa163 kontrak yang baru dibuat pada tahun pesanan untuk mendapatkan kembali token soVELO yang terkunci dengan nilai 1. Saat ini penyerang hanya memegang token soVELO dengan nilai 1.
Penyerang menyebut fungsi "cetak" dari soVELO dan sekali lagi menggadaikan dan mencetak token soVELO dengan tujuan mengumpulkan token soVELO yang cukup dengan nilai 2, dan kemudian melakukan langkah 3-8 di atas lagi untuk mendapatkan keuntungan dari token undeylying lainnya.
Penyerang melakukan operasi pada langkah 9 beberapa kali, membayar kembali pinjaman flash, dan meninggalkan pasar dengan keuntungan.
Setelah serangan, pengguna @tonyke_bot pada X mencetak 0,00000011 soVELO dengan mempertaruhkan 1144 token VELO ke dalam kontrak soVELO dalam 0x0a284cd transaksi. Alasan mengapa operasi ini dapat mencegah penyerang dari serangan lebih lanjut adalah karena transaksi ini mengubah ukuran totalSupply di soVELO dan jumlah token VELO totalCash yang dimiliki, dan dampak pertumbuhan totalSupply pada perhitungan nilai tukar lebih besar daripada dampak pertumbuhan totalCash. Oleh karena itu, nilai tukar menjadi lebih kecil, menyebabkan penyerang tidak lebih lama dapat menggunakan hilangnya akurasi untuk mendapatkan soVELO saat melakukan serangan, membuat serangan tidak lebih lama mungkin.
Penyerang mentransfer dana tak lama setelah mengambil hasil ilegal. Sebagian besar dana ditransfer ke empat alamat berikut. Beberapa mengubah alamat untuk melanjutkan serangan, dan beberapa untuk pencucian uang:
1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d
Penyerang mentransfer 198 WETH ke alamat ini, dan kemudian alamat tersebut menggunakan metode serangan yang sama untuk mendapatkan keuntungan ilegal dalam transaksi berikut:
Setelah serangan itu, alamat tersebut mentransfer keuntungan ilegal yang disebutkan di atas kepada 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.
2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
Penyerang mentransfer 724277 USDC dan 2353 VELO ke alamat ini, dan menukar USDC dengan Ether. Kemudian sejumlah dana segera ditransfer ke Stargate cross-chain bridge. Sebagian besar dana haram tetap berada di alamat ini:
3、0xbd18100a168321701955e348f03d0df4f517c13b
Penyerang mentransfer 33 WETH ke alamat ini dan menggunakan rantai kupas untuk mencoba mencuci uang. Tautan pencucian uang adalah sebagai berikut:
0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。
4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770
Penyerang mentransfer 563 WETH ke alamat ini dan kemudian ke 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68, tanpa tindakan lebih lanjut sejauh ini.
Metode pencucian uang penyerang kali ini relatif profesional, dan metodenya menunjukkan tren keragaman. Oleh karena itu, bagi kami para peserta Web3, kami harus terus meningkatkan kemampuan anti pencucian uang kami dalam hal keamanan, dan meningkatkan keamanan proyek Defi melalui KYT, AML dan produk keamanan transaksi blockchain terkait lainnya.
1、Tetap up to date dengan audit dan pengujian kontrak. Lakukan audit komprehensif sebelum penerapan kontrak pintar, berikan perhatian khusus pada semua bagian yang melibatkan perhitungan keuangan. Pertama, gunakan pengujian otomatis dan manfaatkan pembaruan real-time dari pustaka kerentanan untuk melakukan pemindaian keamanan kontrak yang efisien (industri juga secara bertahap membuka sumber beberapa alat audit keamanan yang matang, termasuk ZAN AI SCAN), sambil menggabungkan audit manual untuk memecahkan masalah yang memerlukan pengetahuan industri yang mendalam.
2、Hilangnya akurasi perlu ditanggapi dengan serius. Masalah keamanan yang disebabkan oleh hilangnya akurasi tidak ada habisnya, terutama dalam proyek Defi, di mana kehilangan akurasi sering menyebabkan kerugian finansial yang serius. Disarankan agar pihak proyek dan auditor keamanan dengan hati-hati meninjau kode dengan kehilangan akurasi dalam proyek dan melakukan tes untuk menghindari kerentanan ini sebanyak mungkin.
Disarankan agar penciptaan pasar yang mirip dengan cToken di Compound dan operasi pengecoran hipotek pertama dilakukan oleh pengguna istimewa untuk menghindari manipulasi oleh penyerang dan dengan demikian memanipulasi tingkat pertukaran.
Ketika ada variabel kunci dalam kontrak yang bergantung pada nilai " this.balance " atau " token.balanceOf() ", Anda perlu mempertimbangkan dengan cermat kondisi untuk perubahan variabel kunci, seperti apakah diizinkan untuk langsung mentransfer mata uang asli atau token ke kontrak. metode untuk mengubah nilai variabel, atau dapatkah nilai variabel hanya diubah dengan memanggil fungsi tertentu.
Pada 15 Mei 2024, Sonne Finance mengalami serangan terhadap rantai Optimisme, yang mengakibatkan kerugian hingga $20 juta. Setelah serangan itu, pengguna Twitter @tonyke_bot tweeted bahwa mereka melindungi sisa $ 6,5 juta di kolam jaminan Sonne Finance (juga dikenal sebagai pasar, mirip dengan cToken di Compound) dengan sekitar $ 100.
(https://twitter.com/tonyke_bot/status/1790547461611860182)
Setelah menemukan serangan itu, tim Sonne Finance dengan cepat menghentikan semua pasar di Optimism dan menyatakan bahwa pasar di Base aman.
(https://twitter.com/SonneFinance/status/1790535383005966554)
Sonne Finance adalah protokol pinjaman terdesentralisasi yang bercabang Compound V2 pada Optimisme, menyediakan individu, institusi, dan protokol dengan akses ke layanan keuangan. Sonne Finance protokol mengumpulkan aset token pengguna untuk membentuk pool likuiditas pinjaman, menyediakan pengguna dengan bisnis pinjaman seperti bank. Seperti Compound, protokol peserta dapat menggadaikan token mereka ke pool likuiditas pinjaman Sonne Finance dan mendapatkan sertifikat soToken (sama seperti cToken). SoToken adalah sertifikat aset berbunga, yang akan menghasilkan sejumlah pendapatan saat blok berlangsung, dan juga akan menerima insentif token ONE. Peserta juga dapat meminjam token lain dari kumpulan aset pinjaman Sonne dengan soToken di tangan mereka. Misalnya, peserta dapat menggadaikan sejumlah USDC untuk mendapatkan sertifikat soUSDC, dan kemudian meminjamkan WETH untuk sirkulasi lebih lanjut. Pinjaman hipotek di protokol Sonne Finance dapat menjadi hubungan aset banyak-ke-banyak. Selama proses peminjaman hipotek, protokol akan secara otomatis menghitung faktor kesehatan (Health Factor) dari alamat peserta. Ketika faktor kesehatan lebih rendah dari 1, hipotek produk alamat akan dukungan likuidasi, dan likuidator juga dapat menerima imbalan likuidasi tertentu.
Hubungan antara jumlah token dasar yang disimpan oleh pengguna dan soTokens yang dicetak terutama terkait dengan variabel yang disebut exchangeRate. Variabel ini secara kasar dapat digunakan untuk menunjukkan berapa banyak token yang mendasari setiap soToken bernilai. Rumus perhitungan untuk nilai tukar adalah sebagai berikut:
Dalam rumus di atas, totalCash mengacu pada jumlah token dasar yang dipegang oleh soToken, totalBorrows mengacu pada jumlah token dasar yang dipinjamkan di pasar tertentu, totalReserves mengacu pada jumlah cadangan total (termasuk bunga yang dibayarkan oleh peminjam), totalSupply Mengacu pada jumlah soToken yang dicetak.
Saat menukarkan, pengguna dapat menentukan jumlah token dasar yang ingin mereka tukarkan, redeemAmount, untuk menghitung jumlah soTokens yang perlu dihancurkan, redeemTokens. Metode perhitungannya kira-kira "redeemTokens = redeemAmount / exchangeRat". Perhatikan bahwa tidak ada kehilangan akurasi di sini. berurusan dengan.
Inti dari serangan ini adalah bahwa ketika pasar (soToken) dibuat, penyerang melakukan operasi pengecoran hipotek pertama dan mencetak sangat sedikit soTokens dengan sejumlah kecil token yang mendasarinya, sehingga nilai "totalSupply" soToken menjadi terlalu kecil. Penyerang kemudian mengeksploitasi kerentanan kerugian presisi kontrak Solidity, dan kemudian mengirim token yang mendasarinya langsung ke kontrak soToken (soToken tidak akan dicetak, yang berarti "totalSupply" tetap tidak berubah dan "totalCash" menjadi lebih besar) alih-alih mempertaruhkan + metode casting untuk setor token yang mendasarinya. Operasi semacam itu membuat variabel "totalCash" dalam kontrak menjadi lebih besar, tetapi "totalSupply" tetap tidak berubah, menyebabkan nilai tukar menjadi lebih besar. Pada akhirnya, ketika penyerang menebus token yang mendasarinya, soToken yang perlu dihancurkan kurang dari soToken yang dicetak selama hipotek. Penyerang menggunakan soToken yang diperoleh untuk meminjamkan token yang mendasarinya WETH dan USDC ke soToken lain (seperti soWETH, soUSDC), dan akhirnya memperoleh Keuntungan setinggi US $ 20 juta.
Persiapan Serangan:
Serang Transaksi yang Menguntungkan:
Serang alamat terkait EOA:
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
Alamat terkait penyerang (kontrak):
0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8
0x02fa2625825917e9b1f8346a465de1bbc150c5b9
token yang mendasarinya (VELO Token V2):
0x9560e827af36c94d2ac33a39bce1fe78631088db
Kontrak kerentanan (soVELO, mirip dengan cToken Compound):
0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
@tonyke_bot Transaksi User Rescue di X:
Tim proyek Sonne Finance baru-baru ini meloloskan proposal untuk menambahkan pasar VELO ke Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044), dan mengatur lima transaksi melalui dompet multi-tanda tangan untuk dieksekusi dua hari kemudian ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), kelima transaksi ini digunakan untuk membuat pasar VELO (kontrak soVELO) dan menetapkan beberapa konfigurasi utama pasar, seperti menetapkan model suku bunga, menetapkan oracle harga, dan menetapkan faktor hipotek, dll. Setelah pasar VELO dibuat, pengguna dapat setor VELO token untuk cetak token soVELO, yang pada gilirannya dapat digunakan untuk meminjam soToken lainnya.
Tahap persiapan serangan terutama bagi penyerang untuk membuat pasar VELO (kontrak soVELO) berdasarkan informasi dalam proposal proyek Sonne Finance setelah periode penguncian dua hari proposal telah berakhir, mengatur konfigurasi kunci, dan cetak VELO token ke dalam kontrak soVELO dengan menggadaikan mereka. token soVELO, dan juga mengirimkan token VELO yang dipegangnya langsung ke kontrak soVELO untuk meningkatkan nilai tukar dan mempersiapkan untuk mendapatkan keuntungan dari serangan berikutnya.
Langkah-langkah spesifiknya adalah sebagai berikut:
Setelah periode penguncian dua hari berakhir, penyerang pertama-tama mengemas operasi dari empat transaksi pertama yang diatur dalam proposal menjadi satu transaksi (0x45c0cc transaksi), yang digunakan untuk membuat pasar VELO (kontrak soVELO) dan mengatur konfigurasi kunci. Ketika pasar VELO diinisialisasi, nilai tukar diatur ke "200.000.000.000.000.000.000.000.000.000".
Penyerang menyebut fungsi "cetak" dari kontrak soVELO untuk setor VELO token dan cetak token soVELO. Penyerang menentukan "mintAmount" sebagai "400.000.001" (jumlah token VELO). Seperti dapat dilihat dari fungsi "exchangeRateStoredInternal", karena "_totalSuppl" token soVELO adalah 0 saat ini, exchangeRate adalah nilai yang ditetapkan pada langkah 1. Menurut rumus " mintTokens = actualMintAmount / exchangeRate ", jumlah token soVELO yang dihitung yang harus dicetak saat ini adalah 2. Secara short, pada langkah ini, penyerang menyetor token VELO dengan nilai "400.000.001" ke dalam kontrak soVELO, dan penyerang memperoleh token soVELO dengan nilai 2.
soVELO.cetak:
Penyerang mengirim token VELO dengan nilai "2.552.964.259.704.265.837.526" ke kontrak soVELO dengan langsung mengirimkan token VELO ke kontrak soVELO. Pada saat ini, jumlah token VELO yang dipegang oleh kontrak soVELO meningkat, tetapi karena tidak ada token soVELO baru koin dicetak, sehingga totalSupply tetap tidak berubah, yang berarti bahwa nilai tukar yang dihitung sesuai dengan rumus perhitungan nilai tukar akan menjadi lebih besar saat ini.
Penyerang mentransfer token soVELO yang dipegang beberapa kali, dan akhirnya mentransfernya ke 0xae4a EOA serangan lain.
Fase keuntungan serangan terutama melibatkan penyerang yang mengeksekusi transaksi kelima dari proposal dan meminjamkan token VELO langsung ke kontrak soVELO melalui pinjaman flash untuk lebih meningkatkan nilai tukar. Kemudian penyerang menggunakan token soVELO dengan nilai 2 di tangannya untuk meminjam token yang mendasarinya seperti WETH dan USDC dari kontrak soToken lainnya (seperti soWETH, soUSDC, dll.), Dan bagian-bagian ini menjadi keuntungan penyerang. Kemudian penyerang pergi untuk menebus token yang mendasarinya dalam kontrak soVELO. Karena peningkatan nilai tukar dan hilangnya akurasi dalam menghitung token soVELO yang perlu dihancurkan untuk penebusan, penyerang akhirnya hanya menggunakan token soVELO dengan nilai 1. Hampir semua token VELO yang disimpan sebelumnya ditebus, yang dapat dipahami sebagai penyerang menggunakan token soVELO tambahan dengan nilai 1 untuk mendapatkan token yang mendasarinya seperti WETH dan USDC dengan meminjam dari soToken lainnya. Penyerang menggunakan teknik yang sama untuk mengulangi serangan berkali-kali dan akhirnya menghasilkan keuntungan besar.
Langkah-langkah spesifiknya adalah sebagai berikut:
Penyerang mengeksekusi transaksi kelima dalam proposal dan menetapkan faktor pinjaman yang ditentukan dalam proposal.
Pinjaman flash penyerang VELO token dengan nilai "35.469.150.965.253.049.864.450.449" dari kumpulan AMM - USDC/VELO VolatileV2, yang memicu fungsi hook penyerang. Dalam fungsi hook, penyerang terus melakukan operasi serangan.
Penyerang mengirimkan token VELO yang dipegangnya ke kontrak soVELO untuk lebih meningkatkan nilai tukar. Saat ini, ada total VELO token dengan nilai "35.471.703.929.512.754.530.287.976" dalam kontrak soVELO (jumlah VELO token yang ditransfer tiga kali oleh penyerang).
Penyerang membuat 0xa16388a6210545b27f669d5189648c1722300b8b kontrak baru. Di konstruktor, dia mentransfer 2 token soVELO yang dia pegang ke 0xa163 kontrak yang baru dibuat (selanjutnya disebut sebagai penyerang 0xa163).
Penyerang 0xa163 menggunakan token soVELO yang dipegangnya untuk meminjam WETH dengan nilai "265.842.857.910.985.546.929" dari soWETH.
Penyerang 0xa163 menyebut fungsi "redeemUnderlying" soVELO, menentukan nilai token VELO yang ditebus sebagai "35.471.603.929.512.754.530.287.976" (hampir jumlah token VELO yang sebelumnya telah ditransfer atau digadaikan penyerang ke dalam kontrak soVELO). Pada saat ini, perlu untuk Rumus "redeemTokens = redeemAmountIn / exchangeRate" digunakan untuk menghitung jumlah token soVELO yang perlu dihancurkan untuk penebusan.
Seperti dapat dilihat dari fungsi "exchangeRateStoredInternal", karena _totalSupply adalah 2, bukan 0, nilai nilai tukar perlu dihitung. Menurut rumus "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply", nilai tukar saat ini adalah "17.735.851.964.756.377.265.143.988.000,0 00.000.000.000.000.000.000 ", nilai ini jauh lebih besar dari nilai tukar awal yang ditetapkan "200.000.000.000.000.000.000.000.000.000".
Nilai " redeemTokens " dihitung berdasarkan nilai tukar baru adalah " 1,99 ". Karena karakteristik pembulatan ke bawah dari Solidity, nilai " redeemTokens " akhirnya menjadi 1. Ini berarti bahwa penyerang 0xa163 menggunakan token soVELO dengan nilai 1 untuk menebus hampir semua token VELO yang disimpan sebelumnya. Pada saat yang sama, penyerang juga 0xa163 mendapatkan WETH dengan nilai "265.842.857.910.985.546.929" yang dipinjam dari soWETH.
soVELO.redeemUnderlying:
soVELO.exchangeRateStoredInternal:
Penyerang 0xa163 mentransfer semua WETH yang dipinjam dan menebus token VELO ke penyerang tingkat atas, dan kemudian dihancurkan sendiri.
Penyerang menyebut fungsi "liquidateBorrow" dari soWETH untuk melikuidasi beberapa aset yang dipinjam dari 0xa163 kontrak yang baru dibuat pada tahun pesanan untuk mendapatkan kembali token soVELO yang terkunci dengan nilai 1. Saat ini penyerang hanya memegang token soVELO dengan nilai 1.
Penyerang menyebut fungsi "cetak" dari soVELO dan sekali lagi menggadaikan dan mencetak token soVELO dengan tujuan mengumpulkan token soVELO yang cukup dengan nilai 2, dan kemudian melakukan langkah 3-8 di atas lagi untuk mendapatkan keuntungan dari token undeylying lainnya.
Penyerang melakukan operasi pada langkah 9 beberapa kali, membayar kembali pinjaman flash, dan meninggalkan pasar dengan keuntungan.
Setelah serangan, pengguna @tonyke_bot pada X mencetak 0,00000011 soVELO dengan mempertaruhkan 1144 token VELO ke dalam kontrak soVELO dalam 0x0a284cd transaksi. Alasan mengapa operasi ini dapat mencegah penyerang dari serangan lebih lanjut adalah karena transaksi ini mengubah ukuran totalSupply di soVELO dan jumlah token VELO totalCash yang dimiliki, dan dampak pertumbuhan totalSupply pada perhitungan nilai tukar lebih besar daripada dampak pertumbuhan totalCash. Oleh karena itu, nilai tukar menjadi lebih kecil, menyebabkan penyerang tidak lebih lama dapat menggunakan hilangnya akurasi untuk mendapatkan soVELO saat melakukan serangan, membuat serangan tidak lebih lama mungkin.
Penyerang mentransfer dana tak lama setelah mengambil hasil ilegal. Sebagian besar dana ditransfer ke empat alamat berikut. Beberapa mengubah alamat untuk melanjutkan serangan, dan beberapa untuk pencucian uang:
1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d
Penyerang mentransfer 198 WETH ke alamat ini, dan kemudian alamat tersebut menggunakan metode serangan yang sama untuk mendapatkan keuntungan ilegal dalam transaksi berikut:
Setelah serangan itu, alamat tersebut mentransfer keuntungan ilegal yang disebutkan di atas kepada 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.
2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
Penyerang mentransfer 724277 USDC dan 2353 VELO ke alamat ini, dan menukar USDC dengan Ether. Kemudian sejumlah dana segera ditransfer ke Stargate cross-chain bridge. Sebagian besar dana haram tetap berada di alamat ini:
3、0xbd18100a168321701955e348f03d0df4f517c13b
Penyerang mentransfer 33 WETH ke alamat ini dan menggunakan rantai kupas untuk mencoba mencuci uang. Tautan pencucian uang adalah sebagai berikut:
0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。
4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770
Penyerang mentransfer 563 WETH ke alamat ini dan kemudian ke 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68, tanpa tindakan lebih lanjut sejauh ini.
Metode pencucian uang penyerang kali ini relatif profesional, dan metodenya menunjukkan tren keragaman. Oleh karena itu, bagi kami para peserta Web3, kami harus terus meningkatkan kemampuan anti pencucian uang kami dalam hal keamanan, dan meningkatkan keamanan proyek Defi melalui KYT, AML dan produk keamanan transaksi blockchain terkait lainnya.
1、Tetap up to date dengan audit dan pengujian kontrak. Lakukan audit komprehensif sebelum penerapan kontrak pintar, berikan perhatian khusus pada semua bagian yang melibatkan perhitungan keuangan. Pertama, gunakan pengujian otomatis dan manfaatkan pembaruan real-time dari pustaka kerentanan untuk melakukan pemindaian keamanan kontrak yang efisien (industri juga secara bertahap membuka sumber beberapa alat audit keamanan yang matang, termasuk ZAN AI SCAN), sambil menggabungkan audit manual untuk memecahkan masalah yang memerlukan pengetahuan industri yang mendalam.
2、Hilangnya akurasi perlu ditanggapi dengan serius. Masalah keamanan yang disebabkan oleh hilangnya akurasi tidak ada habisnya, terutama dalam proyek Defi, di mana kehilangan akurasi sering menyebabkan kerugian finansial yang serius. Disarankan agar pihak proyek dan auditor keamanan dengan hati-hati meninjau kode dengan kehilangan akurasi dalam proyek dan melakukan tes untuk menghindari kerentanan ini sebanyak mungkin.
Disarankan agar penciptaan pasar yang mirip dengan cToken di Compound dan operasi pengecoran hipotek pertama dilakukan oleh pengguna istimewa untuk menghindari manipulasi oleh penyerang dan dengan demikian memanipulasi tingkat pertukaran.
Ketika ada variabel kunci dalam kontrak yang bergantung pada nilai " this.balance " atau " token.balanceOf() ", Anda perlu mempertimbangkan dengan cermat kondisi untuk perubahan variabel kunci, seperti apakah diizinkan untuk langsung mentransfer mata uang asli atau token ke kontrak. metode untuk mengubah nilai variabel, atau dapatkah nilai variabel hanya diubah dengan memanggil fungsi tertentu.