Analisis Serangan Re-entrancy Pinjaman Flash pada Proyek Jarvis Network
Pada 15 Januari 2023, proyek Jarvis_Network mengalami serangan di jaringan Polygon, mengakibatkan kerugian sekitar 663.000 MATIC. Analisis menunjukkan bahwa penyerang memanfaatkan Pinjaman Flash dan kerentanan re-entrance untuk melakukan serangan.
Analisis tumpukan panggilan transaksi serangan menunjukkan bahwa selama proses reentrancy, saat memanggil fungsi yang sama pada kontrak yang sama, parameter yang dimasukkan sama tetapi nilai yang dikembalikan memiliki perbedaan yang signifikan. Nilai yang dikembalikan sebelum dan sesudah reentrancy masing-masing adalah:
Sebelum masuk kembali: 1002157321772769944
Re-enter setelah: 10091002696492234934
Reentrancy terjadi dalam fungsi remove_liquidity. Fungsi ini akan mengembalikan token yang ditambahkan pengguna saat menghapus likuiditas. Karena Polygon kompatibel dengan EVM, reentrancy dipicu saat MATIC ditransfer ke kontrak.
Analisis mendalam menunjukkan bahwa masalah terletak pada implementasi fungsi getUnderlyingPrice. Fungsi ini melibatkan serangkaian perhitungan internal dan panggilan eksternal, di mana kuncinya adalah nilai kembali dari fungsi get_virtual_price. Nilai kembali dari fungsi ini dipengaruhi oleh variabel self.D, dan pembaruan self.D terjadi setelah transfer token.
Penyerang saat menghapus likuiditas, MATIC dipindahkan ke kontrak penyerang, kemudian melalui callback terlebih dahulu memeriksa harga token. Karena self.D belum diperbarui, menyebabkan kesalahan dalam mendapatkan harga. Penyerang memanfaatkan selisih waktu ini, pada saat reentrance menaikkan harga pinjaman sekitar 10 kali lipat.
Meskipun fungsi remove_liquidity menggunakan dekorator @nonreentrant('lock') untuk mencegah reentrancy, penyerang berhasil melewati mekanisme perlindungan ini melalui reentrancy antar kontrak.
Serangan kali ini mengungkapkan beberapa masalah kunci:
Logika modifikasi variabel terletak setelah panggilan eksternal, menyebabkan anomali dalam pengambilan harga.
Reentrancy lintas kontrak membuat kunci reentrancy tidak berlaku.
Tidak mengikuti pola "Pemeriksaan - Efek - Interaksi" (Checks-Effects-Interactions).
Untuk mencegah serangan serupa, disarankan kepada pihak proyek:
Melakukan audit keamanan yang ketat
Tempatkan modifikasi variabel sebelum pemanggilan eksternal
Menggunakan metode multi-sumber data untuk mendapatkan harga
Mengikuti spesifikasi pengkodean "Pemeriksaan-Validasi-Interaksi"
Dengan langkah-langkah ini, keamanan dan stabilitas proyek dapat ditingkatkan secara signifikan.
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 dengan kerugian 66,3 ribu MATIC
Analisis Serangan Re-entrancy Pinjaman Flash pada Proyek Jarvis Network
Pada 15 Januari 2023, proyek Jarvis_Network mengalami serangan di jaringan Polygon, mengakibatkan kerugian sekitar 663.000 MATIC. Analisis menunjukkan bahwa penyerang memanfaatkan Pinjaman Flash dan kerentanan re-entrance untuk melakukan serangan.
Analisis tumpukan panggilan transaksi serangan menunjukkan bahwa selama proses reentrancy, saat memanggil fungsi yang sama pada kontrak yang sama, parameter yang dimasukkan sama tetapi nilai yang dikembalikan memiliki perbedaan yang signifikan. Nilai yang dikembalikan sebelum dan sesudah reentrancy masing-masing adalah:
Reentrancy terjadi dalam fungsi remove_liquidity. Fungsi ini akan mengembalikan token yang ditambahkan pengguna saat menghapus likuiditas. Karena Polygon kompatibel dengan EVM, reentrancy dipicu saat MATIC ditransfer ke kontrak.
Analisis mendalam menunjukkan bahwa masalah terletak pada implementasi fungsi getUnderlyingPrice. Fungsi ini melibatkan serangkaian perhitungan internal dan panggilan eksternal, di mana kuncinya adalah nilai kembali dari fungsi get_virtual_price. Nilai kembali dari fungsi ini dipengaruhi oleh variabel self.D, dan pembaruan self.D terjadi setelah transfer token.
Penyerang saat menghapus likuiditas, MATIC dipindahkan ke kontrak penyerang, kemudian melalui callback terlebih dahulu memeriksa harga token. Karena self.D belum diperbarui, menyebabkan kesalahan dalam mendapatkan harga. Penyerang memanfaatkan selisih waktu ini, pada saat reentrance menaikkan harga pinjaman sekitar 10 kali lipat.
Meskipun fungsi remove_liquidity menggunakan dekorator @nonreentrant('lock') untuk mencegah reentrancy, penyerang berhasil melewati mekanisme perlindungan ini melalui reentrancy antar kontrak.
Serangan kali ini mengungkapkan beberapa masalah kunci:
Untuk mencegah serangan serupa, disarankan kepada pihak proyek:
Dengan langkah-langkah ini, keamanan dan stabilitas proyek dapat ditingkatkan secara signifikan.