Kerentanan overflow integer baru ditemukan dalam mekanisme keamanan referensi bahasa Move
Baru-baru ini, saat melakukan penelitian mendalam terhadap bahasa Move, kami menemukan celah overflow integer yang baru. Celah ini muncul selama proses verifikasi keamanan referensi, yang melibatkan beberapa mekanisme inti dari bahasa Move. Dengan menganalisis celah ini, kami dapat memahami lebih dalam tentang desain dan implementasi bahasa Move.
Proses Verifikasi Bahasa Move
Bahasa Move akan memverifikasi unit kode sebelum mengeksekusi bytecode, dan proses ini dibagi menjadi 4 langkah. Kerentanan yang ditemukan kali ini terjadi pada langkah reference_safety.
modul reference_safety mendefinisikan fungsi inti yang digunakan untuk memverifikasi keamanan referensi. Ini terutama memeriksa apakah ada referensi yang mengambang, apakah akses referensi yang dapat diubah aman, dan apakah akses referensi penyimpanan global aman, dan masalah lainnya.
Fungsi masuk dari proses verifikasi akan memanggil analyze_function untuk menganalisis setiap fungsi. analyze_function akan memverifikasi setiap blok dasar dalam fungsi. Blok dasar adalah urutan kode yang tidak memiliki instruksi cabang kecuali untuk masuk dan keluar.
Keamanan Referensi dalam Bahasa Move
Bahasa Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Referensi tidak dapat diubah digunakan untuk membaca data, sedangkan referensi dapat diubah digunakan untuk memodifikasi data. Desain ini membantu meningkatkan keamanan dan keterbacaan kode.
Modul verifikasi keamanan akan memindai instruksi bytecode setiap blok dasar dalam fungsi, menilai apakah semua operasi referensi sah. Proses verifikasi terutama mencakup:
Menjalankan kode blok dasar
Status sebelum dan sesudah eksekusi digabung
Memperbarui status blok
Menyebarkan kondisi pasca ke blok berikutnya
Proses ini mirip dengan pemikiran Sea of Nodes dalam V8 turbofan.
Analisis Kerentanan
Kerentanan muncul selama proses penggabungan status sebelum dan sesudah eksekusi. Ketika panjang parameter fungsi ditambah dengan panjang variabel lokal melebihi 256, penggunaan tipe u8 untuk merepresentasikan indeks variabel lokal dapat menyebabkan overflow integer.
Meskipun bahasa Move memiliki proses untuk memverifikasi jumlah variabel lokal, pemeriksaan ini tidak mencakup panjang parameter. Para pengembang tampaknya menyadari perlunya memeriksa jumlah total parameter dan variabel lokal, namun dalam kode nyata hanya jumlah variabel lokal yang diperiksa.
Overflow ini dapat menyebabkan serangan penolakan layanan ( DoS ). Penyerang dapat membangun blok kode berulang yang memanfaatkan overflow untuk mengubah status blok. Ketika blok dasar dieksekusi lagi, jika indeks yang perlu diakses oleh instruksi tidak ada dalam status baru, maka akan menyebabkan program crash.
Eksploitasi Kerentanan
Kami telah membangun bukti konsep ( PoC ) untuk mendemonstrasikan kerentanan ini:
Buat blok dasar yang berisi instruksi percabangan tak bersyarat, sehingga dapat dieksekusi berulang kali.
Atur jumlah parameter dan variabel lokal menjadi 264, menyebabkan panjang pemetaan variabel lokal baru meluap menjadi 8.
Saat menjalankan blok dasar lagi, mencoba mengakses indeks variabel lokal yang tidak ada, menyebabkan panic.
Kesimpulan
Kelemahan ini sekali lagi membuktikan bahwa tidak ada kode yang sepenuhnya aman. Meskipun bahasa Move melakukan pemeriksaan statis sebelum eksekusi, masih mungkin untuk dilewati oleh kerentanan overflow integer.
Untuk pengembangan masa depan bahasa Move, kami menyarankan:
Tambahkan lebih banyak kode pemeriksaan saat menjalankan untuk mencegah situasi yang tidak terduga.
Jangan hanya bergantung pada pemeriksaan keamanan di fase verifikasi, tetapi juga harus melakukan penguatan keamanan di fase operasi.
Sebagai pelopor penelitian keamanan bahasa Move, kami akan terus mendalami masalah keamanan Move dan memberikan kontribusi bagi perkembangannya.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
16 Suka
Hadiah
16
3
Bagikan
Komentar
0/400
SnapshotLaborer
· 12jam yang lalu
Belajar selama lima menit lalu pergi untuk melaporkan bug.
Lihat AsliBalas0
RadioShackKnight
· 12jam yang lalu
move lumpur tidak bisa diangkat ke dinding
Lihat AsliBalas0
LayerZeroHero
· 13jam yang lalu
Ada yang bisa dikatakan, move juga tidak lebih dari ini.
Vulnerabilitas overflow integer baru ditemukan dalam verifikasi keamanan referensi bahasa Move
Kerentanan overflow integer baru ditemukan dalam mekanisme keamanan referensi bahasa Move
Baru-baru ini, saat melakukan penelitian mendalam terhadap bahasa Move, kami menemukan celah overflow integer yang baru. Celah ini muncul selama proses verifikasi keamanan referensi, yang melibatkan beberapa mekanisme inti dari bahasa Move. Dengan menganalisis celah ini, kami dapat memahami lebih dalam tentang desain dan implementasi bahasa Move.
Proses Verifikasi Bahasa Move
Bahasa Move akan memverifikasi unit kode sebelum mengeksekusi bytecode, dan proses ini dibagi menjadi 4 langkah. Kerentanan yang ditemukan kali ini terjadi pada langkah reference_safety.
modul reference_safety mendefinisikan fungsi inti yang digunakan untuk memverifikasi keamanan referensi. Ini terutama memeriksa apakah ada referensi yang mengambang, apakah akses referensi yang dapat diubah aman, dan apakah akses referensi penyimpanan global aman, dan masalah lainnya.
Fungsi masuk dari proses verifikasi akan memanggil analyze_function untuk menganalisis setiap fungsi. analyze_function akan memverifikasi setiap blok dasar dalam fungsi. Blok dasar adalah urutan kode yang tidak memiliki instruksi cabang kecuali untuk masuk dan keluar.
Keamanan Referensi dalam Bahasa Move
Bahasa Move mendukung dua jenis referensi: referensi tidak dapat diubah (&) dan referensi dapat diubah (&mut). Referensi tidak dapat diubah digunakan untuk membaca data, sedangkan referensi dapat diubah digunakan untuk memodifikasi data. Desain ini membantu meningkatkan keamanan dan keterbacaan kode.
Modul verifikasi keamanan akan memindai instruksi bytecode setiap blok dasar dalam fungsi, menilai apakah semua operasi referensi sah. Proses verifikasi terutama mencakup:
Proses ini mirip dengan pemikiran Sea of Nodes dalam V8 turbofan.
Analisis Kerentanan
Kerentanan muncul selama proses penggabungan status sebelum dan sesudah eksekusi. Ketika panjang parameter fungsi ditambah dengan panjang variabel lokal melebihi 256, penggunaan tipe u8 untuk merepresentasikan indeks variabel lokal dapat menyebabkan overflow integer.
Meskipun bahasa Move memiliki proses untuk memverifikasi jumlah variabel lokal, pemeriksaan ini tidak mencakup panjang parameter. Para pengembang tampaknya menyadari perlunya memeriksa jumlah total parameter dan variabel lokal, namun dalam kode nyata hanya jumlah variabel lokal yang diperiksa.
Overflow ini dapat menyebabkan serangan penolakan layanan ( DoS ). Penyerang dapat membangun blok kode berulang yang memanfaatkan overflow untuk mengubah status blok. Ketika blok dasar dieksekusi lagi, jika indeks yang perlu diakses oleh instruksi tidak ada dalam status baru, maka akan menyebabkan program crash.
Eksploitasi Kerentanan
Kami telah membangun bukti konsep ( PoC ) untuk mendemonstrasikan kerentanan ini:
Kesimpulan
Kelemahan ini sekali lagi membuktikan bahwa tidak ada kode yang sepenuhnya aman. Meskipun bahasa Move melakukan pemeriksaan statis sebelum eksekusi, masih mungkin untuk dilewati oleh kerentanan overflow integer.
Untuk pengembangan masa depan bahasa Move, kami menyarankan:
Sebagai pelopor penelitian keamanan bahasa Move, kami akan terus mendalami masalah keamanan Move dan memberikan kontribusi bagi perkembangannya.