Contoh penggunaan eksploitasi "Spectre" yang terungkap mulai 2 Jan 2018 (CVE-2017-5753 dan CVE-2017-5715)
Spectre memecah isolasi antara aplikasi yang berbeda. Hal ini memungkinkan penyerang untuk mengelabui program bebas kesalahan, yang mengikuti praktik terbaik, agar membocorkan rahasianya. Faktanya, pemeriksaan keamanan dari praktik terbaik tersebut justru meningkatkan permukaan serangan dan mungkin membuat aplikasi lebih rentan terhadap Spectre.
C, menggunakan lib:
Kami menempatkan teks "Kata-kata Ajaib adalah Ossifrage yang Mual." di memori dan kemudian kami mencoba membacanya menggunakan eksploitasi. Jika sistem rentan, Anda akan melihat teks yang sama di output, dibaca dari memori.
Dalam kode ini, jika instruksi yang dikompilasi di victim_function()
dieksekusi dalam urutan program yang ketat, fungsi hanya akan membaca dari array1[0..15]
karena ukuran array1 = 16. Namun, ketika dieksekusi secara spekulatif, pembacaan di luar batas mungkin. Fungsi readMemoryByte()
membuat beberapa panggilan pelatihan ke victim_function()
untuk membuat prediktor cabang mengharapkan nilai yang valid untuk x, lalu memanggil dengan x di luar batas. Cabang bersyarat salah memprediksi, dan eksekusi spekulatif berikutnya membaca byte rahasia menggunakan x di luar batas. Kode spekulatif kemudian dibaca dari array2[array1[x] * 512]
, membocorkan nilai array1[x]
ke dalam status cache. Untuk menyelesaikan serangan, flush+probe sederhana digunakan untuk mengidentifikasi baris cache mana dalam array2
yang dimuat, sehingga mengungkapkan isi memori. Serangan ini diulangi beberapa kali, sehingga meskipun byte target pada awalnya tidak di-cache, iterasi pertama akan membawanya ke dalam cache.
Kode yang tidak dioptimalkan terbaca sekitar 10KB/detik pada i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
atau make
Buat proyek kosong baru dan tambahkan Source.c lalu klik Build.
.spectre.out
tanpa parameter.
.spectre.out {address} {length}
dengan parameter: