Mengungkap Cara Menghindari Mekanisme Perlindungan Keamanan Chrome v8 dengan Sentinel Value
Nilai Sentinel adalah nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi terminasi dalam algoritma loop atau rekursif. Dalam sumber kode Chrome terdapat beberapa nilai Sentinel. Penelitian sebelumnya menunjukkan bahwa dengan membocorkan objek TheHole, eksekusi kode sembarangan dalam sandbox dapat dicapai. Tim Google kemudian memperbaiki kedua kerentanan ini.
Namun, selain objek TheHole, ada objek asli lain di v8 yang tidak seharusnya bocor ke JS. Artikel ini akan membahas objek Uninitialized Oddball, metode bypass ini masih dapat digunakan di versi terbaru V8, dan Google belum memperbaikinya.
Perlu dicatat bahwa metode ini memiliki tingkat universalitas tertentu:
Dalam Issue1216437 disebutkan terlebih dahulu tentang kebocoran internal uninitialized oddball.
poc dari Issue1314616 juga langsung mengungkapkan UninitializedOddball.
Issue1352549 secara rinci memberikan metode penggunaannya.
Kasus-kasus ini menunjukkan bahwa kita perlu meninjau kembali perangkat lunak yang mungkin terpengaruh. Saat ini, beberapa aplikasi masih belum memperbaiki kerentanan tersebut.
Nilai Sentinel dalam V8
File v8/src/roots/roots.h mencantumkan sebagian besar objek asli v8, yang disusun secara bersebelahan di dalam memori. Begitu objek-objek ini bocor ke dalam Javascript, mungkin untuk melakukan eksekusi kode sembarang di dalam sandbox.
Kita dapat mengungkapkan Uninitialized Oddball ke dalam JavaScript dengan memodifikasi fungsi native v8. Secara khusus, kita dapat mengubah offset relatif terhadap isolate dalam fungsi %TheHole() agar mengembalikan Uninitialized Oddball.
function read(obj, offset) {
return float_array[obj.prop];
}
const obj = {prop: uninitialized};
untuk (biarkan i = 0; i < 100000; i++) {
read(obj, 0);
}
%OptimizeFunctionOnNextCall(baca);
const value = read(obj, 0x12345);
Dalam pengujian v8-11.0.0, ketika %TheHole() mengembalikan UninitializedOddball, pembacaan relatif yang hampir sembarang masih dapat dicapai.
Kode disassembly fungsi read yang dioptimalkan menunjukkan bahwa objek prop dari obj telah diperiksa, tetapi nilai obj.prop yang menjadi key tidak diperiksa, langsung menghitung offset sesuai dengan semantik JavaScript, yang mengakibatkan kebingungan tipe dan memungkinkan pembacaan sembarangan.
Saran perbaikan adalah dengan menambahkan pemeriksaan pada array map saat fungsi yang telah dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan Risiko PatchGap
Kita tidak hanya perlu memperhatikan celah sejarah, tetapi juga harus memperhatikan celah yang diam-diam diperbaiki oleh vendor dalam komponen dasar. Setelah diperiksa, ditemukan bahwa beberapa perangkat lunak masih belum memperbaiki celah tersebut.
Pada arsitektur x86, karena tidak ada kompresi alamat, pembacaan dan penulisan sembarang dilakukan secara langsung terhadap seluruh proses. Meskipun ASLR telah diaktifkan, ketika file cukup besar, hacker hanya perlu melakukan pembacaan dan penulisan pada alamat tetap, sehingga memiliki kemungkinan besar untuk membaca dan menulis konten file. Menggabungkan pemrosesan PE dan pemikiran tradisional lainnya, tidak sulit untuk menyelesaikan seluruh rantai eksploitasi kerentanan.
PatchGap kali ini tidak hanya terkait dengan Issue1352549, tetapi juga secara signifikan mengurangi kesulitan eksploitasi untuk masalah serupa seperti Issue1314616 dan Issue1216437. Para hacker hampir tidak perlu mengeluarkan biaya penelitian untuk dapat mengeksploitasi kebocoran uninitialized_oddball seperti sebelumnya.
Ringkasan
Artikel ini secara singkat memperkenalkan cara untuk mencapai pembacaan arbitrer dengan mengeksploitasi uninitialized_Oddball dalam nilai Sentinel. Di v8 terdapat banyak nilai Sentinel lainnya yang kemungkinan juga memiliki masalah serupa. Ini memberikan kita beberapa wawasan:
Apakah kebocoran uninitialized_Oddball lainnya juga dapat dengan mudah mencapai RCE v8.
Apakah masalah serupa seharusnya diperlakukan secara resmi sebagai masalah keamanan.
Apakah perlu untuk memasukkan nilai Sentinel seperti %TheHole/uninitialized_Oddball sebagai variabel dalam fuzzer, untuk menemukan eksploitasi dari primitif lainnya.
Bagaimanapun juga, jenis masalah ini akan sangat memperpendek siklus bagi hacker 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.
22 Suka
Hadiah
22
5
Bagikan
Komentar
0/400
UnluckyValidator
· 07-10 22:09
Eh, v8 ternyata memiliki celah sebesar ini.
Lihat AsliBalas0
ShibaMillionairen't
· 07-09 05:56
Ini adalah bug v8 lagi. Saya pergi, saya pergi.
Lihat AsliBalas0
UncommonNPC
· 07-09 05:54
Hacker bermain dengan begitu mahir, tidak heran itu adalah v8
Pengungkapan kerentanan Chrome v8: Menggunakan Nilai Sentinel untuk mencapai pelarian sandbox
Mengungkap Cara Menghindari Mekanisme Perlindungan Keamanan Chrome v8 dengan Sentinel Value
Nilai Sentinel adalah nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi terminasi dalam algoritma loop atau rekursif. Dalam sumber kode Chrome terdapat beberapa nilai Sentinel. Penelitian sebelumnya menunjukkan bahwa dengan membocorkan objek TheHole, eksekusi kode sembarangan dalam sandbox dapat dicapai. Tim Google kemudian memperbaiki kedua kerentanan ini.
Namun, selain objek TheHole, ada objek asli lain di v8 yang tidak seharusnya bocor ke JS. Artikel ini akan membahas objek Uninitialized Oddball, metode bypass ini masih dapat digunakan di versi terbaru V8, dan Google belum memperbaikinya.
Perlu dicatat bahwa metode ini memiliki tingkat universalitas tertentu:
Dalam Issue1216437 disebutkan terlebih dahulu tentang kebocoran internal uninitialized oddball.
poc dari Issue1314616 juga langsung mengungkapkan UninitializedOddball.
Issue1352549 secara rinci memberikan metode penggunaannya.
Kasus-kasus ini menunjukkan bahwa kita perlu meninjau kembali perangkat lunak yang mungkin terpengaruh. Saat ini, beberapa aplikasi masih belum memperbaiki kerentanan tersebut.
Nilai Sentinel dalam V8
File v8/src/roots/roots.h mencantumkan sebagian besar objek asli v8, yang disusun secara bersebelahan di dalam memori. Begitu objek-objek ini bocor ke dalam Javascript, mungkin untuk melakukan eksekusi kode sembarang di dalam sandbox.
Kita dapat mengungkapkan Uninitialized Oddball ke dalam JavaScript dengan memodifikasi fungsi native v8. Secara khusus, kita dapat mengubah offset relatif terhadap isolate dalam fungsi %TheHole() agar mengembalikan Uninitialized Oddball.
Menghindari perlindungan HardenType
Metode yang digunakan adalah sebagai berikut:
javascript const uninitialized = %TheHole(); const float_array = new Float64Array(1); float_array[0] = 1.1;
function read(obj, offset) { return float_array[obj.prop]; }
const obj = {prop: uninitialized};
untuk (biarkan i = 0; i < 100000; i++) { read(obj, 0);
}
%OptimizeFunctionOnNextCall(baca); const value = read(obj, 0x12345);
Dalam pengujian v8-11.0.0, ketika %TheHole() mengembalikan UninitializedOddball, pembacaan relatif yang hampir sembarang masih dapat dicapai.
Kode disassembly fungsi read yang dioptimalkan menunjukkan bahwa objek prop dari obj telah diperiksa, tetapi nilai obj.prop yang menjadi key tidak diperiksa, langsung menghitung offset sesuai dengan semantik JavaScript, yang mengakibatkan kebingungan tipe dan memungkinkan pembacaan sembarangan.
Saran perbaikan adalah dengan menambahkan pemeriksaan pada array map saat fungsi yang telah dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan Risiko PatchGap
Kita tidak hanya perlu memperhatikan celah sejarah, tetapi juga harus memperhatikan celah yang diam-diam diperbaiki oleh vendor dalam komponen dasar. Setelah diperiksa, ditemukan bahwa beberapa perangkat lunak masih belum memperbaiki celah tersebut.
Pada arsitektur x86, karena tidak ada kompresi alamat, pembacaan dan penulisan sembarang dilakukan secara langsung terhadap seluruh proses. Meskipun ASLR telah diaktifkan, ketika file cukup besar, hacker hanya perlu melakukan pembacaan dan penulisan pada alamat tetap, sehingga memiliki kemungkinan besar untuk membaca dan menulis konten file. Menggabungkan pemrosesan PE dan pemikiran tradisional lainnya, tidak sulit untuk menyelesaikan seluruh rantai eksploitasi kerentanan.
PatchGap kali ini tidak hanya terkait dengan Issue1352549, tetapi juga secara signifikan mengurangi kesulitan eksploitasi untuk masalah serupa seperti Issue1314616 dan Issue1216437. Para hacker hampir tidak perlu mengeluarkan biaya penelitian untuk dapat mengeksploitasi kebocoran uninitialized_oddball seperti sebelumnya.
Ringkasan
Artikel ini secara singkat memperkenalkan cara untuk mencapai pembacaan arbitrer dengan mengeksploitasi uninitialized_Oddball dalam nilai Sentinel. Di v8 terdapat banyak nilai Sentinel lainnya yang kemungkinan juga memiliki masalah serupa. Ini memberikan kita beberapa wawasan:
Apakah kebocoran uninitialized_Oddball lainnya juga dapat dengan mudah mencapai RCE v8.
Apakah masalah serupa seharusnya diperlakukan secara resmi sebagai masalah keamanan.
Apakah perlu untuk memasukkan nilai Sentinel seperti %TheHole/uninitialized_Oddball sebagai variabel dalam fuzzer, untuk menemukan eksploitasi dari primitif lainnya.
Bagaimanapun juga, jenis masalah ini akan sangat memperpendek siklus bagi hacker untuk mencapai pemanfaatan penuh.