Pada 18 Oktober 2023 19:48:59 waktu Beijing, kumpulan pinjaman Hope.money diserang berdasarkan pinjaman kilat.
Hope.money telah membangun layanan keuangan terdesentralisasi full-stack termasuk platform pinjaman HopeLend, pertukaran terdesentralisasi HopeSwap, $HOPE stablecoin, dan $LT token tata kelola.
Protokol yang terlibat dalam serangan itu adalah HopeLend, platform pinjaman terdesentralisasi yang memungkinkan pengguna untuk menyediakan likuiditas ke protokol atau overcollateralize untuk mendapatkan penghasilan.
Acara dimulai dan berakhir
Dalam implementasi kode HopeLend, ada kerentanan yang dapat dieksploitasi di kumpulan pinjaman, karena masalah pembagian bilangan bulat yang salah ketika menghancurkan sertifikat deposito, mengakibatkan titik desimal terpotong, mencapai penghancuran sertifikat lebih sedikit dari yang diharapkan, dan mendapatkan token nilai yang sama seperti yang diharapkan.
Penyerang mengeksploitasi kelemahan ini untuk mengosongkan beberapa kumpulan dana pinjaman di Hope.money.
Kolam pinjaman hEthWbtc dikerahkan 73 hari yang lalu, tetapi tidak ada dana di dalamnya, sehingga peretas menyuntikkan sejumlah besar uang ke dalam kumpulan pinjaman untuk secara dramatis meroket tingkat diskonto, sehingga dengan cepat mengosongkan semua kumpulan pinjaman lainnya dalam transaksi blok.
Lebih dramatis lagi, peretas yang dieksploitasi tidak menerima dana untuk eksploitasi, dan transaksi serangannya ditemukan oleh penjambret, yang meniru serangannya dan berhasil mencuri semua dana hasil serangan (527 ETH), dan akhirnya 50% dari dana hasil serangan (263 ETH) digunakan oleh perampok untuk menyuap para penambang yang mengemas blok (muatan).
Peretas awal yang menemukan kerentanan membuat kontrak serangan di blok 18377039, dan membuat panggilan untuk menyerang kontrak di blok 18377042, pada saat itu penjambret memantau transaksi di kumpulan memori dan mensimulasikan kontrak serangannya, sebagai input dari kontrak perampasan, dan mengeksploitasinya di blok 18377042 yang sama, dan transaksi peretas awal di blok 18377042 gagal karena diurutkan di belakang penjambret.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-420dceb701-dd1a6f-69ad2a.webp)
Kemana perginya uang itu
Satu jam setelah penjambret menerima hasil, dana ditransfer ke: 0x9a9122Ef3C4B33cAe7902EDFCD5F5a486792Bc3A
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-2bec7812fd-dd1a6f-69ad2a.webp)
Pada tanggal 20 Oktober pukul 13:30:23, tim resmi yang dicurigai menghubungi alamat tersebut, memungkinkan pelari untuk meninggalkan 26 ETH (keuntungan 10%) sebagai hadiah, dan mendapatkan balasan dari para pelari.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-b3c8715e62-dd1a6f-69ad2a.webp)
Dana akhir ditransfer ke brankas multisig GnosisSafe setelah satu jam komunikasi.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-a7c1f91d1a-dd1a6f-69ad2a.webp)
Di bawah ini kami akan menunjukkan kerentanan nyata dan detail peretas yang mengeksploitasi.
Pra-informasi
Protokol pinjaman HopeLend mengimplementasikan garpu dari Aave, sehingga logika bisnis inti yang terkait dengan kerentanan dirujuk dalam buku putih Aave.
0x00 Deposito dan Pinjaman
Aave adalah DeFi murni, bisnis pinjaman diwujudkan melalui kumpulan likuiditas, pengguna berharap menerima pendapatan dari pinjaman ketika setoran Aave menyediakan likuiditas.
Pendapatan pinjaman tidak sepenuhnya didistribusikan kepada pengguna, sebagian kecil dari pendapatan bunga akan dimasukkan dalam cadangan risiko, bagian ini adalah proporsi yang lebih kecil, sebagian besar pendapatan pinjaman akan didistribusikan kepada pengguna yang menyediakan likuiditas.
Saat melakukan pinjaman deposito di Aave, Aave mengubah jumlah setoran pada titik waktu yang berbeda menjadi bagian dari jumlah setoran pada titik waktu awal kumpulan likuiditas melalui diskonto, sehingga jumlah pokok dan bunga yang sesuai dengan aset dasar dari setiap jumlah saham dapat langsung dihitung dengan jumlah * indeks, yang sangat memudahkan perhitungan dan pemahaman.
Ini dapat dipahami sebagai proses yang mirip dengan pembelian dana, nilai bersih awal dana adalah 1, pengguna menginvestasikan 100 yuan untuk mendapatkan 100 saham, dengan asumsi bahwa setelah periode keuntungan, nilai bersih menjadi 1,03, saat ini pengguna menginvestasikan 100 yuan lagi, bagian yang diperoleh adalah 97, dan total bagian pengguna adalah 197.
Ini sebenarnya mendiskontokan aset sesuai dengan indeks. Alasan untuk ini adalah bahwa jumlah pokok dan bunga aktual pengguna dikalikan dengan indeks saat ini dengan saldo. Ketika setoran kedua, jumlah pokok dan bunga pengguna yang benar harus 100 * 1,03 + 100 = 203, jika tidak didiskontokan, pengguna kedua menyetor 100 setelah jumlah pokok dan bunga menjadi ( 100 + 100) * 1,03 = 206, salah, jika didiskontokan, jumlah pokok dan bunga menjadi (100 + 100 / 1,03) * 1,03 = 103 + 100 = 203.203 Hasilnya benar.
Proses serangan
0x25126...... 403907(kolam hETHWBTC)
0x5a63e...... 844E74 (Kontrak Serangan - Pencairan)
Penyerang:
1. Pinjamkan dana pinjaman kilat awal dan jaminkan
Penyerang pertama-tama meminjam 2300 WBTC dari Aave Lightning, mempertaruhkan 2000 setoran WBTC ke HopeLend, dan dana tersebut akan ditransfer ke kontrak hEthWbtc HopeLende (0x251 ... 907), dan juga memperoleh 2000 hETHWBTC yang sesuai.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-39c44b60e7-dd1a6f-69ad2a.webp)
2. Memanipulasi tingkat diskonto awal (liquidityIndex) dengan kumpulan pinjaman kosong
Pinjam 2000 WBTC dari HopeLend untuk pinjaman kilat.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-493bd5cd96-dd1a6f-69ad2a.webp)
Nilai saat ini adalah 1 hETHWBTC = 1 WBTC.
Menurut operasi normal mengakses ETHWBTC untuk bertukar kembali ke WBTC, itu tidak akan mempengaruhi rasio pertukaran (hanya ketika bunga diperoleh akan mempengaruhi rasio pertukaran, 1 hETHWBTC akan mendapatkan lebih banyak WBTC).
Pada titik ini, peretas mulai memanipulasi tingkat diskonto melalui serangkaian operasi kompleks:
• Peretas langsung mentransfer dana 2000 WBTC ke kontrak hEthWbtc HopeLen (0x 251 ... 907), langkah ini bukan untuk membayar kembali pinjaman.
• Peretas kemudian menarik, sebagian besar WBTC (1999.999 ... ), jadi langkah sebelumnya mengharuskan bergulir kembali ke WBTC untuk mengisi kembali aset di kumpulan.
• Akhirnya, peretas hanya menyimpan unit terkecil (1 e-8) dari hEthWbtc, yang tidak dapat sepenuhnya disebutkan di sini, karena perlu untuk meninggalkan sedikit, sebagai perhitungan liquidityIndex, itu akan didasarkan pada penambahan plus yang ada, jika dihapus, mengakibatkan liquidityIndex menjadi 0, Anda tidak dapat membuat proporsi dalam kumpulan tidak seimbang.
• Hancurkan sebagian besar wBTC yang ditukar dengan hEthWbtc pada langkah sebelumnya, tambahkan sisa wBTC dari pinjaman flash sebelumnya, dan kembalikan pinjaman flash yang dipinjamkan ke pool HopeLend, membayar total 2001,8 WBTC (termasuk bunga 1,8 wBTC).
• Proses di atas menghancurkan sebagian besar hEthWbtc, hanya menyisakan 1 unit terkecil (1 e-8) hEthWbtc di akun peretas, sehingga jumlah total hETHWBTC berkurang, dan ada 2001,8 wBTC di kumpulan pinjaman, di mana titik indeks likuiditas mencapai 126.000.000 yang mengejutkan. Ini melibatkan pengetahuan bahwa bunga pengguna deposito pada dasarnya berasal dari pertumbuhan likuiditas di pool, dan lending pool akan secara dinamis menyesuaikan suku bunga pinjaman dan deposito sesuai dengan suku bunga deposito dan tingkat pemanfaatan.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-e386610ea7-dd1a6f-69ad2a.webp)
Di sini, ketika pool menerima likuiditas tambahan dari bunga pinjaman kilat (1, 8 WBTC), tujuh puluh persen (126.000.000) termasuk dalam indeks likuiditas (liquidityIndex), yang digunakan untuk menghitung nilai diskonto per unit deposito (hEthWbt).
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-56409cd0fd-dd1a6f-69ad2a.webp)
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-96bcc3e14e-dd1a6f-69ad2a.webp)
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-9a75762f1e-dd1a6f-69ad2a.webp)
Karena pool kosong sebelum hack, totalLiquidity hanya 1 setelah pembayaran, jumlahnya 126000000, dan indeks likuiditas awal adalah 1, menghasilkan hasil 126000001.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-c54ae6461b-dd1a6f-69ad2a.webp)
3. Terus perkuat tingkat diskonto
Para peretas melanjutkan untuk meminjam 2.000 WBTC dari HopeLend untuk pinjaman kilat dan mengembalikan 1,8 WBTC tambahan setiap kali, memungkinkan setiap LiquidityIndex untuk mengumpulkan 126.000.000.
Para peretas mengulangi proses tersebut sebanyak 60 kali, dan akhirnya indeks likuiditas mencapai 7.560.000.001, dan nilai diskonto 1 unit terkecil hEthWBTC yang dipegang penyerang bisa mencapai 75,6 WBTC (sekitar $2,14 juta).
Hal ini memungkinkan peretas untuk memanipulasi hEthWBTC, mendistorsi nilainya.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-7a6cfad314-dd1a6f-69ad2a.webp)
4. Melubangi kumpulan pinjaman lain di mana dana ada untuk membentuk pendapatan
Para penyerang kemudian mempertaruhkan 1 unit terkecil hEthWBTC dan meminjamkan sejumlah besar aset dari lima kumpulan token HopeLond lainnya.
Memasukkan:
175.4 - WETH
145, 522.220985 - USDT
123, 406.134999 - USDC
844, 282.284002229528476039 - HARAPAN
220, 617.821736563540747967 - stHOPE
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-8aa289f7db-dd1a6f-69ad2a.webp)
Token ini ditukar dengan WBTC dan WETH melalui Uniswap sebagai hasil, dan setelah dikurangi berbagai biaya, peretas akhirnya mendapat untung sekitar 263 WETH (tidak termasuk 263,9 WETH yang menyuap muatan).
Mengapa peretas dapat meminjam uang dalam jumlah besar dari kumpulan lain:
Saat meminjam atau menarik setoran, kontrak peminjaman akan memeriksa kondisi aset yang dijaminkan pengguna untuk memastikan bahwa pinjaman tidak melebihi agunan.
Karena tingkat diskonto telah dimanipulasi oleh peretas dan tingkat diskonto dihitung dalam nilai jaminan dalam pengganda pendapatan yang dinormalisasi, nilai jaminan satu unit hEthWBTC di tangannya setinggi 75,6 WBTC.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-e21db310ea-dd1a6f-69ad2a.webp)
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-9c0111bcf6-dd1a6f-69ad2a.webp)
Setiap kali mereka meminjam uang dari pool lain, peretas dengan mudah lulus verifikasi aset jaminan.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-362c84f0ae-dd1a6f-69ad2a.webp)
Pada titik ini, penyerang menginvestasikan total 2000+ 1,8* 60 WBTC di HopeLend untuk memanipulasi liquidityIndex, hanya menyisakan 1 unit hEtthWBTC.
5. Mengeksploitasi titik kerentanan kritis (kesalahan pembagian bilangan bulat) untuk mencairkan uang
Untuk mengambil investasi sebelumnya wBTC, para penyerang mengerahkan kontrak serangan lain: 0x 5 a 63 e ... 844 e 74 dan panggil metode withdrawAllBtc() di sana
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-821db2a3ae-dd1a6f-69ad2a.webp)
Proses kerentanan adalah sebagai berikut:
(1) Setoran pertama 151.200000002 wBTC, menurut indeks likuiditas saat ini (1 unit terkecil hEthWBTC=75.6 wBTC), penyerang mendapat 2 unit terkecil hEthWBTC.
(2) Keluarkan (tarik) 113.4 wBTC, hitung balik bagian hEthWBTC yang sesuai, dan bakar hEthWBTC.
(3) 113.4 wBTC perlu menghancurkan 1.99999999998 unit terkecil hEthWBTC, tetapi karena keakuratan fungsi div, hanya satu unit terkecil hEthWBTC yang dihancurkan, sehingga menjadi kerentanan yang dapat dieksploitasi, dan peretas masih dapat menyimpan 1 unit terkecil hEthWBTC.
Kerentanan kritis
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-7ff70593aa-dd1a6f-69ad2a.webp)
Metode pembakaran hEthWBTC memanggil divisi presisi tinggi rayDiv.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-8ab92bd200-dd1a6f-69ad2a.webp)
Sini:
a= 11340000000 (WBTC dimaksudkan untuk dihapus)
B = 7560000001000000000000000009655610336 (tingkat diskonto)
Meskipun (a* 1e27+b/2)/b = 1,99999999998, metode div bawaan Solidity memotong dan mengembalikan 1, yang setara dengan 113400000000 / 7560000001 tempat desimal dipotong setelah pembagian.
0x5a63 (Attack Contract - Cash Out) terus menyetor 75.600000001 WBTC persis untuk mendapatkan 1 unit minimum hEthWBTC lagi, sehingga terus memegang 2 unit minimum hEthWBTC.
Dalam loop ini, 113.4000000000 wBTC ditarik dan 75.600000001 wBTC disetorkan, setiap penyerang dapat memperoleh 37,8 wBTC dari udara tipis.
Setelah 58 siklus, penyerang menarik semua wBTC yang diinvestasikan di muka dan dengan lancar mengembalikan pinjaman flash Aave.
Kesimpulan
Karena kumpulan pinjaman hEthWBTC tidak diinisialisasi, penyerang dapat dengan mudah memanipulasi indeks likuiditas untuk meningkatkannya secara maksimal, dan tingkat penarikan sangat diperkuat sebagai pembagi, sehingga lebih mudah untuk mengambil investasi sebelumnya dalam blok karena kesalahan pemotongan pembagian bilangan bulat.
Dalam kumpulan pinjaman yang berfungsi dengan baik, tidak mudah untuk meningkatkan tingkat diskonto secara signifikan karena sedikit kenaikan bunga pinjaman karena likuiditas yang ada di kumpulan.
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
CertiK: Analisis serangan pinjaman pada platform pinjaman terdesentralisasi HopeLend
Pada 18 Oktober 2023 19:48:59 waktu Beijing, kumpulan pinjaman Hope.money diserang berdasarkan pinjaman kilat.
Hope.money telah membangun layanan keuangan terdesentralisasi full-stack termasuk platform pinjaman HopeLend, pertukaran terdesentralisasi HopeSwap, $HOPE stablecoin, dan $LT token tata kelola.
Protokol yang terlibat dalam serangan itu adalah HopeLend, platform pinjaman terdesentralisasi yang memungkinkan pengguna untuk menyediakan likuiditas ke protokol atau overcollateralize untuk mendapatkan penghasilan.
Acara dimulai dan berakhir
Dalam implementasi kode HopeLend, ada kerentanan yang dapat dieksploitasi di kumpulan pinjaman, karena masalah pembagian bilangan bulat yang salah ketika menghancurkan sertifikat deposito, mengakibatkan titik desimal terpotong, mencapai penghancuran sertifikat lebih sedikit dari yang diharapkan, dan mendapatkan token nilai yang sama seperti yang diharapkan.
Penyerang mengeksploitasi kelemahan ini untuk mengosongkan beberapa kumpulan dana pinjaman di Hope.money.
Kolam pinjaman hEthWbtc dikerahkan 73 hari yang lalu, tetapi tidak ada dana di dalamnya, sehingga peretas menyuntikkan sejumlah besar uang ke dalam kumpulan pinjaman untuk secara dramatis meroket tingkat diskonto, sehingga dengan cepat mengosongkan semua kumpulan pinjaman lainnya dalam transaksi blok.
Lebih dramatis lagi, peretas yang dieksploitasi tidak menerima dana untuk eksploitasi, dan transaksi serangannya ditemukan oleh penjambret, yang meniru serangannya dan berhasil mencuri semua dana hasil serangan (527 ETH), dan akhirnya 50% dari dana hasil serangan (263 ETH) digunakan oleh perampok untuk menyuap para penambang yang mengemas blok (muatan).
Peretas awal yang menemukan kerentanan membuat kontrak serangan di blok 18377039, dan membuat panggilan untuk menyerang kontrak di blok 18377042, pada saat itu penjambret memantau transaksi di kumpulan memori dan mensimulasikan kontrak serangannya, sebagai input dari kontrak perampasan, dan mengeksploitasinya di blok 18377042 yang sama, dan transaksi peretas awal di blok 18377042 gagal karena diurutkan di belakang penjambret.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-420dceb701-dd1a6f-69ad2a.webp)
Kemana perginya uang itu
Satu jam setelah penjambret menerima hasil, dana ditransfer ke: 0x9a9122Ef3C4B33cAe7902EDFCD5F5a486792Bc3A
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-2bec7812fd-dd1a6f-69ad2a.webp)
Pada tanggal 20 Oktober pukul 13:30:23, tim resmi yang dicurigai menghubungi alamat tersebut, memungkinkan pelari untuk meninggalkan 26 ETH (keuntungan 10%) sebagai hadiah, dan mendapatkan balasan dari para pelari.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-b3c8715e62-dd1a6f-69ad2a.webp)
Dana akhir ditransfer ke brankas multisig GnosisSafe setelah satu jam komunikasi.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-a7c1f91d1a-dd1a6f-69ad2a.webp)
Di bawah ini kami akan menunjukkan kerentanan nyata dan detail peretas yang mengeksploitasi.
Pra-informasi
0x00 Deposito dan Pinjaman
Aave adalah DeFi murni, bisnis pinjaman diwujudkan melalui kumpulan likuiditas, pengguna berharap menerima pendapatan dari pinjaman ketika setoran Aave menyediakan likuiditas.
Pendapatan pinjaman tidak sepenuhnya didistribusikan kepada pengguna, sebagian kecil dari pendapatan bunga akan dimasukkan dalam cadangan risiko, bagian ini adalah proporsi yang lebih kecil, sebagian besar pendapatan pinjaman akan didistribusikan kepada pengguna yang menyediakan likuiditas.
Saat melakukan pinjaman deposito di Aave, Aave mengubah jumlah setoran pada titik waktu yang berbeda menjadi bagian dari jumlah setoran pada titik waktu awal kumpulan likuiditas melalui diskonto, sehingga jumlah pokok dan bunga yang sesuai dengan aset dasar dari setiap jumlah saham dapat langsung dihitung dengan jumlah * indeks, yang sangat memudahkan perhitungan dan pemahaman.
Ini dapat dipahami sebagai proses yang mirip dengan pembelian dana, nilai bersih awal dana adalah 1, pengguna menginvestasikan 100 yuan untuk mendapatkan 100 saham, dengan asumsi bahwa setelah periode keuntungan, nilai bersih menjadi 1,03, saat ini pengguna menginvestasikan 100 yuan lagi, bagian yang diperoleh adalah 97, dan total bagian pengguna adalah 197.
Ini sebenarnya mendiskontokan aset sesuai dengan indeks. Alasan untuk ini adalah bahwa jumlah pokok dan bunga aktual pengguna dikalikan dengan indeks saat ini dengan saldo. Ketika setoran kedua, jumlah pokok dan bunga pengguna yang benar harus 100 * 1,03 + 100 = 203, jika tidak didiskontokan, pengguna kedua menyetor 100 setelah jumlah pokok dan bunga menjadi ( 100 + 100) * 1,03 = 206, salah, jika didiskontokan, jumlah pokok dan bunga menjadi (100 + 100 / 1,03) * 1,03 = 103 + 100 = 203.203 Hasilnya benar.
Proses serangan
0x25126...... 403907(kolam hETHWBTC)
0x5a63e...... 844E74 (Kontrak Serangan - Pencairan)
Penyerang:
1. Pinjamkan dana pinjaman kilat awal dan jaminkan
Penyerang pertama-tama meminjam 2300 WBTC dari Aave Lightning, mempertaruhkan 2000 setoran WBTC ke HopeLend, dan dana tersebut akan ditransfer ke kontrak hEthWbtc HopeLende (0x251 ... 907), dan juga memperoleh 2000 hETHWBTC yang sesuai.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-39c44b60e7-dd1a6f-69ad2a.webp)
2. Memanipulasi tingkat diskonto awal (liquidityIndex) dengan kumpulan pinjaman kosong
Pinjam 2000 WBTC dari HopeLend untuk pinjaman kilat.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-493bd5cd96-dd1a6f-69ad2a.webp)
Nilai saat ini adalah 1 hETHWBTC = 1 WBTC.
Menurut operasi normal mengakses ETHWBTC untuk bertukar kembali ke WBTC, itu tidak akan mempengaruhi rasio pertukaran (hanya ketika bunga diperoleh akan mempengaruhi rasio pertukaran, 1 hETHWBTC akan mendapatkan lebih banyak WBTC).
Pada titik ini, peretas mulai memanipulasi tingkat diskonto melalui serangkaian operasi kompleks:
• Peretas langsung mentransfer dana 2000 WBTC ke kontrak hEthWbtc HopeLen (0x 251 ... 907), langkah ini bukan untuk membayar kembali pinjaman.
• Peretas kemudian menarik, sebagian besar WBTC (1999.999 ... ), jadi langkah sebelumnya mengharuskan bergulir kembali ke WBTC untuk mengisi kembali aset di kumpulan.
• Akhirnya, peretas hanya menyimpan unit terkecil (1 e-8) dari hEthWbtc, yang tidak dapat sepenuhnya disebutkan di sini, karena perlu untuk meninggalkan sedikit, sebagai perhitungan liquidityIndex, itu akan didasarkan pada penambahan plus yang ada, jika dihapus, mengakibatkan liquidityIndex menjadi 0, Anda tidak dapat membuat proporsi dalam kumpulan tidak seimbang.
• Hancurkan sebagian besar wBTC yang ditukar dengan hEthWbtc pada langkah sebelumnya, tambahkan sisa wBTC dari pinjaman flash sebelumnya, dan kembalikan pinjaman flash yang dipinjamkan ke pool HopeLend, membayar total 2001,8 WBTC (termasuk bunga 1,8 wBTC).
• Proses di atas menghancurkan sebagian besar hEthWbtc, hanya menyisakan 1 unit terkecil (1 e-8) hEthWbtc di akun peretas, sehingga jumlah total hETHWBTC berkurang, dan ada 2001,8 wBTC di kumpulan pinjaman, di mana titik indeks likuiditas mencapai 126.000.000 yang mengejutkan. Ini melibatkan pengetahuan bahwa bunga pengguna deposito pada dasarnya berasal dari pertumbuhan likuiditas di pool, dan lending pool akan secara dinamis menyesuaikan suku bunga pinjaman dan deposito sesuai dengan suku bunga deposito dan tingkat pemanfaatan.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-e386610ea7-dd1a6f-69ad2a.webp)
Di sini, ketika pool menerima likuiditas tambahan dari bunga pinjaman kilat (1, 8 WBTC), tujuh puluh persen (126.000.000) termasuk dalam indeks likuiditas (liquidityIndex), yang digunakan untuk menghitung nilai diskonto per unit deposito (hEthWbt).
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-56409cd0fd-dd1a6f-69ad2a.webp)
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-96bcc3e14e-dd1a6f-69ad2a.webp)
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-9a75762f1e-dd1a6f-69ad2a.webp)
Karena pool kosong sebelum hack, totalLiquidity hanya 1 setelah pembayaran, jumlahnya 126000000, dan indeks likuiditas awal adalah 1, menghasilkan hasil 126000001.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-c54ae6461b-dd1a6f-69ad2a.webp)
3. Terus perkuat tingkat diskonto
Para peretas melanjutkan untuk meminjam 2.000 WBTC dari HopeLend untuk pinjaman kilat dan mengembalikan 1,8 WBTC tambahan setiap kali, memungkinkan setiap LiquidityIndex untuk mengumpulkan 126.000.000.
Para peretas mengulangi proses tersebut sebanyak 60 kali, dan akhirnya indeks likuiditas mencapai 7.560.000.001, dan nilai diskonto 1 unit terkecil hEthWBTC yang dipegang penyerang bisa mencapai 75,6 WBTC (sekitar $2,14 juta).
Hal ini memungkinkan peretas untuk memanipulasi hEthWBTC, mendistorsi nilainya.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-7a6cfad314-dd1a6f-69ad2a.webp)
4. Melubangi kumpulan pinjaman lain di mana dana ada untuk membentuk pendapatan
Para penyerang kemudian mempertaruhkan 1 unit terkecil hEthWBTC dan meminjamkan sejumlah besar aset dari lima kumpulan token HopeLond lainnya.
Memasukkan:
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-8aa289f7db-dd1a6f-69ad2a.webp)
Token ini ditukar dengan WBTC dan WETH melalui Uniswap sebagai hasil, dan setelah dikurangi berbagai biaya, peretas akhirnya mendapat untung sekitar 263 WETH (tidak termasuk 263,9 WETH yang menyuap muatan).
Mengapa peretas dapat meminjam uang dalam jumlah besar dari kumpulan lain:
Saat meminjam atau menarik setoran, kontrak peminjaman akan memeriksa kondisi aset yang dijaminkan pengguna untuk memastikan bahwa pinjaman tidak melebihi agunan.
Karena tingkat diskonto telah dimanipulasi oleh peretas dan tingkat diskonto dihitung dalam nilai jaminan dalam pengganda pendapatan yang dinormalisasi, nilai jaminan satu unit hEthWBTC di tangannya setinggi 75,6 WBTC.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-e21db310ea-dd1a6f-69ad2a.webp)
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-9c0111bcf6-dd1a6f-69ad2a.webp)
Setiap kali mereka meminjam uang dari pool lain, peretas dengan mudah lulus verifikasi aset jaminan.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-362c84f0ae-dd1a6f-69ad2a.webp)
Pada titik ini, penyerang menginvestasikan total 2000+ 1,8* 60 WBTC di HopeLend untuk memanipulasi liquidityIndex, hanya menyisakan 1 unit hEtthWBTC.
5. Mengeksploitasi titik kerentanan kritis (kesalahan pembagian bilangan bulat) untuk mencairkan uang
Untuk mengambil investasi sebelumnya wBTC, para penyerang mengerahkan kontrak serangan lain: 0x 5 a 63 e ... 844 e 74 dan panggil metode withdrawAllBtc() di sana
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-821db2a3ae-dd1a6f-69ad2a.webp)
Proses kerentanan adalah sebagai berikut:
(1) Setoran pertama 151.200000002 wBTC, menurut indeks likuiditas saat ini (1 unit terkecil hEthWBTC=75.6 wBTC), penyerang mendapat 2 unit terkecil hEthWBTC.
(2) Keluarkan (tarik) 113.4 wBTC, hitung balik bagian hEthWBTC yang sesuai, dan bakar hEthWBTC.
(3) 113.4 wBTC perlu menghancurkan 1.99999999998 unit terkecil hEthWBTC, tetapi karena keakuratan fungsi div, hanya satu unit terkecil hEthWBTC yang dihancurkan, sehingga menjadi kerentanan yang dapat dieksploitasi, dan peretas masih dapat menyimpan 1 unit terkecil hEthWBTC.
Kerentanan kritis
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-7ff70593aa-dd1a6f-69ad2a.webp)
Metode pembakaran hEthWBTC memanggil divisi presisi tinggi rayDiv.
! [CertiK: Analisis Serangan Pinjaman pada Platform Pinjaman Terdesentralisasi HopeLend] (https://img-cdn.gateio.im/webp-social/moments-7f230462a9-8ab92bd200-dd1a6f-69ad2a.webp)
Sini:
a= 11340000000 (WBTC dimaksudkan untuk dihapus)
B = 7560000001000000000000000009655610336 (tingkat diskonto)
Meskipun (a* 1e27+b/2)/b = 1,99999999998, metode div bawaan Solidity memotong dan mengembalikan 1, yang setara dengan 113400000000 / 7560000001 tempat desimal dipotong setelah pembagian.
0x5a63 (Attack Contract - Cash Out) terus menyetor 75.600000001 WBTC persis untuk mendapatkan 1 unit minimum hEthWBTC lagi, sehingga terus memegang 2 unit minimum hEthWBTC.
Dalam loop ini, 113.4000000000 wBTC ditarik dan 75.600000001 wBTC disetorkan, setiap penyerang dapat memperoleh 37,8 wBTC dari udara tipis.
Setelah 58 siklus, penyerang menarik semua wBTC yang diinvestasikan di muka dan dengan lancar mengembalikan pinjaman flash Aave.
Kesimpulan
Karena kumpulan pinjaman hEthWBTC tidak diinisialisasi, penyerang dapat dengan mudah memanipulasi indeks likuiditas untuk meningkatkannya secara maksimal, dan tingkat penarikan sangat diperkuat sebagai pembagi, sehingga lebih mudah untuk mengambil investasi sebelumnya dalam blok karena kesalahan pemotongan pembagian bilangan bulat.
Dalam kumpulan pinjaman yang berfungsi dengan baik, tidak mudah untuk meningkatkan tingkat diskonto secara signifikan karena sedikit kenaikan bunga pinjaman karena likuiditas yang ada di kumpulan.