Modul keamanan referensi bahasa Move menemukan kerentanan integer overflow baru
Baru-baru ini, saat melakukan penelitian mendalam tentang bahasa Move, ditemukan sebuah kerentanan overflow integer baru. Kerentanan ini terdapat dalam modul verifikasi keamanan referensi, dan proses pemicunya cukup menarik. Artikel ini akan menganalisis kerentanan ini secara mendalam, sambil memperkenalkan pengetahuan latar belakang terkait bahasa Move.
Bahasa Move akan memverifikasi unit kode sebelum mengeksekusi bytecode, dan seluruh proses verifikasi dibagi menjadi 4 langkah. Kerentanan yang ditemukan kali ini muncul di langkah reference_safety.
Modul verifikasi keamanan mengacu pada memeriksa apakah ada referensi yang mengambang, apakah akses referensi yang dapat diubah aman, dan apakah akses referensi penyimpanan global aman, dll. Proses verifikasi dimulai dari fungsi analyze_function, yang memverifikasi setiap blok dasar.
Dalam bahasa Move, blok dasar merujuk pada urutan kode yang tidak memiliki instruksi percabangan kecuali untuk masuk dan keluar. Sistem menentukan blok dasar dengan menjelajahi bytecode dan mencari semua urutan instruksi percabangan dan instruksi loop.
Bahasa Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Modul keamanan referensi akan memindai instruksi bytecode di setiap blok dasar dalam fungsi, untuk menentukan apakah semua operasi referensi adalah sah. Proses verifikasi menggunakan struktur AbstractState, yang mencakup dua komponen yaitu borrow graph dan locals, untuk memastikan keamanan referensi dalam fungsi.
Selama proses verifikasi, sistem akan mengeksekusi kode blok dasar untuk menghasilkan post state, kemudian menggabungkan pre state dan post state untuk memperbarui status blok. Jika status berubah dan terdapat siklus, maka blok dasar tersebut akan dieksekusi ulang sampai post state sama dengan pre state atau terjadi kesalahan.
Kerentanan muncul di dalam fungsi join_. Ketika panjang parameter ditambah panjang variabel lokal melebihi 256, penggunaan tipe u8 untuk iterasi locals akan menyebabkan overflow integer. Meskipun bahasa Move memiliki proses untuk memverifikasi jumlah locals, hanya jumlah variabel lokal yang diperiksa, dan tidak termasuk panjang parameter.
Overflow integer ini dapat menyebabkan serangan penolakan layanan. Penyerang dapat membangun blok kode loop yang memanfaatkan overflow untuk mengubah state blok. Ketika fungsi execute_block dijalankan lagi, jika indeks yang perlu diakses oleh instruksi tidak ada dalam peta locals AbstractState yang baru, itu akan menyebabkan sistem crash.
Untuk mendemonstrasikan kerentanan ini, kita dapat membangun blok dasar yang berisi instruksi cabang tanpa syarat. Dengan mengatur parameter yang tepat dan jumlah variabel lokal, kita dapat menyebabkan panjang peta locals meluap menjadi 8. Pada eksekusi kedua, mencoba mengakses offset yang tidak ada akan menyebabkan panic.
Kerentanan ini mengingatkan kita bahwa bahkan bahasa yang dirancang dengan hati-hati pun mungkin memiliki risiko keamanan. Untuk bahasa Move, disarankan untuk menambahkan lebih banyak kode pemeriksaan saat runtime untuk mencegah situasi tak terduga. Saat ini, Move utama melakukan pemeriksaan keamanan pada tahap verifikasi, tetapi jika verifikasi dilewati, bisa menyebabkan masalah yang lebih serius.
Sebagai pelopor penelitian keamanan bahasa Move, kami akan terus menjelajahi masalah keamanan terkait untuk berkontribusi pada perkembangan sehat ekosistem Move.
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.
Modul keamanan referensi Move menemukan kerentanan overflow integer baru
Modul keamanan referensi bahasa Move menemukan kerentanan integer overflow baru
Baru-baru ini, saat melakukan penelitian mendalam tentang bahasa Move, ditemukan sebuah kerentanan overflow integer baru. Kerentanan ini terdapat dalam modul verifikasi keamanan referensi, dan proses pemicunya cukup menarik. Artikel ini akan menganalisis kerentanan ini secara mendalam, sambil memperkenalkan pengetahuan latar belakang terkait bahasa Move.
Bahasa Move akan memverifikasi unit kode sebelum mengeksekusi bytecode, dan seluruh proses verifikasi dibagi menjadi 4 langkah. Kerentanan yang ditemukan kali ini muncul di langkah reference_safety.
Modul verifikasi keamanan mengacu pada memeriksa apakah ada referensi yang mengambang, apakah akses referensi yang dapat diubah aman, dan apakah akses referensi penyimpanan global aman, dll. Proses verifikasi dimulai dari fungsi analyze_function, yang memverifikasi setiap blok dasar.
Dalam bahasa Move, blok dasar merujuk pada urutan kode yang tidak memiliki instruksi percabangan kecuali untuk masuk dan keluar. Sistem menentukan blok dasar dengan menjelajahi bytecode dan mencari semua urutan instruksi percabangan dan instruksi loop.
Bahasa Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Modul keamanan referensi akan memindai instruksi bytecode di setiap blok dasar dalam fungsi, untuk menentukan apakah semua operasi referensi adalah sah. Proses verifikasi menggunakan struktur AbstractState, yang mencakup dua komponen yaitu borrow graph dan locals, untuk memastikan keamanan referensi dalam fungsi.
Selama proses verifikasi, sistem akan mengeksekusi kode blok dasar untuk menghasilkan post state, kemudian menggabungkan pre state dan post state untuk memperbarui status blok. Jika status berubah dan terdapat siklus, maka blok dasar tersebut akan dieksekusi ulang sampai post state sama dengan pre state atau terjadi kesalahan.
Kerentanan muncul di dalam fungsi join_. Ketika panjang parameter ditambah panjang variabel lokal melebihi 256, penggunaan tipe u8 untuk iterasi locals akan menyebabkan overflow integer. Meskipun bahasa Move memiliki proses untuk memverifikasi jumlah locals, hanya jumlah variabel lokal yang diperiksa, dan tidak termasuk panjang parameter.
Overflow integer ini dapat menyebabkan serangan penolakan layanan. Penyerang dapat membangun blok kode loop yang memanfaatkan overflow untuk mengubah state blok. Ketika fungsi execute_block dijalankan lagi, jika indeks yang perlu diakses oleh instruksi tidak ada dalam peta locals AbstractState yang baru, itu akan menyebabkan sistem crash.
Untuk mendemonstrasikan kerentanan ini, kita dapat membangun blok dasar yang berisi instruksi cabang tanpa syarat. Dengan mengatur parameter yang tepat dan jumlah variabel lokal, kita dapat menyebabkan panjang peta locals meluap menjadi 8. Pada eksekusi kedua, mencoba mengakses offset yang tidak ada akan menyebabkan panic.
Kerentanan ini mengingatkan kita bahwa bahkan bahasa yang dirancang dengan hati-hati pun mungkin memiliki risiko keamanan. Untuk bahasa Move, disarankan untuk menambahkan lebih banyak kode pemeriksaan saat runtime untuk mencegah situasi tak terduga. Saat ini, Move utama melakukan pemeriksaan keamanan pada tahap verifikasi, tetapi jika verifikasi dilewati, bisa menyebabkan masalah yang lebih serius.
Sebagai pelopor penelitian keamanan bahasa Move, kami akan terus menjelajahi masalah keamanan terkait untuk berkontribusi pada perkembangan sehat ekosistem Move.