Pratinjau gratis10 mnt membaca

Reentrancy: Trik Tertua yang Masih Berhasil

Kontrak yang mengirim uang sebelum memperbarui catatannya sendiri bisa diminta uang itu lagi, di tengah pengiriman. Itulah reentrancy, cacat di balik bencana terkenal pertama dalam sejarah Ethereum, dan sampai sekarang masih menemukan korban.

Mekanismenya

  1. Sebuah kontrak menyimpan saldo para penyetor dan menyediakan fungsi withdraw.
  2. Withdraw mengirim dananya lebih dulu, lalu menetapkan saldo penyetornya menjadi nol.
  3. Mengirim dana ke kontrak lain menyerahkan kendali kepada kode kontrak itu.
  4. Kode itu memanggil withdraw lagi. Saldonya belum dinolkan, jadi pemeriksaannya lolos untuk kedua kali.
  5. Putaran itu berulang sampai kumpulan dananya habis.

Perbaikannya adalah aturan urutan yang dikenal sebagai checks, effects, interactions: validasi lebih dulu, perbarui state Anda sendiri berikutnya, baru berbicara dengan pihak lain paling akhir. Sebuah reentrancy guard, yaitu kunci yang menolak masuknya panggilan kedua selama panggilan pertama masih terbuka, adalah lapisan pengaman tambahan di atas keduanya.

Di mana ini pernah terjadi

  • The DAO, Juni 2016. Sebuah cacat reentrancy menguras sekitar 3,6 juta ETH dari sebuah dana investasi yang dibangun di Ethereum. Responsnya memecah rantainya: mayoritas melakukan fork untuk membalikkan pencurian itu, dan rantai yang menolak berlanjut sampai hari ini sebagai Ethereum Classic.
  • Curve Finance, Juli 2023. Cacatnya bukan pada logika Curve sendiri, melainkan pada versi-versi tertentu dari compiler Vyper, di mana reentrancy guard tidak bekerja sebagaimana tertulis. Beberapa pool terkuras, dengan kerugian yang dilaporkan sekitar 70 juta dolar. Kode yang sudah diaudit tetap bisa dirusak oleh alat yang mengompilasinya.

Mengapa ini masih bertahan

  • Panggilan eksternal apa pun bisa menyerahkan kendali: hook transfer token, callback, dan standar token yang lebih baru yang memberi tahu penerimanya.
  • Reentrancy read-only lebih halus. Penyerang masuk kembali ke sebuah fungsi view saat state baru setengah diperbarui, sehingga protokol lain membaca harga atau saldo yang salah lalu bertindak atas dasar itu.
  • Reentrancy antar fungsi memakai fungsi lain yang berbagi state yang sama, jadi guard pada satu fungsi saja tidak cukup.

Apa yang benar-benar mencegahnya

  • Checks, effects, interactions, diterapkan di mana-mana, bukan hanya pada fungsi withdraw yang sudah jelas.
  • Reentrancy guard pada setiap titik masuk yang mengubah state dan melakukan panggilan eksternal.
  • Memperlakukan setiap token sebagai kode yang bermusuhan, karena kontrak token menjalankan logikanya sendiri selama sebuah transfer.
  • Pengujian yang memanggil kembali ke dalam kontrak dari penerima yang jahat, karena begitulah hal ini ditemukan sebelum peluncuran.
Ini edukasi, bukan nasihat keuangan. Tidak ada apa pun di sini yang merupakan rekomendasi untuk memakai atau menghindari protokol mana pun.
Reentrancy: Trik Tertua yang Masih Berhasil · Crypto Academy