Modul keamanan referensi bahasa Move menemukan kerentanan overflow integer baru
Baru-baru ini, saat melakukan penelitian mendalam tentang bahasa Move, kami menemukan sebuah kerentanan overflow integer baru. Kerentanan ini ada dalam proses verifikasi keamanan referensi, dan proses pemicunya cukup menarik. Artikel ini akan menganalisis kerentanan ini secara mendalam dan membahas beberapa pengetahuan latar belakang tentang bahasa Move.
Bahasa Move melakukan verifikasi unit kode sebelum mengeksekusi bytecode, yang dibagi menjadi empat langkah. Kerentanan ini muncul pada langkah reference_safety. Langkah ini bertanggung jawab untuk memverifikasi keamanan referensi, termasuk memeriksa apakah ada referensi yang mengambang, apakah akses referensi yang dapat diubah aman, apakah akses referensi penyimpanan global aman, dan sebagainya.
Fungsi entri yang memanggil verifikasi keamanan akan memanggil analyze_function untuk memverifikasi setiap blok dasar. Blok dasar adalah urutan kode yang tidak memiliki instruksi cabang selain entri dan keluaran. Bahasa Move mengidentifikasi blok dasar dengan menjelajahi bytecode dan mencari semua instruksi cabang dan urutan instruksi loop.
Bahasa Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Modul keamanan referensi memvalidasi semua operasi referensi dengan memindai instruksi bytecode dari blok dasar dalam fungsi. Proses validasi menggunakan struktur AbstractState, yang mencakup grafik pinjaman dan lokal, untuk memastikan keamanan referensi dalam fungsi.
Kerentanan terjadi di dalam fungsi join_. Ketika panjang parameter ditambah panjang variabel lokal melebihi 256, karena fungsi iter_locals() mengembalikan iterator tipe u8, akan menyebabkan overflow integer. Meskipun Move memiliki proses pemeriksaan jumlah locals, tetapi dalam modul check bounds hanya memeriksa locals, tanpa memasukkan panjang parameter.
Overflow integer ini dapat menyebabkan serangan penolakan layanan (DoS). Ketika ada blok kode yang berulang dan memanfaatkan overflow untuk mengubah state blok, peta locals baru akan berbeda dari sebelumnya. Saat fungsi execute_block dijalankan kembali, jika indeks yang diperlukan oleh instruksi tidak ada dalam peta locals AbstractState yang baru, ini akan menyebabkan DoS.
Kami telah menyediakan PoC yang dapat direproduksi di git. Blok kode dalam PoC ini berisi instruksi cabang tanpa syarat, yang setiap kali mengeksekusi instruksi terakhir akan melompat kembali ke instruksi pertama, sehingga memanggil fungsi execute_block dan join berkali-kali.
Kekurangan ini menunjukkan bahwa bahkan bahasa yang mementingkan keamanan seperti Move dapat memiliki celah keamanan. Pentingnya audit kode tidak dapat dipungkiri, programmer tidak bisa terhindar dari kelalaian. Sebagai pemimpin dalam penelitian keamanan bahasa Move, kami akan terus menyelidiki masalah keamanan Move.
Kami menyarankan perancang bahasa Move untuk menambahkan lebih banyak kode pemeriksaan saat runtime, untuk mencegah situasi yang tidak terduga. Saat ini, Move terutama melakukan pemeriksaan keamanan pada tahap verifikasi, tetapi ini mungkin masih tidak cukup. Setelah verifikasi dilalui, kurangnya penguatan keamanan yang memadai pada tahap eksekusi dapat menyebabkan masalah yang lebih serius.
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.
10 Suka
Hadiah
10
5
Posting ulang
Bagikan
Komentar
0/400
GasFeeWhisperer
· 22jam yang lalu
move sudah crash lagi
Lihat AsliBalas0
StopLossMaster
· 22jam yang lalu
Jadi itu adalah lubang yang digali oleh orang sendiri.
Modul keamanan referensi bahasa Move menemukan kerentanan overflow integer yang dapat menyebabkan serangan DoS
Modul keamanan referensi bahasa Move menemukan kerentanan overflow integer baru
Baru-baru ini, saat melakukan penelitian mendalam tentang bahasa Move, kami menemukan sebuah kerentanan overflow integer baru. Kerentanan ini ada dalam proses verifikasi keamanan referensi, dan proses pemicunya cukup menarik. Artikel ini akan menganalisis kerentanan ini secara mendalam dan membahas beberapa pengetahuan latar belakang tentang bahasa Move.
Bahasa Move melakukan verifikasi unit kode sebelum mengeksekusi bytecode, yang dibagi menjadi empat langkah. Kerentanan ini muncul pada langkah reference_safety. Langkah ini bertanggung jawab untuk memverifikasi keamanan referensi, termasuk memeriksa apakah ada referensi yang mengambang, apakah akses referensi yang dapat diubah aman, apakah akses referensi penyimpanan global aman, dan sebagainya.
Fungsi entri yang memanggil verifikasi keamanan akan memanggil analyze_function untuk memverifikasi setiap blok dasar. Blok dasar adalah urutan kode yang tidak memiliki instruksi cabang selain entri dan keluaran. Bahasa Move mengidentifikasi blok dasar dengan menjelajahi bytecode dan mencari semua instruksi cabang dan urutan instruksi loop.
Bahasa Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Modul keamanan referensi memvalidasi semua operasi referensi dengan memindai instruksi bytecode dari blok dasar dalam fungsi. Proses validasi menggunakan struktur AbstractState, yang mencakup grafik pinjaman dan lokal, untuk memastikan keamanan referensi dalam fungsi.
Kerentanan terjadi di dalam fungsi join_. Ketika panjang parameter ditambah panjang variabel lokal melebihi 256, karena fungsi iter_locals() mengembalikan iterator tipe u8, akan menyebabkan overflow integer. Meskipun Move memiliki proses pemeriksaan jumlah locals, tetapi dalam modul check bounds hanya memeriksa locals, tanpa memasukkan panjang parameter.
Overflow integer ini dapat menyebabkan serangan penolakan layanan (DoS). Ketika ada blok kode yang berulang dan memanfaatkan overflow untuk mengubah state blok, peta locals baru akan berbeda dari sebelumnya. Saat fungsi execute_block dijalankan kembali, jika indeks yang diperlukan oleh instruksi tidak ada dalam peta locals AbstractState yang baru, ini akan menyebabkan DoS.
Kami telah menyediakan PoC yang dapat direproduksi di git. Blok kode dalam PoC ini berisi instruksi cabang tanpa syarat, yang setiap kali mengeksekusi instruksi terakhir akan melompat kembali ke instruksi pertama, sehingga memanggil fungsi execute_block dan join berkali-kali.
Kekurangan ini menunjukkan bahwa bahkan bahasa yang mementingkan keamanan seperti Move dapat memiliki celah keamanan. Pentingnya audit kode tidak dapat dipungkiri, programmer tidak bisa terhindar dari kelalaian. Sebagai pemimpin dalam penelitian keamanan bahasa Move, kami akan terus menyelidiki masalah keamanan Move.
Kami menyarankan perancang bahasa Move untuk menambahkan lebih banyak kode pemeriksaan saat runtime, untuk mencegah situasi yang tidak terduga. Saat ini, Move terutama melakukan pemeriksaan keamanan pada tahap verifikasi, tetapi ini mungkin masih tidak cukup. Setelah verifikasi dilalui, kurangnya penguatan keamanan yang memadai pada tahap eksekusi dapat menyebabkan masalah yang lebih serius.