Analisis kerentanan integer overflow dalam bahasa Move: dari keamanan referensi ke serangan DoS

robot
Pembuatan abstrak sedang berlangsung

Analisis Kerentanan Overflow Integer dalam Bahasa Move

Pendahuluan

Setelah melakukan penelitian mendalam tentang Aptos Moveevm, kami menemukan kerentanan overflow integer baru. Proses pemicu kerentanan ini cukup menarik, di bawah ini kami akan menganalisis kerentanan ini secara mendalam dan memperkenalkan beberapa pengetahuan latar belakang tentang bahasa Move. Melalui penjelasan dalam artikel ini, kami yakin Anda akan memiliki pemahaman yang lebih dalam tentang bahasa Move.

Bahasa Move akan memverifikasi unit kode sebelum mengeksekusi bytecode. Proses verifikasi dibagi menjadi 4 langkah, dan kerentanan ini muncul pada langkah reference_safety.

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move secara eksklusif

Keamanan Referensi dalam Move

Bahasa Move mendukung dua jenis referensi: referensi tidak berubah (&) dan referensi berubah (&mut). Referensi tidak berubah digunakan untuk membaca data dari struktur, sementara referensi berubah digunakan untuk memodifikasi data. Menggunakan jenis referensi yang tepat membantu menjaga keamanan dan mengidentifikasi modul pembacaan.

Dalam modul keamanan referensi Move, instruksi byte dari blok dasar dalam fungsi akan dipindai per unit fungsi untuk memverifikasi semua operasi referensi adalah sah. Proses utama untuk memverifikasi keamanan referensi mencakup langkah-langkah seperti mengeksekusi blok dasar, menghasilkan status pasca, menggabungkan status sebelumnya dan sesudah, dll.

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move yang eksklusif

Analisis Kerentanan

Kerentanan muncul dalam fungsi join_ yang mengacu pada modul keamanan. Ketika jumlah panjang parameter fungsi dan panjang variabel lokal lebih besar dari 256, penggunaan tipe u8 untuk merepresentasikan variabel lokal dapat menyebabkan overflow integer.

Meskipun Move memiliki proses untuk memverifikasi jumlah locals, modul check bounds hanya memverifikasi locals dan tidak termasuk panjang parameter. Sepertinya pengembang menyadari perlunya memeriksa jumlah parameter dan nilai lokal, tetapi kode hanya memverifikasi jumlah variabel lokal.

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move

Dari overflow integer ke serangan DoS

Dengan memanfaatkan kerentanan integer overflow ini, penyerang dapat membuat blok kode loop yang mengubah status blok. Ketika fungsi execute_block dijalankan lagi, jika indeks yang perlu diakses oleh instruksi tidak ada dalam peta locals AbstractState yang baru, akan menyebabkan serangan DoS.

Dalam modul reference safety, opcode seperti MoveLoc/CopyLoc/FreeRef dapat memicu situasi ini. Misalnya, dalam fungsi copy_loc, jika LocalIndex tidak ada, maka akan menyebabkan panic, yang selanjutnya menyebabkan seluruh node crash.

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move

Reproduksi Kerentanan

Anda dapat mereproduksi kerentanan ini di git dengan kode PoC berikut:

gerakkan public fun test(a: u64, b: u64, c: u64, d: u64) { let x = 0; loop { jika (x == 1) { istirahat }; x = x + 1; } }

Langkah-langkah untuk memicu DoS adalah sebagai berikut:

  1. Pertama kali mengeksekusi fungsi execute_block, mengatur parameters dan locals keduanya menjadi SignatureIndex(0), yang mengakibatkan num_locals menjadi 264. Setelah menjalankan fungsi join_, panjang map locals baru menjadi 8.

  2. Saat fungsi execute_block dieksekusi untuk kedua kalinya, instruksi pertama dari kode move yang dieksekusi adalah copyloc(57). Karena pada saat ini locals hanya memiliki panjang 8, offset 57 tidak ada, yang menyebabkan fungsi get(57).unwrap() mengembalikan None, yang akhirnya menyebabkan panic.

Numen Cyber menemukan celah keamanan tinggi lainnya dalam bahasa move

Numen Cyber menemukan kerentanan serius lainnya pada bahasa move

Numen Cyber menemukan celah keamanan tinggi lain pada bahasa move

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move

Numen Cyber menemukan celah keamanan tinggi lainnya dalam bahasa move

Penemuan eksklusif Numen Cyber, satu lagi kerentanan tinggi dalam bahasa move

Numen Cyber menemukan lagi celah berbahaya dalam bahasa move

Numen Cyber menemukan celah berbahaya lainnya dalam bahasa move

Numen Cyber menemukan celah berbahaya lainnya di bahasa move

Numen Cyber menemukan celah berbahaya lain dalam bahasa move secara eksklusif

Ringkasan

Kerentanan ini menunjukkan bahwa tidak ada kode yang sepenuhnya aman. Meskipun bahasa Move melakukan pemeriksaan statis sebelum eksekusi kode, masih mungkin untuk dilalui oleh kerentanan overflow. Ini sekali lagi menekankan pentingnya audit kode.

Untuk bahasa Move, kami menyarankan untuk menambahkan lebih banyak kode pemeriksaan saat runtime untuk mencegah situasi yang tidak diinginkan. Saat ini, Move terutama melakukan pemeriksaan keamanan di tahap verifikasi, tetapi begitu verifikasi dilewati, kurangnya penguatan keamanan yang memadai di tahap eksekusi dapat menyebabkan masalah yang lebih serius.

Sebagai pemimpin penelitian keamanan bahasa Move, kami akan terus mendalami masalah keamanan Move dan membagikan lebih banyak temuan di masa mendatang.

Numen Cyber menemukan celah berbahaya lainnya dalam bahasa move

MOVE2.73%
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
  • 4
  • Posting ulang
  • Bagikan
Komentar
0/400
PretendingToReadDocsvip
· 08-15 17:34
move ini juga bisa bermasalah
Lihat AsliBalas0
WalletDetectivevip
· 08-14 07:06
Setelah diperhatikan, celah ini cukup menarik.
Lihat AsliBalas0
ponzi_poetvip
· 08-14 07:00
apakah itu tulus atau hanya untuk menghasilkan uang move overflow
Lihat AsliBalas0
ForkTonguevip
· 08-14 06:52
Terus menulis bug keamanan, ya?
Lihat AsliBalas0
  • Sematkan
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)