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

robot
Pembuatan abstrak sedang berlangsung

Analisis Mendalam Kerentanan Tinggi Lainnya pada Bahasa Move

Sebelumnya, kami menemukan kerentanan serius pada Aptos Moveevm, setelah penelitian mendalam, kami juga menemukan kerentanan baru berupa overflow integer. Proses pemicu kerentanan kali ini lebih menarik, di bawah ini kami akan menganalisis kerentanan ini secara mendalam, sekaligus memperkenalkan beberapa pengetahuan latar belakang tentang bahasa Move. Kami percaya bahwa melalui penjelasan dalam artikel ini, Anda akan memiliki pemahaman yang lebih mendalam tentang bahasa Move.

Seperti yang kita ketahui, bahasa Move akan memverifikasi unit kode sebelum mengeksekusi bytecode. Proses verifikasi terdiri dari 4 langkah, dan kerentanan ini muncul dalam langkah reference_safety.

modul reference_safety mendefinisikan fungsi transfer untuk memverifikasi keamanan referensi dari subjek proses. Pemeriksaannya mencakup verifikasi bahwa tidak ada referensi yang menggantung, apakah akses ke referensi yang dapat diubah aman, dan apakah akses ke referensi penyimpanan global aman, dll.

Fungsi entri yang memanggil verifikasi keamanan akan memanggil analyze_function. Di dalam analyze_function, fungsi akan memvalidasi setiap blok dasar. Blok dasar adalah urutan kode yang tidak memiliki instruksi cabang selain titik masuk dan keluar.

Bahasa Move menentukan blok dasar dengan menjelajahi bytecode, mencari semua instruksi cabang dan urutan instruksi loop. Contoh blok dasar kode Move IR yang khas mungkin terdiri dari 3 blok dasar, yang ditentukan oleh instruksi BrTrue, Branch, dan Ret.

Numen Cyber menemukan kerentanan tinggi lainnya pada bahasa move

Keamanan Referensi dalam Move

Mengambil inspirasi dari pemikiran bahasa Rust, Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Referensi tidak dapat diubah digunakan untuk membaca data dari struktur, sementara referensi dapat diubah digunakan untuk memodifikasi data. Penggunaan yang tepat dari jenis referensi membantu menjaga keamanan dan mengenali modul pembacaan.

Modul keamanan referensi Move akan memindai instruksi bytecode blok dasar dalam fungsi, memverifikasi bahwa semua operasi referensi adalah sah. Proses verifikasi terutama melibatkan struktur AbstractState, yang mencakup graf pinjaman dan lokal, digunakan untuk memastikan keamanan referensi dalam fungsi.

Proses verifikasi akan membandingkan state sebelum dan sesudah eksekusi blok dasar, dan menggabungkan hasilnya untuk memperbarui status blok, sambil menyebarkan kondisi pasca blok tersebut ke blok-blok berikutnya. Proses ini mirip dengan pemikiran Sea of Nodes dalam V8 turbofan.

Siklus utama akan mengeksekusi kode blok, lalu mencoba menggabungkan pre state dan post state. Jika status berubah dan blok saat ini memiliki edge mundur yang menunjuk ke dirinya sendiri ( yang menunjukkan adanya siklus ), maka akan melompat kembali ke awal siklus, melanjutkan eksekusi blok dasar ini, sampai post state sama dengan pre state atau terhenti karena kesalahan.

Numen Cyber menemukan celah berbahaya lainnya dalam bahasa move

Analisis Kerentanan

Kelemahan terjadi saat memeriksa apakah hasil join telah berubah. Fungsi join_ digunakan untuk memperbarui variabel lokal dan grafik hubungan pinjaman. Ketika panjang parameter fungsi ditambah panjang variabel lokal melebihi 256, karena variabel lokal adalah tipe u8, akan terjadi overflow saat menelusuri locals.

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

Numen Cyber menemukan celah berbahaya lain dalam bahasa move

Numen Cyber menemukan celah berbahaya lainnya dalam bahasa move

Dari Overflow Tipe Int ke Serangan DoS

Loop utama akan memindai blok kode dan memanggil fungsi execute_block, kemudian menggabungkan state sebelum dan sesudah eksekusi. Ketika ada loop dalam kode, akan melompat kembali ke awal blok kode untuk dieksekusi lagi.

Jika kita membangun blok kode siklik dan memanfaatkan overflow untuk mengubah state blok, sehingga peta locals baru berbeda dari sebelumnya, maka saat menjalankan execute_block lagi, analisis urutan instruksi dalam basic block akan mengakses peta locals baru. Jika pada saat itu indeks yang dibutuhkan oleh instruksi tidak ada dalam peta baru, itu akan menyebabkan DoS.

Dalam modul reference safety, opcode MoveLoc/CopyLoc/FreeRef dapat mencapai tujuan ini. Sebagai contoh, fungsi copy_loc akan mencoba mendapatkan nilai lokal melalui LocalIndex, jika LocalIndex tidak ada maka akan menyebabkan panic, yang mengakibatkan seluruh node crash.

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move

Numen Cyber menemukan kelemahan berbahaya lainnya dalam bahasa move

Numen Cyber menemukan lagi kerentanan tinggi pada bahasa move

Numen Cyber menemukan kerentanan tinggi lain pada bahasa move secara eksklusif

Demo PoC

Kita dapat membangun sebuah basic block yang berisi instruksi cabang tidak bersyarat, sehingga dapat memanggil fungsi execute_block dan join beberapa kali. Dengan mengatur parameter yang sesuai dan jumlah variabel lokal, kita dapat mengurangi panjang locals map yang baru menjadi 8 setelah eksekusi pertama.

Pada eksekusi kedua, mencoba mengakses offset yang tidak ada akan menyebabkan panic, yang dapat memicu DoS.

Numen Cyber menemukan kerentanan tinggi lain pada bahasa move

Numen Cyber menemukan celah berbahaya lain dalam bahasa move

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move

Numen Cyber menemukan celah berbahaya lainnya dalam bahasa move

Numen Cyber menemukan kerentanan tinggi lainnya dalam bahasa move

Numen Cyber menemukan kelemahan berbahaya lainnya dalam bahasa move

Ringkasan

Kerentanan ini menunjukkan bahwa bahkan bahasa Move yang telah melalui pemeriksaan statis yang ketat masih memiliki risiko keamanan. Kerentanan overflow dapat melewati pemeriksaan batas, menyoroti pentingnya audit kode.

Sebagai pemimpin penelitian keamanan bahasa Move, kami menyarankan perancang bahasa untuk menambah lebih banyak kode pemeriksaan di runtime Move, untuk mencegah situasi yang tidak diinginkan. Saat ini, Move melakukan pemeriksaan keamanan terutama pada tahap verifikasi, tetapi tahap eksekusi kekurangan penguatan keamanan yang cukup, yang dapat menyebabkan masalah yang lebih serius.

Kami juga menemukan celah lain dalam bahasa Move, yang akan kami bagikan kepada semua orang di kemudian hari.

Numen Cyber menemukan celah keamanan tinggi lainnya dalam bahasa move

MOVE3.66%
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
ConsensusDissentervip
· 08-05 10:34
Ternyata masih tidak aman
Lihat AsliBalas0
DefiPlaybookvip
· 08-05 10:31
Langkah verifikasi perlu dioptimalkan
Lihat AsliBalas0
MEVHunterWangvip
· 08-05 10:26
Siapa yang mengerti celah, siapa yang menghasilkan banyak uang
Lihat AsliBalas0
tokenomics_truthervip
· 08-05 10:23
Rasanya masih tidak dapat diandalkan
Lihat AsliBalas0
staking_grampsvip
· 08-05 10:05
Move lubang besar yang perlu diisi
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)