Analisis Eksploitasi Kerentanan Nilai Sentinel di Mesin Chrome V8
Nilai Sentinel adalah jenis nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi penghentian dalam algoritma loop atau rekursi. Dalam kode sumber Chrome terdapat banyak nilai Sentinel. Sebelumnya, ada penelitian yang menunjukkan bahwa dengan membocorkan objek TheHole, dapat dilakukan eksekusi kode sembarangan dalam sandbox Chrome. Tim Google kemudian memperbaiki kerentanan terkait.
Namun, masih ada objek bawaan lain di V8 yang seharusnya tidak bocor ke JS. Artikel ini membahas objek Uninitialized Oddball, yang metode kebocorannya masih dapat digunakan untuk melewati sandbox di versi terbaru V8.
Perlu dicatat bahwa metode ini memiliki tingkat universalitas tertentu:
CVE-2021-30551 PoC awal adalah kebocoran internal uninitialized oddball.
PoC dari CVE-2022-1486 juga secara langsung membocorkan UninitializedOddball.
Issue1352549 ( tidak dialokasikan CVE) menjelaskan metode pemanfaatan secara rinci.
Kasus-kasus ini menunjukkan bahwa kemungkinan serangan menggunakan kebocoran Uninitialized Oddball perlu mendapat perhatian.
Nilai Sentinel di V8
Sebagian besar objek native V8 didefinisikan dalam file v8/src/roots/roots.h, dan mereka tersusun bersebelahan di dalam memori. Setelah objek native yang tidak seharusnya bocor ini bocor ke dalam JavaScript, mungkin dapat mengimplementasikan eksekusi kode arbitrer di dalam sandbox.
Untuk memverifikasi ini, Anda dapat mengubah nilai kembali dari fungsi native V8 %TheHole() menjadi Uninitialized Oddball.
Menghindari Perlindungan HardenType
Issue1352549 memberikan kode bypass yang lengkap. Logika inti setelah disederhanakan adalah sebagai berikut:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized = %TheHole();
let arr = [1.1];
let res = read(uninitialized, 0x12345);
%DebugPrint(res);
Kode ini masih dapat mencapai pembacaan relatif yang hampir tidak terbatas di versi V8 11.0.0 yang terbaru.
Analisis kode assembly fungsi read yang dioptimalkan, dapat ditemukan bahwa ia hanya memeriksa apakah atribut prop dari obj benar, tetapi tidak memeriksa nilai obj.prop sebagai kunci. Ini menyebabkan kebingungan tipe saat perhitungan, yang memungkinkan pembacaan sembarangan.
Saat uninitialized_oddball diteruskan, perhitungan dimulai dari obj dengan instruksi tertentu, dan akhirnya penyelesaian pembacaan sembarang dilakukan pada instruksi vmovsd xmm0,[r9+r11*8+0x7], di mana data disimpan dalam register xmm0.
Metode perbaikan yang disarankan adalah, saat fungsi yang dioptimalkan mengembalikan elemen array, tambahkan pemeriksaan terhadap map array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan PatchGap
Saat memeriksa perangkat lunak yang mungkin memiliki PatchGap, ditemukan bahwa Skype saat ini belum memperbaiki kerentanan tersebut. Di bawah arsitektur x86, karena tidak ada kompresi alamat, pembacaan dan penulisan sembarang dilakukan langsung relatif terhadap seluruh proses.
Meskipun Skype telah mengaktifkan ASLR, namun karena file-nya yang cukup besar, jika langsung ditempatkan dalam memori 4GB, penyerang hanya perlu membaca dan menulis ke suatu alamat tetap, sehingga ada kemungkinan besar untuk membaca dan menulis konten file Skype. Dengan menggabungkan metode tradisional seperti analisis PE, seluruh rantai eksploitasi kerentanan dapat diselesaikan.
PatchGap kali ini tidak hanya terkait dengan Issue1352549, tetapi juga menyebabkan penurunan signifikan dalam kesulitan eksploitasi serupa dengan Issue1314616 dan Issue1216437. Hacker hampir tidak perlu melakukan penelitian tambahan untuk dapat mengeksploitasi sepenuhnya setiap kebocoran uninitialized_oddball yang ada sebelumnya.
Ringkasan
Artikel ini memperkenalkan metode untuk mencapai pembacaan sewenang-wenang melalui kebocoran uninitialized_Oddball dalam nilai Sentinel. Terdapat juga nilai Sentinel lain di V8 yang dapat menyebabkan masalah serupa. Ini memberikan kita wawasan berikut:
Apakah kebocoran uninitialized_Oddball lainnya juga dapat dengan mudah mencapai RCE V8.
Apakah masalah semacam ini harus secara resmi diperlakukan sebagai masalah keamanan masih menjadi perdebatan.
Dalam fuzzer, dapat mempertimbangkan untuk menambahkan nilai Sentinel seperti %TheHole/uninitialized_Oddball sebagai variabel, untuk menggali eksploitasi primitif lainnya.
Bagaimanapun juga, masalah semacam ini akan sangat memperpendek periode bagi peretas untuk mencapai pemanfaatan penuh.
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.
9 Suka
Hadiah
9
5
Posting ulang
Bagikan
Komentar
0/400
CoffeeNFTrader
· 07-22 08:13
Sekali lagi ada celah keamanan, membuat panik satu kelompok.
Lihat AsliBalas0
Hash_Bandit
· 07-21 21:23
penambangan mesin js baru saja menjadi nyata... eksploitasi kesulitan sudah mencapai maksimum
Lihat AsliBalas0
ConsensusDissenter
· 07-20 00:25
Satu lagi lubang hitam kode muncul. Sangat menakutkan.
Lihat AsliBalas0
Blockblind
· 07-20 00:19
v8 juga memiliki celah sebesar ini? Bikin ngakak
Lihat AsliBalas0
BlockchainTalker
· 07-20 00:12
sebenarnya terkejut V8 masih kesulitan dengan ini... p.s. di mana isolasi runtime saya fam?
Analisis eksploitasi kerentanan Sentinel Value pada mesin Chrome V8: RCE dapat dicapai tanpa penelitian tambahan.
Analisis Eksploitasi Kerentanan Nilai Sentinel di Mesin Chrome V8
Nilai Sentinel adalah jenis nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi penghentian dalam algoritma loop atau rekursi. Dalam kode sumber Chrome terdapat banyak nilai Sentinel. Sebelumnya, ada penelitian yang menunjukkan bahwa dengan membocorkan objek TheHole, dapat dilakukan eksekusi kode sembarangan dalam sandbox Chrome. Tim Google kemudian memperbaiki kerentanan terkait.
Namun, masih ada objek bawaan lain di V8 yang seharusnya tidak bocor ke JS. Artikel ini membahas objek Uninitialized Oddball, yang metode kebocorannya masih dapat digunakan untuk melewati sandbox di versi terbaru V8.
Perlu dicatat bahwa metode ini memiliki tingkat universalitas tertentu:
CVE-2021-30551 PoC awal adalah kebocoran internal uninitialized oddball.
PoC dari CVE-2022-1486 juga secara langsung membocorkan UninitializedOddball.
Issue1352549 ( tidak dialokasikan CVE) menjelaskan metode pemanfaatan secara rinci.
Kasus-kasus ini menunjukkan bahwa kemungkinan serangan menggunakan kebocoran Uninitialized Oddball perlu mendapat perhatian.
Nilai Sentinel di V8
Sebagian besar objek native V8 didefinisikan dalam file v8/src/roots/roots.h, dan mereka tersusun bersebelahan di dalam memori. Setelah objek native yang tidak seharusnya bocor ini bocor ke dalam JavaScript, mungkin dapat mengimplementasikan eksekusi kode arbitrer di dalam sandbox.
Untuk memverifikasi ini, Anda dapat mengubah nilai kembali dari fungsi native V8 %TheHole() menjadi Uninitialized Oddball.
Menghindari Perlindungan HardenType
Issue1352549 memberikan kode bypass yang lengkap. Logika inti setelah disederhanakan adalah sebagai berikut:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized = %TheHole(); let arr = [1.1]; let res = read(uninitialized, 0x12345); %DebugPrint(res);
Kode ini masih dapat mencapai pembacaan relatif yang hampir tidak terbatas di versi V8 11.0.0 yang terbaru.
Analisis kode assembly fungsi read yang dioptimalkan, dapat ditemukan bahwa ia hanya memeriksa apakah atribut prop dari obj benar, tetapi tidak memeriksa nilai obj.prop sebagai kunci. Ini menyebabkan kebingungan tipe saat perhitungan, yang memungkinkan pembacaan sembarangan.
Saat uninitialized_oddball diteruskan, perhitungan dimulai dari obj dengan instruksi tertentu, dan akhirnya penyelesaian pembacaan sembarang dilakukan pada instruksi vmovsd xmm0,[r9+r11*8+0x7], di mana data disimpan dalam register xmm0.
Metode perbaikan yang disarankan adalah, saat fungsi yang dioptimalkan mengembalikan elemen array, tambahkan pemeriksaan terhadap map array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan PatchGap
Saat memeriksa perangkat lunak yang mungkin memiliki PatchGap, ditemukan bahwa Skype saat ini belum memperbaiki kerentanan tersebut. Di bawah arsitektur x86, karena tidak ada kompresi alamat, pembacaan dan penulisan sembarang dilakukan langsung relatif terhadap seluruh proses.
Meskipun Skype telah mengaktifkan ASLR, namun karena file-nya yang cukup besar, jika langsung ditempatkan dalam memori 4GB, penyerang hanya perlu membaca dan menulis ke suatu alamat tetap, sehingga ada kemungkinan besar untuk membaca dan menulis konten file Skype. Dengan menggabungkan metode tradisional seperti analisis PE, seluruh rantai eksploitasi kerentanan dapat diselesaikan.
PatchGap kali ini tidak hanya terkait dengan Issue1352549, tetapi juga menyebabkan penurunan signifikan dalam kesulitan eksploitasi serupa dengan Issue1314616 dan Issue1216437. Hacker hampir tidak perlu melakukan penelitian tambahan untuk dapat mengeksploitasi sepenuhnya setiap kebocoran uninitialized_oddball yang ada sebelumnya.
Ringkasan
Artikel ini memperkenalkan metode untuk mencapai pembacaan sewenang-wenang melalui kebocoran uninitialized_Oddball dalam nilai Sentinel. Terdapat juga nilai Sentinel lain di V8 yang dapat menyebabkan masalah serupa. Ini memberikan kita wawasan berikut:
Apakah kebocoran uninitialized_Oddball lainnya juga dapat dengan mudah mencapai RCE V8.
Apakah masalah semacam ini harus secara resmi diperlakukan sebagai masalah keamanan masih menjadi perdebatan.
Dalam fuzzer, dapat mempertimbangkan untuk menambahkan nilai Sentinel seperti %TheHole/uninitialized_Oddball sebagai variabel, untuk menggali eksploitasi primitif lainnya.
Bagaimanapun juga, masalah semacam ini akan sangat memperpendek periode bagi peretas untuk mencapai pemanfaatan penuh.