Menghindari HardenProtect Chrome V8 melalui kebocoran Sentinel Value
Nilai Sentinel adalah nilai khusus dalam algoritma, yang sering digunakan sebagai kondisi penghentian dalam algoritma iterasi atau rekursi. Di dalam kode sumber Chrome terdapat beberapa nilai Sentinel. Sebelumnya, ada penelitian yang menunjukkan bagaimana menggunakan objek TheHole untuk mengeksploitasi dan melaksanakan kode arbitrer di dalam sandbox. Artikel ini akan membahas objek native V8 lainnya - Uninitialized Oddball, yang metode ini masih dapat digunakan dalam versi terbaru V8.
Metode ini bersifat universal:
Issue1216437 pertama kali mengusulkan konsep kebocoran internal uninitialized oddball.
Dalam Issue1314616 juga secara langsung membocorkan UninitializedOddball, meskipun metode pemanfaatannya saat itu masih tidak jelas.
Issue1352549 patut diperhatikan karena potensi dampaknya.
Saat ini, beberapa perangkat lunak masih belum memperbaiki kerentanan ini.
Sebagian besar objek asli di V8 didefinisikan dalam file v8/src/roots/roots.h, dan objek-objek ini diatur bersebelahan dalam memori. Setelah objek asli yang tidak seharusnya bocor diekspos ke JavaScript, eksekusi kode arbitrer dalam sandbox mungkin terjadi.
Untuk memverifikasi metode ini, Anda dapat memodifikasi fungsi native V8 untuk membocorkan Uninitialized Oddball ke dalam JavaScript. Secara spesifik, Anda dapat memodifikasi offset relatif terhadap isolate dalam fungsi %TheHole().
Kode inti dari metode bypass ini adalah sebagai berikut:
javascript
function read(obj, prop) {
return obj[prop];
}
let uninitialized_oddball = %TheHole();
let arr = [1.1, 2.2, 3.3];
untuk (biarkan i = 0; i < 100000; i++) {
read(arr, 0);
}
let val = read(uninitialized_oddball, 0);
console.log(val);
Dalam pengujian V8 11.0.0, ketika %TheHole() mengembalikan UninitializedOddball, pembacaan relatif yang hampir sembarang masih dapat dicapai.
Rangkaian kunci dari fungsi read yang dioptimalkan adalah sebagai berikut:
Saat uninitialized_oddball diteruskan, hitung mulai dari obj di 0x558b20004086, akhirnya menyelesaikan pembacaan sembarang dalam instruksi vmovsd, data disimpan di register xmm0.
Saran perbaikan adalah dengan menambahkan pemeriksaan pada peta array saat fungsi yang dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung saat mengembalikan nilai array.
Perlu dicatat bahwa beberapa perangkat lunak masih belum memperbaiki kerentanan ini. Metode pemanfaatan di platform x86 sedikit berbeda, karena tidak ada kompresi alamat, baca tulis sembarangan relatif terhadap seluruh proses. Bahkan jika ASLR diaktifkan, karena ukuran file yang terlalu besar, masih ada kemungkinan besar untuk membaca dan menulis ke konten target.
Metode bypass baru ini secara signifikan mengurangi kesulitan dalam memanfaatkan kerentanan serupa sebelumnya. Disarankan untuk meninjau kembali semua kerentanan yang mengungkap uninitialized_oddball.
Di V8 juga terdapat nilai Sentinel lainnya, yang juga dapat menyebabkan masalah serupa. Ini memberikan kita wawasan berikut:
Apakah kebocoran uninitialized_Oddball lainnya juga mudah untuk diimplementasikan RCE V8.
Apakah masalah semacam ini seharusnya secara resmi dianggap sebagai masalah keamanan masih menjadi perdebatan.
Apakah Sentinel value harus dimasukkan sebagai variabel dalam Fuzzer untuk mengeksplorasi primitive eksploitasi baru.
Bagaimanapun, masalah seperti ini akan sangat memperpendek periode di mana peretas dapat memanfaatkan sepenuhnya.
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.
10 Suka
Hadiah
10
5
Bagikan
Komentar
0/400
ZKProofEnthusiast
· 07-09 11:53
Diketahui bahwa V8 menggerakkan dunia
Lihat AsliBalas0
SleepyValidator
· 07-06 23:01
Chrome memang tidak main-main, stabil.
Lihat AsliBalas0
FlashLoanLord
· 07-06 17:06
Lubangnya begitu besar masih belum diperbaiki?
Lihat AsliBalas0
ForkItAll
· 07-06 17:00
Celah v8 ini benar-benar ybb.
Lihat AsliBalas0
FudVaccinator
· 07-06 16:51
Satu lagi celah besar, menggunakan Firefox memang enak.
Mesin Chrome V8 muncul kembali dengan celah keamanan: Kebocoran Nilai Sentinel dapat melewati sandbox
Menghindari HardenProtect Chrome V8 melalui kebocoran Sentinel Value
Nilai Sentinel adalah nilai khusus dalam algoritma, yang sering digunakan sebagai kondisi penghentian dalam algoritma iterasi atau rekursi. Di dalam kode sumber Chrome terdapat beberapa nilai Sentinel. Sebelumnya, ada penelitian yang menunjukkan bagaimana menggunakan objek TheHole untuk mengeksploitasi dan melaksanakan kode arbitrer di dalam sandbox. Artikel ini akan membahas objek native V8 lainnya - Uninitialized Oddball, yang metode ini masih dapat digunakan dalam versi terbaru V8.
Metode ini bersifat universal:
Issue1216437 pertama kali mengusulkan konsep kebocoran internal uninitialized oddball.
Dalam Issue1314616 juga secara langsung membocorkan UninitializedOddball, meskipun metode pemanfaatannya saat itu masih tidak jelas.
Issue1352549 patut diperhatikan karena potensi dampaknya.
Saat ini, beberapa perangkat lunak masih belum memperbaiki kerentanan ini.
Sebagian besar objek asli di V8 didefinisikan dalam file v8/src/roots/roots.h, dan objek-objek ini diatur bersebelahan dalam memori. Setelah objek asli yang tidak seharusnya bocor diekspos ke JavaScript, eksekusi kode arbitrer dalam sandbox mungkin terjadi.
Untuk memverifikasi metode ini, Anda dapat memodifikasi fungsi native V8 untuk membocorkan Uninitialized Oddball ke dalam JavaScript. Secara spesifik, Anda dapat memodifikasi offset relatif terhadap isolate dalam fungsi %TheHole().
Kode inti dari metode bypass ini adalah sebagai berikut:
javascript function read(obj, prop) { return obj[prop]; }
let uninitialized_oddball = %TheHole(); let arr = [1.1, 2.2, 3.3];
untuk (biarkan i = 0; i < 100000; i++) { read(arr, 0);
}
let val = read(uninitialized_oddball, 0); console.log(val);
Dalam pengujian V8 11.0.0, ketika %TheHole() mengembalikan UninitializedOddball, pembacaan relatif yang hampir sembarang masih dapat dicapai.
Rangkaian kunci dari fungsi read yang dioptimalkan adalah sebagai berikut:
0x558b20004086 mov r11,rdi 0x558b20004089 movzx edi,byte ptr [r11+0xb] 0x558b2000408d cmp edi,0x81 0x558b20004093 jnz 0x558b200040d8 0x558b20004095 mov r9,qword ptr [r11+0xf] 0x558b20004099 uji esi,esi 0x558b2000409b js 0x558b200040d8 0x558b2000409d movsxd r11,esi 0x558b200040a0 cmp r11,qword ptr [r9+0xf] 0x558b200040a4 jae 0x558b200040d8 0x558b200040a6 vmovsd xmm0,[r9+r11*8+0x7]
Saat uninitialized_oddball diteruskan, hitung mulai dari obj di 0x558b20004086, akhirnya menyelesaikan pembacaan sembarang dalam instruksi vmovsd, data disimpan di register xmm0.
Saran perbaikan adalah dengan menambahkan pemeriksaan pada peta array saat fungsi yang dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung saat mengembalikan nilai array.
Perlu dicatat bahwa beberapa perangkat lunak masih belum memperbaiki kerentanan ini. Metode pemanfaatan di platform x86 sedikit berbeda, karena tidak ada kompresi alamat, baca tulis sembarangan relatif terhadap seluruh proses. Bahkan jika ASLR diaktifkan, karena ukuran file yang terlalu besar, masih ada kemungkinan besar untuk membaca dan menulis ke konten target.
Metode bypass baru ini secara signifikan mengurangi kesulitan dalam memanfaatkan kerentanan serupa sebelumnya. Disarankan untuk meninjau kembali semua kerentanan yang mengungkap uninitialized_oddball.
Di V8 juga terdapat nilai Sentinel lainnya, yang juga dapat menyebabkan masalah serupa. Ini memberikan kita wawasan berikut:
Apakah kebocoran uninitialized_Oddball lainnya juga mudah untuk diimplementasikan RCE V8.
Apakah masalah semacam ini seharusnya secara resmi dianggap sebagai masalah keamanan masih menjadi perdebatan.
Apakah Sentinel value harus dimasukkan sebagai variabel dalam Fuzzer untuk mengeksplorasi primitive eksploitasi baru.
Bagaimanapun, masalah seperti ini akan sangat memperpendek periode di mana peretas dapat memanfaatkan sepenuhnya.