Abstrak
1. Pengenalan
2. Latar Belakang
3. Model Ancaman
4. Mencari Gadget Kebocoran Tag
5. Gadget TIKTAG
6. Serangan Dunia Sebenar
6.1. Menyerang Chrome
7. Penilaian
8. Kerja Berkaitan
9. Kesimpulan Dan Rujukan
\
Untuk menunjukkan keboleheksploitasian gadget TIKTAG dalam mitigasi berasaskan MTE, bahagian ini membangunkan dua serangan dunia sebenar terhadap Chrome dan kernel Linux (Rajah 9). Terdapat beberapa cabaran untuk melancarkan serangan dunia sebenar menggunakan gadget TIKTAG. Pertama, gadget TIKTAG harus dilaksanakan dalam ruang alamat sasaran, memerlukan penyerang membina atau mencari gadget dari sistem sasaran. Kedua, penyerang harus mengawal dan memerhatikan keadaan cache untuk membocorkan hasil pemeriksaan tag. Dalam bahagian berikut, kami menunjukkan serangan dunia sebenar menggunakan gadget TIKTAG pada dua sistem dunia sebenar: pelayar Google Chrome (§6.1) dan kernel Linux (§6.2), dan membincangkan strategi mitigasi.
\ 6.1. Menyerang Chrome
Pelayar Web pelayar web adalah permukaan serangan utama untuk serangan berasaskan web kerana ia memproses kandungan web yang tidak dipercayai, seperti JavaScript dan HTML. Kami mula-mula mengulas model ancaman (§6.1.1) dan menyediakan gadget TIKTAG yang dibina dalam enjin JavaScript V8 (§6.1.2). Kemudian, kami menunjukkan keberkesanan gadget TIKTAG dalam mengeksploitasi pelayar (§6.1.3) dan membincangkan strategi mitigasi (§6.1.4).
\ ==6.1.1. Model Ancaman.== Kami mengikuti model ancaman tipikal serangan pelayar Chrome, di mana penyerang bertujuan untuk mengeksploitasi kerentanan rasuah memori dalam proses renderer. Kami menganggap pengguna mangsa melawat laman web yang dikawal penyerang, yang menyajikan halaman web berniat jahat. Halaman web tersebut termasuk HTML dan JavaScript yang direka khas, yang mengeksploitasi kerentanan rasuah memori dalam proses renderer mangsa. Kami menganggap semua teknik mitigasi terkini Chrome telah dilaksanakan, termasuk ASLR [18], CFI [15], pengasingan tapak [53], dan kotak pasir V8 [56]. Selain itu, sebagai pertahanan ortogonal, kami menganggap bahawa proses renderer membolehkan penandaan MTE rawak dalam PartitionAlloc [2].
\ ==6.1.2. Membina Gadget TIKTAG.== Dalam persekitaran JavaScript V8, TIKTAG-v2 berjaya dibina dan membocorkan tag MTE bagi mana-mana alamat memori. Walau bagaimanapun, kami tidak menemui gadget TIKTAG-v1 yang boleh dibina, kerana kekangan masa yang ketat antara BR dan CHECK tidak dapat dilaksanakan dalam teknik pelarian kotak pasir V8 spekulatif kami (§A).
Gadget V8 TikTag-v2. Rajah 8 adalah gadget TIKTAG-v2 yang dibina dalam enjin JavaScript V8 dan kod pseudo-C selepas kompilasi JIT. Dengan gadget ini, penyerang boleh mengetahui sama ada tag yang diteka Tg sepadan dengan tag Tm yang diberikan kepada target_addr. Penyerang menyediakan tiga array, slow, victim, probe, dan nilai idx. slow adalah Unit8Array dengan panjang 64 dan diakses dalam BR untuk mencetuskan salah ramalan cawangan. victim adalah Float64Array dengan panjang 64, yang diakses untuk mencetuskan pemajuan store-ke-load. probe adalah Uint8Array dengan panjang 512, dan diakses dalam
\ TEST untuk membocorkan hasil pemeriksaan tag. Nilai idx jenis Number digunakan dalam akses luar had victim. Nilai idx dipilih supaya victim[idx] menunjuk kepada targetaddr dengan tag yang diteka Tg (iaitu, (Tg«56)|targetaddr). Untuk mengakses target_addr secara spekulatif di luar kotak pasir V8, kami memanfaatkan teknik pelarian kotak pasir V8 spekulatif yang kami temui semasa penyelidikan kami, yang kami perincikan dalam §A. Baris 8 Rajah 8a adalah blok BR gadget TIKTAG-v2, mencetuskan salah ramalan cawangan dengan slow[0].
\ Baris 12-13 adalah blok CHECK, yang melaksanakan pemajuan store-ke-load dengan victim[idx], mengakses target_addr dengan tag yang diteka Tg. Apabila kod ini dikompilasi JIT (Rajah 8b), pemeriksaan had dilakukan, membandingkan idx dengan victim.length. Jika idx adalah indeks luar had, kod mengembalikan undefined, tetapi jika medan victim.length mengambil masa yang lama untuk dimuatkan, CPU secara spekulatif melaksanakan arahan store dan load berikutnya.
\ Selepas itu, baris 17 melaksanakan blok TEST, yang mengakses probe dengan nilai yang dimajukan val sebagai indeks. Sekali lagi, pemeriksaan had pada val terhadap panjang probe didahului, tetapi pemeriksaan ini berjaya kerana PROBEOFFSET lebih kecil daripada panjang array probe. Hasilnya, probe[PROBEOFFSET] di-cache hanya apabila pemajuan store-ke-load berjaya, iaitu apabila Tg sepadan dengan Tm.
\ ==6.1.3. Serangan pintasan MTE Chrome.== Rajah 9a menggambarkan serangan pintasan MTE keseluruhan pada pelayar Chrome dengan primitif kebocoran tag sewenang-wenangnya gadget TIKTAG. Kami menganggap kerentanan limpahan buffer dalam proses renderer, di mana mengeksploitasi kerentanan temporal (cth., use-after-free) sebahagian besarnya sama. Kerentanan tersebut melimpahkan penunjuk (iaitu, vuln_ptr) kepada objek yang terdedah (iaitu, objvuln), merosakkan objek bersebelahan (iaitu, objtarget).
\ Dengan penguatkuasaan MTE PartitionAlloc, dua objek mempunyai tag yang berbeza dengan kebarangkalian 14/15. Untuk mengelakkan pengecualian, penyerang perlu memastikan bahawa tag objvuln dan objtarget adalah sama. TIKTAG-v2 boleh digunakan untuk membocorkan tag objvuln ( 1 ) dan objtarget ( 2 ). Jika kedua-dua tag yang dibocorkan adalah sama, penyerang mengeksploitasi kerentanan, yang tidak akan menimbulkan kesalahan pemeriksaan tag ( 3 ). Jika tidak, penyerang membebaskan dan mengagihkan semula objtarget dan kembali ke langkah pertama sehingga tag sepadan.
\ ==Mencetuskan Saluran Sisi Cache.== Untuk berjaya mengeksploitasi gadget TIKTAG, penyerang perlu memenuhi keperluan berikut:
i) latihan cawangan,
ii) kawalan cache, dan
iii) pengukuran cache. Ketiga-tiga keperluan boleh dipenuhi dalam JavaScript.
Pertama, penyerang boleh melatih peramal cawangan dengan menjalankan gadget dengan slow[0] bukan sifar dan idx dalam had, dan mencetuskan salah ramalan cawangan dalam BR dengan nilai sifar dalam slow[0] dan idx luar had.
Kedua, penyerang boleh mengusir baris cache slow[0], victim.length, dan probe[PROBE_OFFSET] dengan teknik pengusiran cache JavaScript [8, 21, 70].
Ketiga, penyerang boleh mengukur status cache probe[PROBE_OFFSET] dengan pemasa resolusi tinggi berdasarkan SharedArrayBuffer [16, 58].
\ ==Mengeksploitasi Kerentanan Rasuah Memori.== Dengan tag MTE yang dibocorkan, penyerang boleh mengeksploitasi kerentanan rasuah memori spatial dan temporal dalam renderer. Strategi serangan sebahagian besarnya sama dengan serangan rasuah memori tradisional tetapi harus memastikan bahawa kerentanan tidak menimbulkan kesalahan pemeriksaan tag dengan menggunakan tag yang dibocorkan. Kami memperincikan lagi strategi serangan dalam §C.
\ ==6.1.4. Mitigasi.== Untuk mengurangkan serangan pintasan MTE berasaskan gadget TIKTAG dalam proses renderer pelayar, mitigasi berikut boleh digunakan:
i) Kotak pasir sedar pelaksanaan spekulatif: Untuk menghentikan penyerang daripada melancarkan serangan berasaskan TIKTAG dari persekitaran kotak pasir seperti kotak pasir V8, kotak pasir boleh diperkukuhkan dengan menghalang sebarang akses memori spekulatif di luar kawasan memori kotak pasir. Walaupun pelayar web moden menggunakan kotak pasir untuk mengasingkan kandungan web yang tidak dipercayai daripada renderer, mereka sering mengabaikan laluan spekulatif.
\ Sebagai contoh, kotak pasir Chrome V8 [56] dan kotak pasir Safari Webkit [1] tidak menjadi perantara sepenuhnya laluan spekulatif [27]. Berdasarkan teknik mampatan penunjuk semasa [64], laluan spekulatif boleh dihadkan kepada kawasan kotak pasir dengan menutup bit tinggi penunjuk.
\ ii) Penghalang spekulasi: Seperti yang dicadangkan dalam §5, meletakkan penghalang spekulasi selepas BR untuk gadget TIKTAG yang berpotensi boleh menghalang serangan kebocoran tag spekulatif. Walau bagaimanapun, mitigasi ini mungkin tidak boleh digunakan dalam persekitaran pelayar kritikal prestasi, kerana ia mungkin memperkenalkan overhed prestasi yang ketara.
\ iii) Pencegahan pembinaan gadget: Seperti yang dicadangkan dalam §5.2, gadget TIKTAG-v2 boleh dikurangkan dengan menambah arahan antara arahan store dan load. Gadget TIKTAGv1, walaupun kami belum menemui yang boleh dieksploitasi, boleh dikurangkan dengan menambah arahan antara cawangan dan akses memori, seperti yang diterangkan dalam §5.1.
\ 6.2. Menyerang Kernel Linux
Kernel Linux pada ARM digunakan secara meluas untuk peranti mudah alih, pelayan, dan peranti IoT, menjadikannya sasaran serangan yang menarik. Mengeksploitasi kerentanan rasuah memori dalam kernel boleh meningkatkan keistimewaan pengguna, dan oleh itu MTE adalah mekanisme perlindungan yang menjanjikan untuk kernel Linux. Serangan berasaskan TIKTAG terhadap kernel Linux menimbulkan cabaran unik yang berbeza daripada serangan pelayar (§6.1).
\ Ini kerana ruang alamat penyerang diasingkan daripada ruang alamat kernel di mana gadget akan dilaksanakan. Dalam bahagian berikut, kami mula-mula mengulas model ancaman kernel Linux (§6.2.1) dan menyediakan gadget TIKTAG bukti konsep yang kami temui dalam kernel Linux (§6.2.2). Akhir sekali, kami menunjukkan keberkesanan gadget TIKTAG dalam mengeksploitasi kerentanan kernel Linux (§6.2.3).
\ ==6.2.1. Model Ancaman.== Model ancaman di sini sebahagian besarnya sama dengan serangan peningkatan keistimewaan tipikal terhadap kernel. Secara khusus, kami memberi tumpuan kepada kernel Linux Android berasaskan ARM, yang diperkukuhkan dengan perlindungan kernel lalai (cth., KASLR, SMEP, SMAP, dan CFI). Kami seterusnya menganggap kernel diperkukuhkan dengan penyelesaian penandaan rawak MTE, serupa dengan penyelesaian MTE sedia pengeluaran, Scudo [3].
\ Secara khusus, setiap objek memori ditandai secara rawak, dan tag rawak diberikan apabila objek dibebaskan, dengan itu menghalang rasuah memori spatial dan temporal. Penyerang mampu menjalankan proses tanpa keistimewaan dan bertujuan untuk meningkatkan keistimewaan mereka dengan mengeksploitasi kerentanan rasuah memori dalam kernel. Diandaikan bahawa penyerang mengetahui kerentanan rasuah memori kernel tetapi tidak mengetahui sebarang tag MTE memori kernel. Mencetuskan rasuah memori antara objek kernel dengan
\ tag yang tidak sepadan akan menimbulkan kesalahan pemeriksaan tag, yang tidak diingini untuk eksploitasi dunia sebenar. Satu cabaran kritikal dalam serangan ini ialah gadget harus dibina dengan menggunakan semula kod kernel sedia ada dan dilaksanakan oleh panggilan sistem yang boleh dipanggil oleh penyerang. Memandangkan seni bina ARMv8 memisahkan jadual halaman pengguna dan kernel, gadget ruang pengguna tidak boleh mengakses memori kernel secara spekulatif. Persediaan ini sangat berbeza daripada model ancaman menyerang pelayar (§6.1), yang memanfaatkan kod yang disediakan penyerang untuk membina gadget. Kami mengecualikan pembinaan gadget berasaskan eBPF juga [17, 28], kerana eBPF tidak tersedia untuk proses Android tanpa keistimewaan [33].
\ ==6.2.2. Gadget TikTag Kernel==. Seperti yang diterangkan dalam §4.1, gadget TIKTAG harus memenuhi beberapa keperluan, dan setiap keperluan memerlukan cabaran dalam persekitaran kernel.
Pertama, dalam BR, salah ramalan cawangan harus dicetuskan dengan cond_ptr, yang harus boleh dikawal dari ruang pengguna. Memandangkan pemproses AArch64 terkini mengasingkan latihan ramalan cawangan antara pengguna dan kernel [33], latihan cawangan perlu dilakukan dari ruang kernel.
Kedua, dalam CHECK, guessptr harus dirujuk. guessptr harus direka dari ruang pengguna supaya ia memasukkan tag teka (Tg) dan menunjuk kepada alamat kernel (iaitu, target_addr) untuk membocorkan tag (Tm). Tidak seperti persekitaran JavaScript pelayar (§6.1), data yang disediakan pengguna sangat dibersihkan dalam panggilan sistem, jadi sukar untuk mencipta penunjuk kernel sewenang-wenangnya.
\ Sebagai contoh, accessok() memastikan bahawa penunjuk yang disediakan pengguna menunjuk kepada ruang pengguna, dan makro arrayindexnospec menghalang akses luar had spekulatif dengan indeks yang disediakan pengguna. Oleh itu, guessptr harus menjadi penunjuk kernel sedia ada, khususnya penunjuk terdedah yang menyebabkan rasuah memori. Sebagai contoh, penunjuk terumbang dalam use-after-free (UAF) atau penunjuk luar had dalam limpahan buffer boleh digunakan. Akhir sekali, dalam TEST, testptr harus dirujuk, dan testptr harus boleh diakses dari ruang pengguna. Untuk memudahkan pengukuran keadaan cache, test_ptr harus menjadi penunjuk ruang pengguna yang disediakan melalui argumen panggilan sistem.
\ ==Gadget yang Ditemui.== Kami menganalisis secara manual kod sumber kernel Linux untuk mencari gadget TIKTAG yang memenuhi keperluan yang disebutkan di atas. Hasilnya, kami menemui satu gadget TIKTAG-v1 yang berpotensi boleh dieksploitasi dalam sndtimeruserread() (Rajah 10). Gadget ini memenuhi keperluan TIKTAG-v1 (§5.1). Pada baris 10 (iaitu, BR), pernyataan switch mencetuskan salah ramalan cawangan dengan nilai yang boleh dikawal pengguna tu->tread (iaitu, condptr). Pada baris 14-17 (iaitu, CHECK), tread (iaitu, guessptr) dirujuk oleh empat arahan load. tread menunjuk kepada objek struct sndtimer_tread64 yang boleh diagihkan dan dibebaskan oleh penyerang secara sewenang-wenangnya.
\ Jika kerentanan temporal mengubah tread menjadi penunjuk terumbang, ia boleh digunakan sebagai guessptr. Pada baris 20, (iaitu, TEST), buffer penunjuk ruang pengguna (iaitu, testptr) dirujuk dalam copytouser. Memandangkan gadget ini tidak boleh dicapai secara langsung dari ruang pengguna, kami membuat pengubahsuaian sedikit pada kod kernel; kami mengeluarkan pulangan awal untuk kes lalai pada baris 6. Ini memastikan bahawa buffer hanya diakses dalam laluan spekulatif untuk memerhatikan perbezaan keadaan cache akibat pelaksanaan spekulatif.
\ Walaupun pengubahsuaian ini tidak realistik dalam senario dunia sebenar, ia menunjukkan potensi keboleheksploitasian gadget jika perubahan kod serupa dibuat. Kami menemui beberapa lagi gadget yang berpotensi boleh dieksploitasi, tetapi kami tidak dapat memerhatikan perbezaan keadaan cache antara padanan tag dan ketidakpadanan. Namun, kami fikir terdapat potensi yang kuat untuk mengeksploitasi gadget tersebut. Melancarkan serangan berasaskan TIKTAG melibatkan kejuruteraan yang kompleks dan sensitif, dan oleh itu kami tidak dapat bereksperimen dengan semua kes yang mungkin.
\ Terutamanya, TIKTAG-v1 bergantung pada pengecutan spekulasi pada peristiwa laluan salah, yang mungkin juga termasuk kesalahan terjemahan alamat atau pengecualian lain dalam laluan salah ramalan cawangan. Memandangkan panggilan sistem melibatkan aliran kawalan yang kompleks, pengecutan spekulasi mungkin tidak dicetuskan seperti yang dijangkakan. Selain itu, beberapa gadget mungkin menjadi boleh dieksploitasi apabila kod kernel berubah. Sebagai contoh, gadget TIKTAG-v1 dalam ip6mr_ioctl() tidak mempamerkan tingkah laku kebocoran tag MTE apabila dipanggil dari laluan panggilan sistemnya (iaitu, ioctl). Walau bagaimanapun, gadget mempunyai kebocoran tag apabila ia dipindahkan ke syscall lain (cth., write) dengan aliran kawalan yang mudah.
\ ==6.2.3. Serangan pintasan MTE Kernel.== Rajah 9b menggambarkan serangan pintasan MTE pada kernel Linux. Mengambil kerentanan use-afterfree sebagai contoh, kami menganggap penyerang telah mengenal pasti gadget TIKTAG yang sepadan, SysTikTagUAF(), yang mampu membocorkan hasil pemeriksaan tag penunjuk terumbang yang dicipta oleh kerentanan. Sebagai contoh, gadget TIKTAG-v1 dalam sndtimeruser_read() (Rajah 10) boleh membocorkan hasil pemeriksaan tag tread, yang boleh menjadi penunjuk terumbang oleh kerentanan use-after-free atau double-free.
\ Serangan berjalan seperti berikut: Pertama, penyerang membebaskan objek kernel (iaitu, objvuln) dan meninggalkan penunjuknya (iaitu, vuln_ptr) sebagai penunjuk terumbang ( 1 ). Seterusnya, penyerang mengagihkan objek kernel lain (iaitu, objtarget) pada alamat objvuln dengan SysAllocTarget() ( 2 ). Kemudian, penyerang memanggil SysTikTag() dengan buffer ruang pengguna (iaitu, ubuf) ( 3 ), dan membocorkan hasil pemeriksaan tag (iaitu, Tm == Tg) dengan mengukur latensi akses ubuf ( 4 ). Jika tag sepadan, penyerang mencetuskan SysExploitUAF(), panggilan sistem yang mengeksploitasi kerentanan use-after-free ( 5 ). Jika tidak, penyerang mengagihkan semula objtarget sehingga tag sepadan.
\ ==Mencetuskan Saluran Sisi Cache.== Seperti dalam §6.1.3, eksploitasi gadget TIKTAG yang berjaya memerlukan i) latihan cawangan, ii) kawalan cache, dan iii) pengukuran cache. Untuk latihan cawangan, penyerang boleh melatih peramal cawangan dan mencetuskan spekulasi dengan syarat cawangan yang dikawal pengguna dari ruang pengguna. Untuk kawalan cache, penyerang boleh membuang buffer ruang pengguna (iaitu, ubuf), manakala alamat memori kernel boleh diusir dengan lantunan baris cache [25]. Untuk pengukuran cache, latensi akses ubuf boleh diukur dengan pengira maya (iaitu, CNTVCT_EL0) atau pemasa berasaskan pengira memori (iaitu, resolusi kitaran CPU berhampiran).
\ ==Mengeksploitasi Kerentanan Rasuah Memori.== Gadget TIKTAG membolehkan melepasi MTE dan mengeksploitasi kerentanan rasuah memori kernel. Penyerang boleh memanggil gadget TIKTAG dalam kernel untuk mencetuskan rasuah memori secara spekulatif dan mendapatkan hasil pemeriksaan tag. Kemudian, penyerang boleh mendapatkan hasil pemeriksaan tag, dan mencetuskan rasuah memori hanya jika tag sepadan. Kami memperincikan proses serangan pintasan MTE kernel Linux dalam §D.
\ ==6.2.4. Mitigasi.== Untuk mengurangkan gadget TIKTAG dalam kernel Linux, pembangun kernel harus mempertimbangkan mitigasi berikut:
i) Penghalang spekulasi: Penghalang spekulasi boleh mengurangkan gadget TIKTAG-v1 dengan berkesan dalam kernel Linux. Untuk menghalang penyerang daripada membocorkan hasil pemeriksaan tag melalui buffer ruang pengguna, fungsi kernel yang mengakses alamat ruang pengguna, seperti copytouser dan copyfromuser, boleh diperkukuhkan dengan penghalang spekulasi. Seperti yang diterangkan dalam §5.1, membocorkan hasil pemeriksaan tag dengan akses store boleh dikurangkan dengan meletakkan penghalang spekulasi sebelum akses store (iaitu, TEST).
\ Sebagai contoh, untuk mengurangkan gadget yang memanfaatkan copytouser, penghalang spekulasi boleh dimasukkan sebelum panggilan copytouser. Untuk gadget yang menggunakan akses load ke buffer ruang pengguna, penghalang mengurangkan gadget jika dimasukkan antara cawangan dan akses memori kernel (iaitu, CHECK). Sebagai contoh, untuk mengurangkan gadget yang memanfaatkan copyfromuser, pembangun kernel harus menganalisis dengan teliti pangkalan kod kernel untuk mencari corak cawangan bersyarat, akses memori kernel, dan copyfromuser(), dan memasukkan penghalang spekulasi antara cawangan dan akses memori kernel.
\ ii) Pencegahan pembinaan gadget: Untuk menghapuskan gadget TIKTAG yang berpotensi dalam kernel Linux, kod sumber kernel boleh dianalisis dan ditampal. Memandangkan gadget TIKTAG juga boleh dibina oleh pengoptimuman pengkompil, analisis binari boleh dijalankan. Untuk setiap gadget yang ditemui, arahan boleh disusun semula atau arahan tambahan boleh dimasukkan untuk menghalang pembinaan gadget, mengikuti strategi mitigasi dalam §5.1 dan §5.2.
:::info Pengarang:
:::
:::info Kertas ini tersedia di arxiv di bawah lesen CC 4.0.
:::
\


复制链接X (Twitter)LinkedInFacebook电邮
XRP ETF 净资产突破12.5亿美元