Abstrak
1. Pendahuluan
2. Latar Belakang
3. Model Ancaman
4. Menemukan Gadget Kebocoran Tag
5. Gadget TIKTAG
6. Serangan Dunia Nyata
6.1. Menyerang Chrome
7. Evaluasi
8. Karya Terkait
9. Kesimpulan Dan Referensi
\
Untuk mendemonstrasikan kemampuan eksploitasi gadget TIKTAG dalam mitigasi berbasis MTE, bagian ini mengembangkan dua serangan dunia nyata terhadap Chrome dan kernel Linux (Gambar 9). Ada beberapa tantangan dalam meluncurkan serangan dunia nyata menggunakan gadget TIKTAG. Pertama, gadget TIKTAG harus dieksekusi dalam ruang alamat target, mengharuskan penyerang untuk membuat atau menemukan gadget dari sistem target. Kedua, penyerang harus mengontrol dan mengamati status cache untuk membocorkan hasil pemeriksaan tag. Berikut ini, kami mendemonstrasikan serangan dunia nyata menggunakan gadget TIKTAG pada dua sistem dunia nyata: browser Google Chrome (§6.1) dan kernel Linux (§6.2), dan membahas strategi mitigasi.
\ 6.1. Menyerang Chrome
Browser Web browser adalah permukaan serangan utama untuk serangan berbasis web karena memproses konten web yang tidak tepercaya, seperti JavaScript dan HTML. Kami pertama-tama memberikan gambaran umum tentang model ancaman (§6.1.1) dan menyediakan gadget TIKTAG yang dibangun di mesin JavaScript V8 (§6.1.2). Kemudian, kami mendemonstrasikan efektivitas gadget TIKTAG dalam mengeksploitasi browser (§6.1.3) dan membahas strategi mitigasi (§6.1.4).
\ ==6.1.1. Model Ancaman.== Kami mengikuti model ancaman tipikal dari serangan browser Chrome, di mana penyerang bertujuan mengeksploitasi kerentanan korupsi memori dalam proses renderer. Kami mengasumsikan pengguna korban mengunjungi situs web yang dikontrol penyerang, yang menyajikan halaman web berbahaya. Halaman web tersebut mencakup HTML dan JavaScript yang dibuat khusus, yang mengeksploitasi kerentanan korupsi memori dalam proses renderer korban. Kami mengasumsikan semua teknik mitigasi mutakhir Chrome telah diterapkan, termasuk ASLR [18], CFI [15], isolasi situs [53], dan sandbox V8 [56]. Selain itu, sebagai pertahanan ortogonal, kami mengasumsikan bahwa proses renderer mengaktifkan penandaan MTE acak di PartitionAlloc [2].
\ ==6.1.2. Membangun Gadget TIKTAG.== Dalam lingkungan JavaScript V8, TIKTAG-v2 berhasil dibangun dan membocorkan tag MTE dari alamat memori mana pun. Namun, kami tidak menemukan gadget TIKTAG-v1 yang dapat dibangun, karena batasan waktu yang ketat antara BR dan CHECK tidak layak dalam teknik pelolosan sandbox V8 spekulatif kami (§A).
Gadget V8 TikTag-v2. Gambar 8 adalah gadget TIKTAG-v2 yang dibangun di mesin JavaScript V8 dan kode pseudo-C-nya setelah kompilasi JIT. Dengan gadget ini, penyerang dapat mengetahui apakah tag yang ditebak Tg cocok dengan tag Tm yang ditetapkan ke target_addr. Penyerang menyiapkan tiga array, slow, victim, probe, dan nilai idx. slow adalah Unit8Array dengan panjang 64 dan diakses di BR untuk memicu prediksi cabang yang salah. victim adalah Float64Array dengan panjang 64, yang diakses untuk memicu store-to-load forwarding. probe adalah Uint8Array dengan panjang 512, dan diakses di
\ TEST untuk membocorkan hasil pemeriksaan tag. Nilai idx tipe Number digunakan dalam akses out-of-bounds dari victim. Nilai idx dipilih sedemikian rupa sehingga victim[idx] menunjuk ke target_addr dengan tag tebakan Tg (yaitu, (Tg«56)|target_addr). Untuk mengakses target_addr secara spekulatif di luar sandbox V8, kami memanfaatkan teknik pelolosan sandbox V8 spekulatif yang kami temukan selama penelitian kami, yang kami rinci di §A. Baris 8 Gambar 8a adalah blok BR dari gadget TIKTAG-v2, memicu prediksi cabang yang salah dengan slow[0].
\ Baris 12-13 adalah blok CHECK, yang melakukan store-to-load forwarding dengan victim[idx], mengakses target_addr dengan tag tebakan Tg. Ketika kode ini dikompilasi JIT (Gambar 8b), pemeriksaan batas dilakukan, membandingkan idx terhadap victim.length. Jika idx adalah indeks out-of-bounds, kode mengembalikan undefined, tetapi jika field victim.length membutuhkan waktu lama untuk dimuat, CPU secara spekulatif mengeksekusi instruksi store dan load berikutnya.
\ Setelah itu, baris 17 mengimplementasikan blok TEST, yang mengakses probe dengan nilai yang diteruskan val sebagai indeks. Sekali lagi, pemeriksaan batas pada val terhadap panjang probe didahulukan, tetapi pemeriksaan ini berhasil karena PROBE_OFFSET lebih kecil dari panjang array probe. Akibatnya, probe[PROBE_OFFSET] di-cache hanya ketika store-to-load forwarding berhasil, yang merupakan kasus ketika Tg cocok dengan Tm.
\ ==6.1.3. Serangan bypass MTE Chrome.== Gambar 9a mengilustrasikan serangan bypass MTE keseluruhan pada browser Chrome dengan primitif kebocoran tag arbitrer dari gadget TIKTAG. Kami mengasumsikan kerentanan buffer overflow dalam proses renderer, di mana mengeksploitasi kerentanan temporal (misalnya, use-after-free) sebagian besar sama. Kerentanan overflow pointer (yaitu, vuln_ptr) ke objek yang rentan (yaitu, objvuln), merusak objek yang berdekatan (yaitu, objtarget).
\ Dengan penegakan MTE PartitionAlloc, dua objek memiliki tag yang berbeda dengan probabilitas 14/15. Untuk menghindari pengecualian, penyerang perlu memastikan bahwa tag objvuln dan objtarget sama. TIKTAG-v2 dapat digunakan untuk membocorkan tag objvuln ( 1 ) dan objtarget ( 2 ). Jika kedua tag yang bocor sama, penyerang mengeksploitasi kerentanan, yang tidak akan memunculkan kesalahan pemeriksaan tag ( 3 ). Jika tidak, penyerang membebaskan dan mengalokasikan kembali objtarget dan kembali ke langkah pertama sampai tag cocok.
\ ==Memicu Cache Side-Channel.== Untuk berhasil mengeksploitasi gadget TIKTAG, penyerang perlu memenuhi persyaratan berikut:
i) pelatihan cabang,
ii) kontrol cache, dan
iii) pengukuran cache. Ketiga persyaratan dapat dipenuhi dalam JavaScript.
Pertama, penyerang dapat melatih prediktor cabang dengan menjalankan gadget dengan slow[0] bukan nol dan idx dalam batas, dan memicu prediksi cabang yang salah di BR dengan nilai nol di slow[0] dan idx out-of-bounds.
Kedua, penyerang dapat menghapus baris cache slow[0], victim.length, dan probe[PROBE_OFFSET] dengan teknik pengusiran cache JavaScript [8, 21, 70].
Ketiga, penyerang dapat mengukur status cache probe[PROBE_OFFSET] dengan timer resolusi tinggi berdasarkan SharedArrayBuffer [16, 58].
\ ==Mengeksploitasi Kerentanan Korupsi Memori.== Dengan tag MTE yang bocor, penyerang dapat mengeksploitasi kerentanan korupsi memori spasial dan temporal dalam renderer. Strategi serangan sebagian besar sama dengan serangan korupsi memori tradisional tetapi harus memastikan bahwa kerentanan tidak memunculkan kesalahan pemeriksaan tag dengan memanfaatkan tag yang bocor. Kami merinci strategi serangan lebih lanjut di §C.
\ ==6.1.4. Mitigasi.== Untuk memitigasi serangan bypass MTE berbasis gadget TIKTAG dalam proses renderer browser, mitigasi berikut dapat diterapkan:
i) Sandbox yang sadar eksekusi spekulatif: Untuk menghentikan penyerang meluncurkan serangan berbasis TIKTAG dari lingkungan sandbox seperti sandbox V8, sandbox dapat diperkuat dengan mencegah akses memori spekulatif apa pun di luar wilayah memori sandbox. Meskipun browser web modern menggunakan sandbox untuk mengisolasi konten web yang tidak tepercaya dari renderer, mereka sering mengabaikan jalur spekulatif.
\ Misalnya, sandbox Chrome V8 [56] dan sandbox Safari Webkit [1] tidak sepenuhnya memediasi jalur spekulatif [27]. Berdasarkan teknik kompresi pointer saat ini [64], jalur spekulatif dapat dibatasi ke wilayah sandbox dengan menutupi bit tinggi dari pointer.
\ ii) Penghalang spekulasi: Seperti yang disarankan di §5, menempatkan penghalang spekulasi setelah BR untuk gadget TIKTAG potensial dapat mencegah serangan kebocoran tag spekulatif. Namun, mitigasi ini mungkin tidak berlaku dalam lingkungan browser yang kritis kinerja, karena dapat menimbulkan overhead kinerja yang signifikan.
\ iii) Pencegahan konstruksi gadget: Seperti yang disarankan di §5.2, gadget TIKTAG-v2 dapat dimitigasi dengan padding instruksi antara instruksi store dan load. Gadget TIKTAGv1, meskipun kami belum menemukan yang dapat dieksploitasi, dapat dimitigasi dengan padding instruksi antara cabang dan akses memori, seperti dijelaskan di §5.1.
\ 6.2. Menyerang Kernel Linux
Kernel Linux pada ARM banyak digunakan untuk perangkat mobile, server, dan perangkat IoT, menjadikannya target serangan yang menarik. Mengeksploitasi kerentanan korupsi memori dalam kernel dapat meningkatkan hak istimewa pengguna, dan dengan demikian MTE adalah mekanisme perlindungan yang menjanjikan untuk kernel Linux. Serangan berbasis TIKTAG terhadap kernel Linux menimbulkan tantangan unik yang berbeda dari serangan browser (§6.1).
\ Ini karena ruang alamat penyerang diisolasi dari ruang alamat kernel tempat gadget akan dieksekusi. Berikut ini, kami pertama-tama memberikan gambaran umum tentang model ancaman kernel Linux (§6.2.1) dan menyediakan gadget TIKTAG bukti konsep yang kami temukan di kernel Linux (§6.2.2). Akhirnya, kami mendemonstrasikan efektivitas gadget TIKTAG dalam mengeksploitasi kerentanan kernel Linux (§6.2.3).
\ ==6.2.1. Model Ancaman.== Model ancaman di sini sebagian besar sama dengan serangan eskalasi hak istimewa tipikal terhadap kernel. Secara khusus, kami fokus pada kernel Linux Android berbasis ARM, yang diperkuat dengan perlindungan kernel default (misalnya, KASLR, SMEP, SMAP, dan CFI). Kami lebih lanjut mengasumsikan kernel diperkuat dengan solusi penandaan acak MTE, mirip dengan solusi MTE siap produksi, Scudo [3].
\ Secara spesifik, setiap objek memori diberi tag secara acak, dan tag acak ditetapkan ketika objek dibebaskan, sehingga mencegah korupsi memori spasial dan temporal. Penyerang mampu menjalankan proses tanpa hak istimewa dan bertujuan untuk meningkatkan hak istimewa mereka dengan mengeksploitasi kerentanan korupsi memori dalam kernel. Diasumsikan bahwa penyerang mengetahui kerentanan korupsi memori kernel tetapi tidak mengetahui tag MTE apa pun dari memori kernel. Memicu korupsi memori antara objek kernel dengan
\ tag yang tidak cocok akan memunculkan kesalahan pemeriksaan tag, yang tidak diinginkan untuk eksploitasi dunia nyata. Satu tantangan kritis dalam serangan ini adalah bahwa gadget harus dibangun dengan menggunakan kembali kode kernel yang ada dan dieksekusi oleh system call yang dapat dipanggil penyerang. Karena arsitektur ARMv8 memisahkan tabel halaman pengguna dan kernel, gadget ruang pengguna tidak dapat mengakses memori kernel secara spekulatif. Pengaturan ini sangat berbeda dari model ancaman menyerang browser (§6.1), yang memanfaatkan kode yang disediakan penyerang untuk membangun gadget. Kami mengecualikan konstruksi gadget berbasis eBPF juga [17, 28], karena eBPF tidak tersedia untuk proses Android tanpa hak istimewa [33].
\ ==6.2.2. Gadget TikTag Kernel==. Seperti dijelaskan di §4.1, gadget TIKTAG harus memenuhi beberapa persyaratan, dan setiap persyaratan memerlukan tantangan dalam lingkungan kernel.
Pertama, di BR, prediksi cabang yang salah harus dipicu dengan cond_ptr, yang harus dapat dikontrol dari ruang pengguna. Karena prosesor AArch64 terbaru mengisolasi pelatihan prediksi cabang antara pengguna dan kernel [33], pelatihan cabang perlu dilakukan dari ruang kernel.
Kedua, di CHECK, guess_ptr harus di-dereference. guess_ptr harus dibuat dari ruang pengguna sedemikian rupa sehingga menyematkan tag tebakan (Tg) dan menunjuk ke alamat kernel (yaitu, target_addr) untuk membocorkan tag (Tm). Tidak seperti lingkungan JavaScript browser (§6.1), data yang disediakan pengguna sangat disanitasi dalam system call, sehingga sulit untuk membuat pointer kernel arbitrer.
\ Misalnya, access_ok() memastikan bahwa pointer yang disediakan pengguna menunjuk ke ruang pengguna, dan makro array_index_nospec mencegah akses out-of-bounds spekulatif dengan indeks yang disediakan pengguna. Dengan demikian, guess_ptr harus berupa pointer kernel yang ada, khususnya pointer yang rentan yang menyebabkan korupsi memori. Misalnya, pointer menggantung dalam use-after-free (UAF) atau pointer out-of-bounds dalam buffer overflow dapat digunakan. Terakhir, di TEST, test_ptr harus di-dereference, dan test_ptr harus dapat diakses dari ruang pengguna. Untuk memudahkan pengukuran status cache, test_ptr harus berupa pointer ruang pengguna yang disediakan melalui argumen system call.
\ ==Gadget yang Ditemukan.== Kami secara manual menganalisis kode sumber kernel Linux untuk menemukan gadget TIKTAG yang memenuhi persyaratan tersebut di atas. Hasilnya, kami menemukan satu gadget TIKTAG-v1 yang berpotensi dapat dieksploitasi di snd_timer_user_read() (Gambar 10). Gadget ini memenuhi persyaratan TIKTAG-v1 (§5.1). Pada baris 10 (yaitu, BR), pernyataan switch memicu prediksi cabang yang salah dengan nilai yang dapat dikontrol pengguna tu->tread (yaitu, cond_ptr). Pada baris 14-17 (yaitu, CHECK), tread (yaitu, guess_ptr) di-dereference oleh empat instruksi load. tread menunjuk ke objek struct snd_timer_tread64 yang dapat dialokasikan dan dibebaskan secara arbitrer oleh penyerang.
\ Jika kerentanan temporal mengubah tread menjadi pointer menggantung, itu dapat digunakan sebagai guess_ptr. Pada baris 20, (yaitu, TEST), buffer pointer ruang pengguna (yaitu, test_ptr) di-dereference di copy_to_user. Karena gadget ini tidak dapat langsung dijangkau dari ruang pengguna, kami membuat sedikit modifikasi pada kode kernel; kami menghapus return awal untuk kasus default pada baris 6. Ini memastikan bahwa buffer hanya diakses dalam jalur spekulatif untuk mengamati perbedaan status cache karena eksekusi spekulatif.
\ Meskipun modifikasi ini tidak realistis dalam skenario dunia nyata, ini mendemonstrasikan potensi kemampuan eksploitasi gadget jika perubahan kode serupa dilakukan. Kami menemukan beberapa gadget lagi yang berpotensi dapat dieksploitasi, tetapi kami tidak dapat mengamati perbedaan status cache antara kecocokan dan ketidakcocokan tag. Namun, kami berpikir ada potensi kuat untuk mengeksploitasi gadget tersebut. Meluncurkan serangan berbasis TIKTAG melibatkan rekayasa yang kompleks dan sensitif, dan dengan demikian kami tidak dapat bereksperimen dengan semua kasus yang mungkin.
\ Khususnya, TIKTAG-v1 bergantung pada penyusutan spekulasi pada peristiwa jalur yang salah, yang mungkin juga mencakup kesalahan terjemahan alamat atau pengecualian lain dalam jalur prediksi cabang yang salah. Karena system call melibatkan aliran kontrol yang kompleks, penyusutan spekulasi mungkin tidak dipicu seperti yang diharapkan. Selain itu, beberapa gadget mungkin menjadi dapat dieksploitasi ketika kode kernel berubah. Misalnya, gadget TIKTAG-v1 di ip6mr_ioctl() tidak menunjukkan perilaku kebocoran tag MTE ketika dipanggil dari jalur system call-nya (yaitu, ioctl). Namun, gadget memiliki kebocoran tag ketika dipindahkan ke syscall lain (misalnya, write) dengan aliran kontrol sederhana.
\ ==6.2.3. Serangan bypass MTE kernel.== Gambar 9b mengilustrasikan serangan bypass MTE pada kernel Linux. Mengambil kerentanan use-after-free sebagai contoh, kami mengasumsikan penyerang telah mengidentifikasi gadget TIKTAG yang sesuai, SysTikTagUAF(), yang mampu membocorkan hasil pemeriksaan tag dari pointer menggantung yang dibuat oleh kerentanan. Misalnya, gadget TIKTAG-v1 di snd_timer_user_read() (Gambar 10) dapat membocorkan hasil pemeriksaan tag tread, yang dapat menjadi pointer menggantung oleh kerentanan use-after-free atau double-free.
\ Serangan berlangsung sebagai berikut: Pertama, penyerang membebaskan objek kernel (yaitu, objvuln) dan meninggalkan pointernya (yaitu, vuln_ptr) sebagai pointer menggantung ( 1 ). Selanjutnya, penyerang mengalokasikan objek kernel lain (yaitu, objtarget) di alamat objvuln dengan SysAllocTarget() ( 2 ). Kemudian, penyerang memanggil SysTikTag() dengan buffer ruang pengguna (yaitu, ubuf) ( 3 ), dan membocorkan hasil pemeriksaan tag (yaitu, Tm == Tg) dengan mengukur latensi akses ubuf ( 4 ). Jika tag cocok, penyerang memicu SysExploitUAF(), system call yang mengeksploitasi kerentanan use-after-free ( 5 ). Jika tidak, penyerang mengalokasikan kembali objtarget sampai tag cocok.
\ ==Memicu Cache Side-Channel.== Seperti di §6.1.3, eksploitasi gadget TIKTAG yang berhasil memerlukan i) pelatihan cabang, ii) kontrol cache, dan iii) pengukuran cache. Untuk pelatihan cabang, penyerang dapat melatih prediktor cabang dan memicu spekulasi dengan kondisi cabang yang dikontrol pengguna dari ruang pengguna. Untuk kontrol cache, penyerang dapat flush buffer ruang pengguna (yaitu, ubuf), sementara alamat memori kernel dapat dihapus dengan cache line bouncing [25]. Untuk pengukuran cache, latensi akses ubuf dapat diukur dengan counter virtual (yaitu, CNTVCT_EL0) atau timer berbasis memory counter (yaitu, resolusi siklus CPU mendekati).
\ ==Mengeksploitasi Kerentanan Korupsi Memori.== Gadget TIKTAG memungkinkan bypass MTE dan mengeksploitasi kerentanan korupsi memori kernel. Penyerang dapat memanggil gadget TIKTAG di kernel untuk secara spekulatif memicu korupsi memori dan mendapatkan hasil pemeriksaan tag. Kemudian, penyerang dapat mendapatkan hasil pemeriksaan tag, dan memicu korupsi memori hanya jika tag cocok. Kami merinci proses serangan bypass MTE kernel Linux di §D.
\ ==6.2.4. Mitigasi.== Untuk memitigasi gadget TIKTAG di kernel Linux, pengembang kernel harus mempertimbangkan mitigasi berikut:
i) Penghalang spekulasi: Penghalang spekulasi dapat secara efektif memitigasi gadget TIKTAG-v1 di kernel Linux. Untuk mencegah penyerang membocorkan hasil pemeriksaan tag melalui buffer ruang pengguna, fungsi kernel yang mengakses alamat ruang pengguna, seperti copy_to_user dan copy_from_user, dapat diperkuat dengan penghalang spekulasi. Seperti dijelaskan di §5.1, membocorkan hasil pemeriksaan tag dengan akses store dapat dimitigasi dengan menempatkan penghalang spekulasi sebelum akses store (yaitu, TEST).
\ Misalnya, untuk memitigasi gadget yang memanfaatkan copy_to_user, penghalang spekulasi dapat disisipkan sebelum pemanggilan copy_to_user. Untuk gadget yang memanfaatkan akses load ke buffer ruang pengguna, penghalang memitigasi gadget jika disisipkan antara cabang dan akses memori kernel (yaitu, CHECK). Misalnya, untuk memitigasi gadget yang memanfaatkan copy_from_user, pengembang kernel harus dengan hati-hati menganalisis basis kode kernel untuk menemukan pola cabang kondisional, akses memori kernel, dan copy_from_user(), dan menyisipkan penghalang spekulasi antara cabang dan akses memori kernel.
\ ii) Pencegahan konstruksi gadget: Untuk menghilangkan gadget TIKTAG potensial di kernel Linux, kode sumber kernel dapat dianalisis dan dipatch. Karena gadget TIKTAG juga dapat dibangun oleh optimisasi compiler, analisis biner dapat dilakukan. Untuk setiap gadget yang ditemukan, instruksi dapat diurutkan ulang atau instruksi tambahan dapat disisipkan untuk mencegah konstruksi gadget, mengikuti strategi mitigasi di §5.1 dan §5.2.
:::info Penulis:
:::
:::info Makalah ini tersedia di arxiv di bawah lisensi CC 4.0.
:::
\


