Seperti yang Anda ketahui, kode yang dieksekusi dalam kantong sangat terbatas fungsinya. Dia tidak dapat melakukan panggilan sistem. Itu tidak dapat melakukan operasi I / O. Dia tidak tahu alamat dasar dari segmen kode host. Itu tidak bisa jmp dan memanggil kode host. Dia tidak tahu tentang struktur ruang alamat yang memandu aplikasi host (misalnya, halaman mana yang dipromosikan atau jenis data apa yang ditempatkan pada halaman ini). Dia tidak dapat meminta sistem operasi untuk menambahkan sepotong memori ke aplikasi host (misalnya, melalui / proc / pid / maps). Upaya naif untuk membaca area memori acak sembarang dari aplikasi host - belum lagi upaya tulis - cepat atau lambat (lebih dulu yang pertama) akan mengarah pada penghentian paksa program enclave. Ini terjadi setiap kali area ruang alamat virtual yang diminta oleh enklave tidak dapat diakses oleh aplikasi host.
Dengan kenyataan pahit seperti itu, apakah penulis virus dapat menggunakan kantong SGX untuk mewujudkan tujuan jahatnya?
- Retas untuk menyelidiki alamat untuk kemungkinan membacanya
- Retas untuk menyelidiki alamat untuk kemampuan menulis
- Retas untuk mengarahkan aliran kontrol
- Apa yang memberi penjahat tiga retasan yang tercantum di atas
- Bagaimana penjahat menggunakan peretasan ini untuk membuat ranzomvari

Berdasarkan semua hal di atas, secara umum diterima bahwa enklave hanya mampu melayani aplikasi host, dan enklave tidak dapat mengambil inisiatif sendiri, termasuk berbahaya. Ini berarti bahwa kantong tidak mewakili nilai praktis untuk penulis virus. Asumsi tergesa-gesa ini adalah salah satu alasan mengapa perlindungan SGX asimetris: kode aplikasi host tidak dapat mengakses memori kantong, sementara kode kantong dapat membaca dan menulis ke alamat memori aplikasi host.
Oleh karena itu, jika kode enklave berbahaya berhasil membuat panggilan sistem sewenang-wenang atas nama aplikasi host, mengeksekusi kode arbitrer atas namanya, memindai memori aplikasi host dan menemukan rantai ROP yang cocok untuk penyalahgunaan di dalamnya, ia akan dapat mengambil kendali penuh atas aplikasi host dalam mode siluman. Itu tidak hanya dapat mencuri dan mengenkripsi file pengguna, tetapi juga bertindak atas nama pengguna. Misalnya, mengirim email phishing atas namanya atau melakukan serangan DoS. Pada saat yang sama, Anda tidak takut akan mekanisme perlindungan paling modern sekalipun, seperti tumpukan kenari dan sanitasi alamat.
Kami akan menunjukkan beberapa peretasan di mana penjahat mengatasi batasan yang dijelaskan di atas dalam upaya untuk mengambil keuntungan dari manfaat SGX untuk tujuan jahat mereka: untuk melakukan serangan ROP. Entah untuk mengeksekusi kode sewenang-wenang yang disamarkan sebagai proses penggergajian host (mirip dengan proses pengosongan, yang sering digunakan oleh malware), atau untuk menutupi malware yang sudah disiapkan (untuk menyimpan malware dari penganiayaan oleh antivirus dan mekanisme perlindungan lainnya).
Retas untuk menyelidiki alamat untuk kemungkinan membacanya
Karena enklosur tidak tahu rentang ruang alamat virtual apa yang tersedia untuk aplikasi host, dan karena ketika Anda mencoba membaca alamat yang tidak dapat diakses, enklaf tersebut dihentikan secara paksa, penjahat dihadapkan dengan tugas menemukan cara untuk gagal memindai dengan aman ruang alamat. Temukan cara untuk memetakan alamat virtual yang tersedia. Penjahat memecahkan masalah ini dengan menyalahgunakan teknologi TSX Intel. Ia menggunakan salah satu efek samping dari TSX: jika fungsi akses memori ditempatkan dalam transaksi TSX, maka pengecualian yang timbul dari mengakses alamat yang tidak valid ditekan oleh TSX sebelum mencapai sistem operasi. Ketika Anda mencoba mengakses alamat memori yang tidak valid, hanya transaksi saat ini yang terputus, dan bukan seluruh program enklosur. T.O. TSX memungkinkan enklave untuk secara aman mengakses alamat apa pun dari dalam transaksi - tanpa risiko kehancuran.
Jika alamat yang ditentukan tersedia untuk aplikasi host, transaksi TSX paling sering berhasil. Dalam kasus yang jarang terjadi, mungkin gagal karena pengaruh eksternal, seperti interupsi (misalnya, gangguan penjadwal), berkerumun keluar dari cache, atau perubahan sel memori simultan oleh beberapa proses. Dalam kasus yang jarang terjadi ini, TSX mengembalikan kode kesalahan yang menunjukkan bahwa kegagalan yang terjadi bersifat sementara. Dalam kasus ini, Anda hanya perlu memulai ulang transaksi.
Jika alamat yang ditentukan tidak tersedia untuk aplikasi host, TSX menekan pengecualian (OS tidak diberitahu) dan membatalkan transaksi. Kode kesalahan dikembalikan ke kode enklosur sehingga dapat menanggapi fakta bahwa transaksi dibatalkan. Kode kesalahan ini menunjukkan bahwa alamat yang dimaksud tidak tersedia untuk aplikasi host.


Manipulasi seperti TSX dari bagian dalam kantong memiliki fitur yang bagus untuk penjahat: karena pada saat pelaksanaan kode kantong sebagian besar penghitung kinerja perangkat keras tidak diperbarui, tidak mungkin untuk melacak transaksi TSX yang dilakukan di dalam kantong menggunakan mereka. Dengan demikian, penipuan berbahaya dengan TSX'om tetap sama sekali tidak terlihat oleh sistem operasi.
Selain itu, karena peretasan yang dijelaskan di atas tidak bergantung pada panggilan sistem apa pun, peretasan tidak dapat dideteksi atau dicegah dengan hanya memblokir panggilan sistem; yang biasanya memberikan hasil positif dalam perang melawan "perburuan telur."
Penjahat menggunakan retasan yang dijelaskan di atas untuk mencari gadget dalam kode aplikasi host yang cocok untuk membentuk rantai ROP. Namun, dia tidak perlu memeriksa setiap alamat. Cukup untuk menyelidiki satu alamat dari setiap halaman ruang alamat virtual. Memeriksa semua 16 gigabytes memori membutuhkan waktu sekitar 45 menit (pada Intel i7-6700K). Akibatnya, penjahat mendapat daftar halaman yang dapat dieksekusi yang cocok untuk membangun rantai ROP.
Retas untuk menyelidiki alamat untuk kemampuan menulis
Untuk mengimplementasikan versi enklave dari serangan ROP, penjahat membutuhkan kemampuan untuk mencari bagian-bagian yang tidak terpakai dari memori aplikasi host. Penjahat menggunakan bagian memori ini untuk menyuntikkan bingkai tumpukan palsu dan untuk menyuntikkan muatan (shellcode). Intinya adalah bahwa kantong berbahaya tidak dapat meminta aplikasi host untuk mengalokasikan memori untuk dirinya sendiri, tetapi sebaliknya dapat menggunakan untuk tujuan lain memori yang dialokasikan oleh aplikasi host. Kecuali tentu saja ia berhasil menemukan situs-situs semacam itu tanpa meruntuhkan kantongnya.
Penjahat melakukan pencarian ini dengan mengeksploitasi efek samping lain dari TSX. Pertama, ia, seperti dalam kasus sebelumnya, memeriksa alamat keberadaannya, dan kemudian memeriksa apakah halaman yang sesuai dengan alamat ini dapat diakses untuk ditulis. Untuk melakukan ini, penjahat menggunakan peretasan berikut: menempatkan fungsi tulis dalam transaksi TSX, dan setelah itu selesai, tetapi sebelum selesai, ia secara paksa memecah transaksi (aborsi eksplisit).
Melihat kode pengembalian dari transaksi TSX, penjahat menyadari apakah itu bisa ditulisi. Jika itu "dibatalkan secara eksplisit", penjahat menyadari bahwa rekaman itu akan berhasil jika ia membawanya ke akhir. Jika halaman hanya baca, maka transaksi gagal dengan kesalahan selain "aborsi eksplisit".

Manipulasi seperti TSX memiliki fitur lain yang menyenangkan bagi penjahat (selain ketidakmampuan untuk melacak penghitung kinerja perangkat keras): karena semua perintah tulis ke memori dicatat hanya jika transaksi berhasil, memaksa transaksi untuk menyelesaikan memastikan bahwa sel memori yang diperiksa tetap tidak berubah.
Kendalikan aliran redirect hack
Ketika melakukan serangan ROP dari kantong - tidak seperti serangan ROP tradisional - penjahat dapat menguasai register RIP tanpa mengeksploitasi bug dalam program yang diserang (buffer overflow atau sesuatu seperti itu). Penjahat bisa langsung menimpa nilai register RIP yang disimpan di stack. Secara khusus, ia dapat mengganti nilai register ini dengan rantai ROP-nya.
Namun, jika rantai ROP panjang, maka menulis ulang sebagian besar tumpukan aplikasi host dapat menyebabkan korupsi data dan perilaku program yang tidak terduga. Seorang penjahat yang berusaha melakukan serangannya secara diam-diam, keadaan ini tidak sesuai. Oleh karena itu, ia membuat bingkai tumpukan sementara palsu untuk dirinya sendiri dan menyimpan rantai ROP di dalamnya. Bingkai tumpukan palsu ditempatkan di tempat sewenang-wenang dalam memori yang dapat ditulisi, sehingga tumpukan sebenarnya tetap tidak tersentuh.

Apa yang memberi penjahat tiga peretasan yang tercantum di atas
(1) Pertama, kantong berbahaya, melalui peretasan untuk menyelidiki alamat untuk kemungkinan membacanya , mencari aplikasi host untuk gadget ROP yang dapat disalahgunakan.

(2) Kemudian, menggunakan peretasan untuk menyelidiki alamat untuk kemampuan menulis , daerah berbahaya mengidentifikasi di area memori aplikasi host yang sesuai untuk menyuntikkan muatan.

(3) Selanjutnya, enklaf membuat rantai ROP dari gadget yang ditemukan pada langkah (1) dan menyuntikkan rantai itu ke dalam tumpukan aplikasi host.

(4) Akhirnya, ketika aplikasi host menemukan rantai ROP yang dibuat pada langkah sebelumnya, eksekusi muatan berbahaya dimulai, dengan hak istimewa aplikasi host dan kemampuan untuk melakukan panggilan sistem.
Bagaimana penjahat menggunakan peretasan ini untuk membuat ranzomvari
Setelah aplikasi host mentransfer kontrol ke enklaf melalui ECALL (tanpa menduga bahwa enklosur ini berbahaya), enklaf jahat mencari ruang kosong dalam memori aplikasi host untuk injeksi kode (untuk tempat-tempat itu dibutuhkan urutan sel yang diisi dengan nol). Kemudian, menggunakan peretasan untuk menyelidiki alamat agar mudah dibaca , enklaf mencari halaman yang dapat dieksekusi dalam aplikasi host dan menghasilkan rantai ROP yang membuat file baru yang disebut "RANSOM" di direktori saat ini (dalam serangan nyata, enklaf mengenkripsi file pengguna yang ada) dan menampilkan pesan permintaan tebusan. Pada saat yang sama, aplikasi host secara naif percaya bahwa enklave hanya menambah dua angka. Bagaimana tampilannya dalam kode?
Untuk memudahkan persepsi, kami memperkenalkan beberapa mnemonik melalui definisi:

Kami menjaga nilai awal register RSP dan RBP untuk mengembalikan operasi normal aplikasi host setelah melakukan payload:

Kami mencari bingkai tumpukan yang sesuai (lihat kode di bagian "retas untuk mengarahkan ulang aliran kontrol").
Temukan gadget ROP yang sesuai:

Temukan tempat untuk menyuntikkan muatan:

Membangun rantai ROP:

Inilah cara teknologi Intel SGX, yang dirancang untuk menahan program jahat, dieksploitasi oleh penjahat untuk mencapai tujuan yang berlawanan.