Kelemahan integer overflow pada smart contract: Penjelasan langkah-langkah perlindungan

robot
Pembuatan abstrak sedang berlangsung

Kerentanan Overflow Bilangan Bulat dan Perlindungannya

Overflow bilangan bulat adalah masalah umum dalam pemrograman. Dalam sebagian besar bahasa pemrograman, nilai bilangan bulat disimpan dalam memori dengan panjang tetap. Bilangan bulat dibedakan menjadi dua jenis: bilangan bulat tanpa tanda dan bilangan bulat dengan tanda, perbedaannya terletak pada apakah bit tertinggi digunakan sebagai bit tanda. Misalnya, memori 32-bit dapat menyimpan bilangan bulat tanpa tanda dalam rentang 0 hingga 4.294.967.295 (uint32), atau bilangan bulat dengan tanda dalam rentang -2.147.483.648 hingga 2.147.483.647 (int32).

Ketika hasil perhitungan melebihi rentang yang dapat diwakili oleh tipe integer, overflow akan terjadi. Sebagian besar bahasa pemrograman dan compiler tidak memeriksa jenis kesalahan ini, tetapi hanya melakukan operasi modulus atau menghasilkan perilaku yang tidak terdefinisi. Ini dapat menyebabkan hasil eksekusi program yang tidak terduga. Dalam penulisan kontrak pintar blockchain, terutama di bidang keuangan terdesentralisasi, perhitungan integer sangat umum, sehingga perlu memperhatikan celah overflow integer dengan hati-hati.

Overflow bilangan bulat dapat dibagi menjadi dua situasi: overflow atas dan overflow bawah:

  1. Overflow: Hasil perhitungan melebihi nilai maksimum yang dapat diwakili oleh tipe. Misalnya, uint32 0xFFFFFFFF ditambah 1 akan menjadi 0x00000000.

  2. Underflow: Hasil perhitungan kurang dari nilai minimum yang dapat diwakili oleh tipe tersebut. Misalnya, 0 dari uint32 dikurangi 1 akan menjadi 0xFFFFFFFF.

Pada bulan April 2018, kontrak token BeautyChain(BEC) diserang karena kerentanan overflow integer, yang memungkinkan penyerang untuk memperoleh sejumlah besar token. Kerentanan ini muncul dalam fungsi batchTransfer, di mana tidak ada pemeriksaan overflow perkalian, sehingga memungkinkan untuk mentransfer sejumlah besar token dengan saldo token yang sangat sedikit.

Untuk mencegah overflow integer, langkah-langkah berikut dapat diambil:

  1. Konfigurasi opsi kompilasi Rust, periksa overflow integer dan picu panic bahkan dalam mode release.

  2. Gunakan uint crate untuk mendukung tipe bilangan bulat yang lebih besar, seperti U256, U512, dll.

  3. Gunakan fungsi konversi tipe uint untuk mendeteksi overflow, seperti as_u128().

  4. Gunakan fungsi Safe Math seperti checked_add() untuk memeriksa apakah perhitungan mengalami overflow.

Dengan metode ini, Anda dapat secara efektif menghindari kerentanan overflow integer dan meningkatkan keamanan kontrak pintar. Saat menulis kontrak yang melibatkan perhitungan angka besar, sangat penting untuk menangani masalah overflow integer dengan hati-hati.

SAFE-0.37%
MATH-7.18%
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.
  • Hadiah
  • 5
  • Bagikan
Komentar
0/400
AirdropHunterXiaovip
· 9jam yang lalu
Overflow? Akan diklip kupon nih
Lihat AsliBalas0
gas_guzzlervip
· 10jam yang lalu
Sebelum pengembangan, ingat untuk menyesuaikan overflow ya saudara-saudara.
Lihat AsliBalas0
0xInsomniavip
· 10jam yang lalu
Overflow telah menghancurkan banyak suckers
Lihat AsliBalas0
AirdropHunterZhangvip
· 10jam yang lalu
Laut di dalam laut, orang yang memanfaatkan tanpa bayar merasa pusing.
Lihat AsliBalas0
0xOverleveragedvip
· 10jam yang lalu
Istri saya sudah tidak ada lagi
Lihat AsliBalas0
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)