Kerentanan Curve pool baru-baru ini berbeda dari insiden peretasan mata uang kripto yang telah kita lihat sebelumnya, karena kali ini masalahnya tidak terkait langsung dengan kerentanan kontrak pintar itu sendiri, namun pada kompiler yang mendasari bahasa pemrograman yang digunakan Vyper.
Vyper adalah bahasa pemrograman berorientasi kontrak pintar yang mengadopsi gaya mirip Python dan dirancang khusus untuk berinteraksi dengan Ethereum Virtual Machine (EVM).
Dampak dari kerentanan ini sangat serius, dan banyak sekali kerugian yang diberitakan di berita setiap hari. Situasi tampaknya terkendali, tetapi peretas mencuri lebih dari $70 juta. Menurut pasca-penilaian LlamaRisk, beberapa kumpulan proyek DeFi juga diserang oleh peretas, termasuk kumpulan pETH/ETH PEGD yang kehilangan US$11 juta, kumpulan msETH/ETH Metronome yang kehilangan US$3,4 juta, dan kumpulan alETH/ETH Alchemix yang kehilangan US$11 juta, 22,6 juta dolar AS, sedangkan kumpulan Curve DAO kehilangan sekitar 24,7 juta dolar AS.
Kerentanan ini disebut kesalahan reentrancy dan terutama muncul di beberapa versi bahasa pemrograman Vyper, khususnya v0.2.15, v0.2.16 dan v0.3.0. Oleh karena itu, proyek yang menggunakan versi spesifik Vyper ini dapat menjadi sasaran serangan.
Apa itu masuk kembali?
Untuk memahami mengapa kerentanan ini terjadi, pertama-tama mari kita pahami apa itu reentrancy dan cara kerjanya.
Yang disebut reentrancy berarti bahwa suatu fungsi dapat diinterupsi selama eksekusi dan dipanggil kembali dengan aman sebelum panggilan sebelumnya selesai. Mekanisme ini sering digunakan dalam aplikasi seperti penanganan interupsi perangkat keras dan rekursi.
Agar suatu fungsi dapat masuk kembali, fungsi tersebut harus memenuhi beberapa kondisi:
Pertama, tidak dapat menggunakan data global dan statis. Ini adalah konvensi, artinya ketika fungsi dijalankan, jangan bergantung pada data global atau variabel statis. Karena jika suatu fungsi terganggu selama eksekusi dan kemudian dipanggil kembali, data global dan statis mungkin rusak atau informasi mungkin hilang.
Kedua, ia tidak dapat mengubah kodenya sendiri. Kapan pun suatu fungsi diinterupsi, fungsi tersebut harus dapat melanjutkan eksekusi dengan cara yang sama. Jika suatu fungsi mengubah kodenya sendiri selama eksekusi, kesalahan mungkin terjadi saat dipanggil kembali.
Terakhir, ia tidak dapat memanggil fungsi lain yang bukan reentrant. Artinya, dalam fungsi reentrant, Anda tidak boleh memanggil fungsi lain yang mungkin bukan reentrant. Karena jika hal ini dilakukan, bisa saja menimbulkan hasil yang tidak terduga sehingga menyebabkan program menjadi crash atau error.
Terlalu sulit untuk dipahami, jadi kami tidak akan membahasnya secara detail.
Bagaimana cara eksploitasinya?
Mari kita jelaskan bagaimana serangan masuk kembali menyebabkan pencurian dana dan kerugian sebesar $70 juta dalam serangan Curve.
Pertama-tama, kita tahu bahwa serangan reentrancy mengacu pada metode di mana kontrak jahat berulang kali memanggil fungsi dalam kontrak pintar. Dalam serangan Curve, fungsi ini digunakan untuk menarik likuiditas pengguna di pool. Fungsi ini memiliki kelemahan yaitu tidak melakukan pemeriksaan yang cukup sebelum memperbarui jumlahnya.
Mari kita lihat proses spesifik serangan tersebut:
Katakanlah kontrak pintar yang rentan memiliki 10 eter.
Penyerang memanggil fungsi deposit dan menyetor 1 Ethereum.
Penyerang kemudian memanggil fungsi penarikan dan bersiap untuk menarik 1 Ethereum. Dalam fungsi ini, ia memeriksa apakah penyerang memiliki 1 Ethereum di akunnya.
Namun, fungsi ini tidak memperbarui saldo dalam kontrak sebelum mentransfer 1 Ether ke akun penyerang. Artinya kontrak masih menganggap ada 10 ether di dalamnya.
Penyerang memanggil fungsi penarikan (entri kembali) lagi dan bersiap untuk menarik 1 Ethereum lagi.
Karena kontrak masih menganggap ada 10 eter di dalamnya, maka akan mentransfer 1 eter lagi ke penyerang.
Proses ini berulang hingga tidak ada lagi likuiditas dalam kontrak.
Dengan cara ini, penyerang dapat berulang kali memanggil fungsi penarikan dan mentransfer hampir seluruh likuiditas dalam kontrak ke akunnya sendiri, menyebabkan dana dalam kontrak dicuri.
Kerentanan ini sangat menguntungkan penyerang karena jumlah dalam kontrak tidak diperbarui secara real time, sehingga memungkinkan penyerang mengulangi serangan hingga tidak ada dana yang tersedia untuk penarikan dalam kontrak. #Crv