Analisis Masalah Keamanan yang Disebabkan oleh Kebocoran Nilai Sentinel di Mesin Chrome v8
Nilai Sentinel adalah nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi akhir dalam algoritma loop atau rekursi. Dalam kode sumber Chrome, terdapat beberapa nilai Sentinel, dan beberapa di antaranya jika bocor ke lingkungan JavaScript dapat menyebabkan masalah keamanan.
Sebelumnya, ada penelitian yang menunjukkan bahwa dengan membocorkan objek TheHole, dapat dilakukan eksekusi kode sembarang di dalam sandbox Chrome. Tim Google segera memperbaiki CVE terkait setelahnya. Namun, selain objek TheHole, ada objek native lain di v8 yang seharusnya tidak dibocorkan ke JS. Artikel ini akan membahas objek Uninitialized Oddball, metode bypass ini masih dapat digunakan di versi terbaru V8.
Perlu dicatat bahwa metode ini memiliki tingkat universalitas tertentu:
Dalam CVE-2021-30551, POC awal adalah kebocoran oddball internal yang tidak diinisialisasi.
Dalam CVE-2022-1486, POC juga secara langsung mengungkapkan UninitializedOddball.
Issue1352549( memberikan kode eksploitasi lengkap untuk CVE) yang belum dialokasikan.
Kasus-kasus ini menunjukkan bahwa kebocoran Uninitialized Oddball dapat menyebabkan masalah keamanan yang serius.
Nilai Sentinel dalam V8
Sebagian besar objek native V8 didefinisikan dalam file v8/src/roots/roots.h, objek-objek ini disusun berurutan dalam memori. Jika objek native yang seharusnya tidak bocor bocor ke JavaScript, mungkin dapat melakukan eksekusi kode sembarang di dalam sandbox.
Untuk memverifikasi ini, kita dapat memodifikasi fungsi native V8, untuk membocorkan Uninitialized Oddball ke dalam JavaScript. Secara khusus, kita dapat memodifikasi offset relatif terhadap isolate dalam fungsi %TheHole(), sehingga mengembalikan Uninitialized Oddball.
Menghindari perlindungan HardenType
Menggunakan Uninitialized Oddball dapat mencapai pembacaan relatif sembarang. Kode kunci adalah sebagai berikut:
javascript
fungsi read(obj, idx) {
return obj[idx];
}
let uninitialized_oddball = %TheHole();
let ab = new ArrayBuffer(8);
let fa = new Float64Array(ab);
let ia = new BigInt64Array(ab);
let val = read(uninitialized_oddball, "prop");
fa[0] = val;
console.log(ia[0]);
Dalam kode rakitan yang dioptimalkan, offset akan dihitung dan nilai array akan dikembalikan langsung sesuai dengan semantik JavaScript, tanpa memeriksa nilai obj.prop sebagai key. Ini mengakibatkan kebingungan tipe, yang memungkinkan pembacaan sembarang.
Karena Uninitialized Oddball memiliki urutan lebih awal dan lebih primitif dalam memori V8, lebih mudah untuk dipalsukan dibandingkan objek TheHole, ini adalah metode pilihan untuk menghindari HardenType.
Solusi perbaikan yang disarankan adalah dengan menambahkan pemeriksaan pada map array saat fungsi yang dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan PatchGap
Setelah menganalisis Issue1352549, ditemukan bahwa beberapa perangkat lunak mungkin memiliki masalah PatchGap. Misalnya, Skype saat ini masih belum memperbaiki kerentanan tersebut. Di platform x86, karena tidak adanya kompresi alamat, pembacaan dan penulisan sembarang adalah relatif terhadap seluruh proses.
Meskipun Skype telah mengaktifkan ASLR, karena berkasnya yang besar, peretas hanya perlu membaca dan menulis pada alamat tetap tertentu, sehingga memiliki kemungkinan besar untuk membaca dan menulis isi berkas Skype. Dengan menggabungkan metode tradisional seperti analisis PE, seluruh rantai eksploitasi dapat diselesaikan.
PatchGap kali ini tidak hanya terkait dengan Issue1352549, tetapi juga akan secara signifikan mengurangi kesulitan dalam memanfaatkan kerentanan seperti CVE-2022-1486 dan CVE-2021-30551. Hacker hampir tidak perlu melakukan penelitian tambahan untuk mencapai pemanfaatan penuh.
Ringkasan
Artikel ini secara singkat membahas metode untuk melakukan pembacaan arbitrer melalui kebocoran Uninitialized Oddball. Di V8 juga terdapat banyak nilai Sentinel lainnya, yang mungkin memiliki kerentanan keamanan serupa. Ini memberikan kita wawasan berikut:
Apakah kebocoran Uninitialized Oddball lainnya juga dapat dengan mudah mencapai RCE V8.
Apakah masalah semacam ini seharusnya secara resmi dianggap sebagai masalah keamanan masih menjadi perdebatan.
Apakah perlu menambahkan %TheHole/Uninitialized Oddball sebagai variabel di dalam Fuzzer untuk menggali primitif eksploitasi baru.
Bagaimanapun, masalah semacam ini akan sangat memperpendek siklus bagi hacker untuk mencapai pemanfaatan penuh, dan ini layak untuk mendapat perhatian tinggi dari kita.
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.
6 Suka
Hadiah
6
5
Bagikan
Komentar
0/400
HallucinationGrower
· 7jam yang lalu
Wah, bagaimana bisa bocor?
Lihat AsliBalas0
CodeAuditQueen
· 7jam yang lalu
Satu lagi varian CVE Attack Surface, eh.
Lihat AsliBalas0
WhaleWatcher
· 7jam yang lalu
Apakah Google sedang bermain api? Mundur dalam sejarah.
Lihat AsliBalas0
BearMarketSurvivor
· 7jam yang lalu
Benar-benar bug yang tidak ada habisnya.
Lihat AsliBalas0
CryptoAdventurer
· 7jam yang lalu
Apakah ini saat yang baik untuk membayar pajak IQ? Yang mengerti, mengerti.
Kebocoran Nilai Sentinel V8 Engine menimbulkan risiko keamanan Uninitialized Oddball menjadi jenis serangan baru
Analisis Masalah Keamanan yang Disebabkan oleh Kebocoran Nilai Sentinel di Mesin Chrome v8
Nilai Sentinel adalah nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi akhir dalam algoritma loop atau rekursi. Dalam kode sumber Chrome, terdapat beberapa nilai Sentinel, dan beberapa di antaranya jika bocor ke lingkungan JavaScript dapat menyebabkan masalah keamanan.
Sebelumnya, ada penelitian yang menunjukkan bahwa dengan membocorkan objek TheHole, dapat dilakukan eksekusi kode sembarang di dalam sandbox Chrome. Tim Google segera memperbaiki CVE terkait setelahnya. Namun, selain objek TheHole, ada objek native lain di v8 yang seharusnya tidak dibocorkan ke JS. Artikel ini akan membahas objek Uninitialized Oddball, metode bypass ini masih dapat digunakan di versi terbaru V8.
Perlu dicatat bahwa metode ini memiliki tingkat universalitas tertentu:
Dalam CVE-2021-30551, POC awal adalah kebocoran oddball internal yang tidak diinisialisasi.
Dalam CVE-2022-1486, POC juga secara langsung mengungkapkan UninitializedOddball.
Issue1352549( memberikan kode eksploitasi lengkap untuk CVE) yang belum dialokasikan.
Kasus-kasus ini menunjukkan bahwa kebocoran Uninitialized Oddball dapat menyebabkan masalah keamanan yang serius.
Nilai Sentinel dalam V8
Sebagian besar objek native V8 didefinisikan dalam file v8/src/roots/roots.h, objek-objek ini disusun berurutan dalam memori. Jika objek native yang seharusnya tidak bocor bocor ke JavaScript, mungkin dapat melakukan eksekusi kode sembarang di dalam sandbox.
Untuk memverifikasi ini, kita dapat memodifikasi fungsi native V8, untuk membocorkan Uninitialized Oddball ke dalam JavaScript. Secara khusus, kita dapat memodifikasi offset relatif terhadap isolate dalam fungsi %TheHole(), sehingga mengembalikan Uninitialized Oddball.
Menghindari perlindungan HardenType
Menggunakan Uninitialized Oddball dapat mencapai pembacaan relatif sembarang. Kode kunci adalah sebagai berikut:
javascript fungsi read(obj, idx) { return obj[idx]; }
let uninitialized_oddball = %TheHole(); let ab = new ArrayBuffer(8); let fa = new Float64Array(ab); let ia = new BigInt64Array(ab);
let evil = [1.1, 2.2, 3.3]; evil.prop = 1;
%PrepareFunctionForOptimization(baca); baca(jahat, 0); baca(jahat, 1); %OptimizeFunctionOnNextCall(baca); read(jahat, 0);
let val = read(uninitialized_oddball, "prop"); fa[0] = val; console.log(ia[0]);
Dalam kode rakitan yang dioptimalkan, offset akan dihitung dan nilai array akan dikembalikan langsung sesuai dengan semantik JavaScript, tanpa memeriksa nilai obj.prop sebagai key. Ini mengakibatkan kebingungan tipe, yang memungkinkan pembacaan sembarang.
Karena Uninitialized Oddball memiliki urutan lebih awal dan lebih primitif dalam memori V8, lebih mudah untuk dipalsukan dibandingkan objek TheHole, ini adalah metode pilihan untuk menghindari HardenType.
Solusi perbaikan yang disarankan adalah dengan menambahkan pemeriksaan pada map array saat fungsi yang dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan PatchGap
Setelah menganalisis Issue1352549, ditemukan bahwa beberapa perangkat lunak mungkin memiliki masalah PatchGap. Misalnya, Skype saat ini masih belum memperbaiki kerentanan tersebut. Di platform x86, karena tidak adanya kompresi alamat, pembacaan dan penulisan sembarang adalah relatif terhadap seluruh proses.
Meskipun Skype telah mengaktifkan ASLR, karena berkasnya yang besar, peretas hanya perlu membaca dan menulis pada alamat tetap tertentu, sehingga memiliki kemungkinan besar untuk membaca dan menulis isi berkas Skype. Dengan menggabungkan metode tradisional seperti analisis PE, seluruh rantai eksploitasi dapat diselesaikan.
PatchGap kali ini tidak hanya terkait dengan Issue1352549, tetapi juga akan secara signifikan mengurangi kesulitan dalam memanfaatkan kerentanan seperti CVE-2022-1486 dan CVE-2021-30551. Hacker hampir tidak perlu melakukan penelitian tambahan untuk mencapai pemanfaatan penuh.
Ringkasan
Artikel ini secara singkat membahas metode untuk melakukan pembacaan arbitrer melalui kebocoran Uninitialized Oddball. Di V8 juga terdapat banyak nilai Sentinel lainnya, yang mungkin memiliki kerentanan keamanan serupa. Ini memberikan kita wawasan berikut:
Apakah kebocoran Uninitialized Oddball lainnya juga dapat dengan mudah mencapai RCE V8.
Apakah masalah semacam ini seharusnya secara resmi dianggap sebagai masalah keamanan masih menjadi perdebatan.
Apakah perlu menambahkan %TheHole/Uninitialized Oddball sebagai variabel di dalam Fuzzer untuk menggali primitif eksploitasi baru.
Bagaimanapun, masalah semacam ini akan sangat memperpendek siklus bagi hacker untuk mencapai pemanfaatan penuh, dan ini layak untuk mendapat perhatian tinggi dari kita.