Analisis Serangan Re-entrance Pinjaman Flash pada Proyek Jarvis Network
Pada 15 Januari 2023, proyek Jarvis_Network diserang, mengakibatkan 663.101 MATIC dicuri. Peristiwa ini memicu perhatian terhadap keamanan proyek.
Melalui analisis tumpukan panggilan transaksi, ditemukan bahwa penyerang memanfaatkan kerentanan reentrancy. Dalam proses reentrancy, meskipun parameter input sama, panggilan fungsi yang sama pada kontrak yang sama memiliki perbedaan signifikan dalam nilai kembali. Perbedaan ini terutama terjadi pada fungsi remove_liquidity.
Serangan reentrancy terutama menargetkan fungsi remove_liquidity dari kontrak pintar tertentu. Fungsi ini akan mengembalikan token yang ditambahkan pengguna saat menghapus likuiditas. Karena kesetaraan antara Polygon dan rantai EVM, logika reentrancy terpicu saat MATIC ditransfer ke kontrak.
Analisis lebih lanjut menunjukkan bahwa masalah terletak pada implementasi fungsi getUnderlyingPrice. Fungsi ini melibatkan beberapa kontrak yang tidak diopen-source, yang meningkatkan kesulitan analisis. Namun, dengan memeriksa slot penyimpanan dan tumpukan panggilan, kita dapat menyimpulkan nilai variabel kunci dan jalur panggilan fungsi.
Inti dari serangan terletak pada nilai kembali dari fungsi get_virtual_price yang mengalami perubahan signifikan sebelum dan sesudah reentrancy. Perubahan ini terkait dengan waktu pembaruan variabel self.D. Dalam kondisi normal, self.D seharusnya diperbarui setelah transfer selesai, tetapi dalam serangan ini, karena terjadinya reentrancy, menyebabkan kesalahan dalam perhitungan harga.
Proses eksekusi fungsi remove_liquidity meliputi: 1) menghancurkan token LP pengguna; 2) mengirimkan dana yang dipertaruhkan kepada pengguna; 3) memperbarui nilai self.D. Penyerang melakukan reentrancy pada langkah kedua, memanfaatkan nilai self.D yang belum diperbarui untuk meminjam, sehingga memperoleh keuntungan yang tidak sah.
Perlu dicatat bahwa meskipun fungsi remove_liquidity menggunakan dekorator @nonreentrant('lock') untuk mencegah reentrancy, karena penyerang yang melakukan reentrancy memasuki kontrak lain untuk meminjam, kunci reentrancy ini tidak berfungsi seperti yang diharapkan.
Serangan kali ini mengungkapkan pentingnya waktu pembaruan variabel dalam kontrak pintar. Untuk meningkatkan keamanan, disarankan agar pihak proyek mengambil langkah-langkah berikut:
Melakukan audit keamanan yang ketat
Pastikan modifikasi variabel selesai sebelum pemanggilan eksternal
Menggunakan metode multi-sumber data untuk mendapatkan informasi harga
Tulis kode mengikuti pola "Pemeriksaan-Efek-Interaksi" (Checks-Effects-Interactions)
Dengan menerapkan praktik terbaik ini, keamanan dan stabilitas kontrak pintar dapat meningkat secara signifikan, menyediakan infrastruktur yang lebih andal untuk ekosistem Web3.
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.
Jarvis Network mengalami serangan reentrancy pinjaman flash, 663,101 MATIC dicuri
Analisis Serangan Re-entrance Pinjaman Flash pada Proyek Jarvis Network
Pada 15 Januari 2023, proyek Jarvis_Network diserang, mengakibatkan 663.101 MATIC dicuri. Peristiwa ini memicu perhatian terhadap keamanan proyek.
Melalui analisis tumpukan panggilan transaksi, ditemukan bahwa penyerang memanfaatkan kerentanan reentrancy. Dalam proses reentrancy, meskipun parameter input sama, panggilan fungsi yang sama pada kontrak yang sama memiliki perbedaan signifikan dalam nilai kembali. Perbedaan ini terutama terjadi pada fungsi remove_liquidity.
Serangan reentrancy terutama menargetkan fungsi remove_liquidity dari kontrak pintar tertentu. Fungsi ini akan mengembalikan token yang ditambahkan pengguna saat menghapus likuiditas. Karena kesetaraan antara Polygon dan rantai EVM, logika reentrancy terpicu saat MATIC ditransfer ke kontrak.
Analisis lebih lanjut menunjukkan bahwa masalah terletak pada implementasi fungsi getUnderlyingPrice. Fungsi ini melibatkan beberapa kontrak yang tidak diopen-source, yang meningkatkan kesulitan analisis. Namun, dengan memeriksa slot penyimpanan dan tumpukan panggilan, kita dapat menyimpulkan nilai variabel kunci dan jalur panggilan fungsi.
Inti dari serangan terletak pada nilai kembali dari fungsi get_virtual_price yang mengalami perubahan signifikan sebelum dan sesudah reentrancy. Perubahan ini terkait dengan waktu pembaruan variabel self.D. Dalam kondisi normal, self.D seharusnya diperbarui setelah transfer selesai, tetapi dalam serangan ini, karena terjadinya reentrancy, menyebabkan kesalahan dalam perhitungan harga.
Proses eksekusi fungsi remove_liquidity meliputi: 1) menghancurkan token LP pengguna; 2) mengirimkan dana yang dipertaruhkan kepada pengguna; 3) memperbarui nilai self.D. Penyerang melakukan reentrancy pada langkah kedua, memanfaatkan nilai self.D yang belum diperbarui untuk meminjam, sehingga memperoleh keuntungan yang tidak sah.
Perlu dicatat bahwa meskipun fungsi remove_liquidity menggunakan dekorator @nonreentrant('lock') untuk mencegah reentrancy, karena penyerang yang melakukan reentrancy memasuki kontrak lain untuk meminjam, kunci reentrancy ini tidak berfungsi seperti yang diharapkan.
Serangan kali ini mengungkapkan pentingnya waktu pembaruan variabel dalam kontrak pintar. Untuk meningkatkan keamanan, disarankan agar pihak proyek mengambil langkah-langkah berikut:
Dengan menerapkan praktik terbaik ini, keamanan dan stabilitas kontrak pintar dapat meningkat secara signifikan, menyediakan infrastruktur yang lebih andal untuk ekosistem Web3.