Menyelidiki Penggunaan Nilai Sentinel untuk Mengatasi Mekanisme Perlindungan Chrome V8
Nilai sentinel adalah nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi penghentian untuk algoritma perulangan atau rekursif. Dalam kode sumber Chrome terdapat berbagai nilai sentinel. Penelitian sebelumnya menunjukkan bahwa dengan membocorkan objek TheHole, eksekusi kode arbitrer dalam sandbox untuk beberapa CVE dapat dicapai. Tim Google dengan cepat memperbarui CVE terkait di GitHub sekitar seminggu setelah kami menerbitkan penjelasan tentang cara melewati mitigasi tersebut.
Dari kode sumber Chrome, dapat dilihat bahwa ada perbaikan mitigasi yang ditujukan pada objek TheHole yang menyebabkan eksekusi kode sembarangan. Namun, sebenarnya, masih banyak objek asli lain di V8 yang tidak seharusnya terungkap ke dalam JS. Artikel ini akan membahas objek Uninitialized Oddball, yang metode bypass-nya pertama kali muncul di Issue1352549. Perlu dicatat bahwa saat ini metode ini masih dapat digunakan di versi terbaru V8, dan Google belum memperbaiki hal ini.
Metode ini memiliki universalitas yang kuat:
Issue1216437(CVE-2021-30551) yang pertama kali diberikan POC adalah kebocoran internal uninitialized oddball.
Issue1314616(CVE-2022-1486) juga secara langsung mengungkapkan UninitializedOddball.
Dampak dari Issue1352549(NoCVE) tidak boleh diabaikan.
Semua ini menunjukkan perlunya meninjau kembali perangkat lunak yang mungkin terpengaruh oleh PatchGap.
Nilai Sentinel di V8
Sebagian besar objek bawaan V8 didefinisikan dalam file v8/src/roots/roots.h, dan mereka disusun berdampingan dalam memori. Begitu objek bawaan yang tidak seharusnya bocor ini bocor ke dalam JavaScript, itu dapat menyebabkan eksekusi kode arbitrer di dalam sandbox.
Untuk memverifikasi keefektifan metode ini di versi terbaru V8, kita dapat mengubah fungsi asli V8 %TheHole() agar mengembalikan Uninitialized Oddball.
Menghindari HardenType
Issue1352549 memberikan kode lengkap, setelah kami ekstrak dan sederhanakan, masih dapat mencapai pembacaan relatif sembarang di V8 11.0.0.
Untuk disassembly fungsi read JavaScript yang telah dioptimalkan, dapat dilihat bahwa saat memeriksa obj.prop, tidak ada pemeriksaan terhadap Value yang menggunakan obj.prop sebagai key, melainkan langsung menghitung offset untuk mendapatkan nilai array sesuai dengan semantik JavaScript. Ini menyebabkan kebingungan tipe saat perhitungan, yang memungkinkan pembacaan sembarangan.
Ketika uninitialized_oddball diteruskan, mulai dari obj, akhirnya dalam instruksi vmovsd xmm0,[r9+r11*8+0x7] dilakukan pembacaan sembarang, data disimpan dalam register xmm0.
Karena uninitialized_oddball memiliki urutan yang lebih awal dan lebih primitif dalam memori V8, pemalsuan lebih mudah, sehingga menjadi metode yang lebih disukai untuk melewati. Untuk penulisan sembarangan, dapat merujuk pada analisis konstruksi Issue1352549.
Saran perbaikan adalah menambahkan pemeriksaan pada array map saat fungsi yang dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan PatchGap
Setelah menganalisis Issue1352549, kami menyelidiki perangkat lunak yang mungkin memiliki PatchGap, dan menemukan bahwa Skype hingga saat ini belum memperbaiki celah tersebut. Bacaan dan penulisan sembarang di x86 sedikit berbeda, karena tidak ada kompresi alamat, itu langsung relatif terhadap seluruh proses.
Dalam penggunaan Skype, meskipun ASLR telah diaktifkan, karena ukuran file yang besar, hacker hanya perlu membaca dan menulis pada alamat tetap tertentu, sehingga sangat mungkin untuk membaca dan menulis konten file Skype. Menggabungkan dengan pemahaman tradisional seperti analisis PE, tidak sulit untuk menyelesaikan seluruh rantai eksploitasi kerentanan.
PatchGap kali ini tidak hanya melibatkan Issue1352549, tetapi juga publikasi metode bypass baru yang secara signifikan mengurangi kesulitan eksploitasi yang mirip dengan Issue1314616 dan Issue1216437. Hacker hampir tidak perlu mengeluarkan biaya untuk penelitian, untuk dapat melakukan eksploitasi lengkap dari kerentanan uninitialized_oddball yang sebelumnya bocor.
Ringkasan
Artikel ini secara singkat membahas tentang bagaimana melakukan pembacaan arbitrer menggunakan kebocoran uninitialized_Oddball. Di V8, terdapat banyak nilai Sentinel lainnya, dan selama pengujian juga mudah menemui keruntuhan yang bukan int3. Mengingat Uninitialized_Oddball dan TheHole dapat menghindari perlindungan V8, nilai Sentinel lainnya juga mungkin memiliki masalah serupa.
Ini memberi kita beberapa wawasan:
Apakah kebocoran uninitialized_Oddball lainnya juga dapat dengan mudah mencapai RCE V8.
Google dengan cepat memperbaiki bypass TheHole, tetapi masalah memanfaatkan garbage collection untuk melewati ASLR telah lama ditangguhkan, yang menunjukkan apakah masalah serupa dianggap sebagai masalah keamanan resmi masih memiliki batasan yang tidak jelas.
Jika dianggap sebagai masalah keamanan formal, apakah di dalam fuzzer perlu mempertimbangkan untuk menambahkan nilai Sentinel seperti %TheHole/uninitialized_Oddball sebagai variabel, untuk menggali eksploitasi primitif lainnya.
Apakah masalah tersebut secara resmi dianggap sebagai masalah keamanan atau tidak, itu akan sangat memperpendek siklus bagi peretas untuk mencapai pemanfaatan penuh.
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.
Penelitian Kerentanan Sentinel Value pada Mesin V8: Mengakali Perlindungan untuk Melaksanakan Kode Sembarangan
Menyelidiki Penggunaan Nilai Sentinel untuk Mengatasi Mekanisme Perlindungan Chrome V8
Nilai sentinel adalah nilai khusus dalam algoritma, biasanya digunakan sebagai kondisi penghentian untuk algoritma perulangan atau rekursif. Dalam kode sumber Chrome terdapat berbagai nilai sentinel. Penelitian sebelumnya menunjukkan bahwa dengan membocorkan objek TheHole, eksekusi kode arbitrer dalam sandbox untuk beberapa CVE dapat dicapai. Tim Google dengan cepat memperbarui CVE terkait di GitHub sekitar seminggu setelah kami menerbitkan penjelasan tentang cara melewati mitigasi tersebut.
Dari kode sumber Chrome, dapat dilihat bahwa ada perbaikan mitigasi yang ditujukan pada objek TheHole yang menyebabkan eksekusi kode sembarangan. Namun, sebenarnya, masih banyak objek asli lain di V8 yang tidak seharusnya terungkap ke dalam JS. Artikel ini akan membahas objek Uninitialized Oddball, yang metode bypass-nya pertama kali muncul di Issue1352549. Perlu dicatat bahwa saat ini metode ini masih dapat digunakan di versi terbaru V8, dan Google belum memperbaiki hal ini.
Metode ini memiliki universalitas yang kuat:
Issue1216437(CVE-2021-30551) yang pertama kali diberikan POC adalah kebocoran internal uninitialized oddball.
Issue1314616(CVE-2022-1486) juga secara langsung mengungkapkan UninitializedOddball.
Dampak dari Issue1352549(NoCVE) tidak boleh diabaikan.
Semua ini menunjukkan perlunya meninjau kembali perangkat lunak yang mungkin terpengaruh oleh PatchGap.
Nilai Sentinel di V8
Sebagian besar objek bawaan V8 didefinisikan dalam file v8/src/roots/roots.h, dan mereka disusun berdampingan dalam memori. Begitu objek bawaan yang tidak seharusnya bocor ini bocor ke dalam JavaScript, itu dapat menyebabkan eksekusi kode arbitrer di dalam sandbox.
Untuk memverifikasi keefektifan metode ini di versi terbaru V8, kita dapat mengubah fungsi asli V8 %TheHole() agar mengembalikan Uninitialized Oddball.
Menghindari HardenType
Issue1352549 memberikan kode lengkap, setelah kami ekstrak dan sederhanakan, masih dapat mencapai pembacaan relatif sembarang di V8 11.0.0.
Untuk disassembly fungsi read JavaScript yang telah dioptimalkan, dapat dilihat bahwa saat memeriksa obj.prop, tidak ada pemeriksaan terhadap Value yang menggunakan obj.prop sebagai key, melainkan langsung menghitung offset untuk mendapatkan nilai array sesuai dengan semantik JavaScript. Ini menyebabkan kebingungan tipe saat perhitungan, yang memungkinkan pembacaan sembarangan.
Ketika uninitialized_oddball diteruskan, mulai dari obj, akhirnya dalam instruksi vmovsd xmm0,[r9+r11*8+0x7] dilakukan pembacaan sembarang, data disimpan dalam register xmm0.
Karena uninitialized_oddball memiliki urutan yang lebih awal dan lebih primitif dalam memori V8, pemalsuan lebih mudah, sehingga menjadi metode yang lebih disukai untuk melewati. Untuk penulisan sembarangan, dapat merujuk pada analisis konstruksi Issue1352549.
Saran perbaikan adalah menambahkan pemeriksaan pada array map saat fungsi yang dioptimalkan mengembalikan elemen array, untuk menghindari perhitungan offset langsung yang mengembalikan nilai array.
Peringatan PatchGap
Setelah menganalisis Issue1352549, kami menyelidiki perangkat lunak yang mungkin memiliki PatchGap, dan menemukan bahwa Skype hingga saat ini belum memperbaiki celah tersebut. Bacaan dan penulisan sembarang di x86 sedikit berbeda, karena tidak ada kompresi alamat, itu langsung relatif terhadap seluruh proses.
Dalam penggunaan Skype, meskipun ASLR telah diaktifkan, karena ukuran file yang besar, hacker hanya perlu membaca dan menulis pada alamat tetap tertentu, sehingga sangat mungkin untuk membaca dan menulis konten file Skype. Menggabungkan dengan pemahaman tradisional seperti analisis PE, tidak sulit untuk menyelesaikan seluruh rantai eksploitasi kerentanan.
PatchGap kali ini tidak hanya melibatkan Issue1352549, tetapi juga publikasi metode bypass baru yang secara signifikan mengurangi kesulitan eksploitasi yang mirip dengan Issue1314616 dan Issue1216437. Hacker hampir tidak perlu mengeluarkan biaya untuk penelitian, untuk dapat melakukan eksploitasi lengkap dari kerentanan uninitialized_oddball yang sebelumnya bocor.
Ringkasan
Artikel ini secara singkat membahas tentang bagaimana melakukan pembacaan arbitrer menggunakan kebocoran uninitialized_Oddball. Di V8, terdapat banyak nilai Sentinel lainnya, dan selama pengujian juga mudah menemui keruntuhan yang bukan int3. Mengingat Uninitialized_Oddball dan TheHole dapat menghindari perlindungan V8, nilai Sentinel lainnya juga mungkin memiliki masalah serupa.
Ini memberi kita beberapa wawasan:
Apakah kebocoran uninitialized_Oddball lainnya juga dapat dengan mudah mencapai RCE V8.
Google dengan cepat memperbaiki bypass TheHole, tetapi masalah memanfaatkan garbage collection untuk melewati ASLR telah lama ditangguhkan, yang menunjukkan apakah masalah serupa dianggap sebagai masalah keamanan resmi masih memiliki batasan yang tidak jelas.
Jika dianggap sebagai masalah keamanan formal, apakah di dalam fuzzer perlu mempertimbangkan untuk menambahkan nilai Sentinel seperti %TheHole/uninitialized_Oddball sebagai variabel, untuk menggali eksploitasi primitif lainnya.
Apakah masalah tersebut secara resmi dianggap sebagai masalah keamanan atau tidak, itu akan sangat memperpendek siklus bagi peretas untuk mencapai pemanfaatan penuh.