Meltdown/Spectre

Ringkasan

Pada 3 Januari, Project Zero mengungkap kerentanan pada CPU modern yang dapat digunakan oleh suatu proses untuk membaca (paling buruk) memori arbitrer, termasuk memori yang tidak termasuk dalam proses tersebut. Kerentanan ini diberi nama Spectre dan Meltdown. Apa yang dilakukan Chrome untuk membantu menjaga web tetap aman, dan apa yang harus dilakukan developer web untuk situs mereka sendiri?

TL; DR (Ringkasan)

Sebagai pengguna yang menjelajahi web, pastikan untuk selalu mengupdate sistem operasi dan browser. Selain itu, pengguna Chrome dapat mempertimbangkan untuk mengaktifkan Isolasi Situs.

Jika Anda adalah developer web, tim Chrome akan menyarankan:

  • Jika memungkinkan, cegah cookie masuk ke memori proses perender dengan menggunakan atribut cookie SameSite dan HTTPOnly, serta dengan menghindari pembacaan dari document.cookie.
  • Pastikan jenis MIME sudah benar dan tentukan header X-Content-Type-Options: nosniff untuk setiap URL dengan konten khusus pengguna atau konten sensitif agar dapat mengoptimalkan Pemblokiran Bacaan Lintas Asal bagi pengguna yang mengaktifkan Isolasi Situs.
  • Aktifkan Isolasi Situs dan beri tahu tim Chrome jika isolasi tersebut menyebabkan masalah pada situs Anda.

Jika Anda bertanya-tanya mengapa langkah-langkah ini membantu, baca terus.

Risiko

Ada berbagai penjelasan tentang kerentanan ini, jadi saya tidak akan menambahkan yang lain. Jika Anda tertarik untuk mengetahui cara eksploitasi kerentanan ini, sebaiknya lihat postingan blog oleh kolega saya dari tim Google Cloud.

Baik Meltdown dan Spectre berpotensi memungkinkan proses membaca memori yang seharusnya tidak mampu melakukannya. Terkadang, beberapa dokumen dari situs yang berbeda dapat berbagi proses di Chrome. Hal ini dapat terjadi jika seseorang telah membuka lainnya menggunakan window.open, atau <a href="..." target="_blank">, atau iframe. Jika situs berisi data khusus pengguna, ada kemungkinan situs lain dapat menggunakan kerentanan baru ini untuk membaca data pengguna tersebut.

Mitigasi

Ada beberapa upaya yang dilakukan tim engineer Chrome dan V8 untuk memitigasi ancaman ini.

Isolasi Situs

Dampak keberhasilan eksploitasi Spectre dapat dikurangi secara signifikan dengan mencegah data sensitif agar tidak membagikan proses dengan kode yang dikontrol penyerang. Tim Chrome telah membuat fitur untuk mencapai hal ini yang disebut “Isolasi Situs”:

Isolasi Situs belum diaktifkan secara default karena ada beberapa masalah umum dan tim Chrome menginginkan pengujian lapangan sebanyak mungkin. Jika Anda adalah developer web, sebaiknya aktifkan Isolasi Situs dan periksa apakah situs Anda tetap berfungsi. Jika Anda ingin ikut serta sekarang, aktifkan chrome://flags#enable-site-per-process. Jika Anda menemukan situs yang tidak berfungsi, bantu kami dengan melaporkan bug dan sebutkan bahwa Anda mengaktifkan Isolasi Situs.

Pemblokiran Dokumen Lintas Situs

Meskipun semua halaman lintas situs dimasukkan ke dalam proses terpisah, halaman masih dapat meminta beberapa subresource lintas situs secara sah, seperti gambar dan JavaScript. Untuk membantu mencegah informasi sensitif membocorkan informasi ini, Isolasi Situs menyertakan fitur “pemblokiran dokumen lintas situs” yang membatasi respons jaringan mana yang dikirimkan ke proses perender.

Situs dapat meminta dua jenis data dari server: "dokumen" dan "resource". Di sini, dokumen berupa file HTML, XML, JSON, dan teks. Situs dapat menerima dokumen dari domainnya sendiri atau dari domain lain dengan header CORS yang permisif. Resource mencakup hal-hal seperti gambar, JavaScript, CSS, dan font. Referensi dapat disertakan dari situs mana pun.

Kebijakan pemblokiran dokumen lintas situs mencegah proses menerima “dokumen” dari asal lain jika:

  1. Mereka memiliki HTML, XML, JSON, atau jenis MIME teks/biasa, dan
  2. Notifikasi memiliki header respons HTTP X-Content-Type-Options: nosniff, atau analisis konten cepat (“sniffing”) mengonfirmasi bahwa jenisnya benar
  3. CORS tidak secara eksplisit mengizinkan akses ke dokumen

Dokumen yang diblokir oleh kebijakan ini ditampilkan kepada proses sebagai kosong, meskipun permintaan tersebut masih terjadi di latar belakang.

Misalnya: Bayangkan penyerang membuat tag <img> yang menyertakan file JSON dengan data sensitif, seperti <img src="https://yourbank.com/balance.json">. Tanpa Isolasi Situs, konten file JSON akan sampai ke memori proses render, lalu perender melihat bahwa format ini bukan format gambar yang valid dan tidak merender gambar. Namun, dengan Spectre, sekarang ada cara untuk membaca potongan memori tersebut secara potensial. Pemblokiran dokumen lintas situs akan mencegah konten file ini memasuki memori proses yang sedang dijalankan perender karena jenis MIME diblokir oleh pemblokiran dokumen lintas situs.

Menurut metrik pengguna, ada banyak file JavaScript dan CSS yang dikirim dengan jenis MIME text/html atau text/plain. Untuk menghindari pemblokiran resource yang tidak sengaja ditandai sebagai dokumen, Chrome mencoba menyadap respons untuk memastikan jenis MIME sudah benar. Penyadapan ini tidak sempurna, jadi jika Anda yakin sudah menyetel header Content-Type yang benar di situs, tim Chrome merekomendasikan untuk menambahkan header X-Content-Type-Options: nosniff ke semua respons Anda.

Jika Anda ingin mencoba pemblokiran dokumen lintas situs, gunakan Isolasi Situs seperti yang dijelaskan di atas.

SameSite cookie

Mari kembali ke contoh di atas: <img src="https://yourbank.com/balance.json">. Tindakan ini hanya berfungsi jika bankanda.com telah menyimpan cookie yang secara otomatis membuat pengguna login. Cookie biasanya dikirim untuk semua permintaan ke situs yang menetapkan cookie, meskipun permintaan tersebut dibuat oleh pihak ketiga menggunakan tag <img>. Cookie SameSite adalah atribut baru yang menentukan bahwa cookie hanya boleh dilampirkan ke permintaan yang berasal dari situs yang sama, oleh karena itu namanya. Sayangnya, pada saat penulisan ini, hanya Chrome dan Firefox 58+ yang mendukung atribut ini.

HTTPOnly dan document.cookie

Jika cookie situs Anda hanya digunakan di sisi server, bukan oleh JavaScript klien, ada beberapa cara untuk menghentikan data cookie agar tidak memasuki proses perender. Anda dapat menetapkan atribut cookie HTTPOnly, yang secara eksplisit mencegah cookie diakses melalui skrip sisi klien di browser yang didukung, seperti Chrome. Jika tidak dapat menyetel HTTPOnly, Anda dapat membantu membatasi eksposur data cookie pemuatan ke proses yang dirender dengan tidak membaca document.cookie kecuali jika benar-benar diperlukan.

Saat Anda menautkan ke halaman lain menggunakan target="_blank", halaman yang terbuka memiliki akses ke objek window, dapat menavigasi halaman Anda ke URL yang berbeda, dan tanpa Isolasi Situs akan berada dalam proses yang sama seperti halaman Anda. Untuk melindungi halaman Anda dengan lebih baik, link ke halaman eksternal yang terbuka di jendela baru harus selalu menentukan rel="noopener".

Timer resolusi tinggi

Untuk mengeksploitasi Meltdown atau Spectre, penyerang perlu mengukur berapa lama waktu yang diperlukan untuk membaca nilai tertentu dari memori. Untuk itu, diperlukan timer yang andal dan akurat.

Satu API yang ditawarkan platform web adalah performance.now() yang akurat hingga 5 mikrodetik. Sebagai mitigasi, semua browser utama telah mengurangi resolusi performance.now() untuk mempersulit penginstalan serangan.

Cara lain untuk mendapatkan timer resolusi tinggi adalah dengan menggunakan SharedArrayBuffer. Buffer digunakan oleh pekerja khusus untuk menambahkan penghitung. Thread utama membaca penghitung ini dan menggunakannya sebagai timer. Untuk saat ini, browser telah memutuskan untuk menonaktifkan SharedArrayBuffer hingga mitigasi lainnya diterapkan.

V8

Untuk mengeksploitasi Spectre, diperlukan rangkaian petunjuk CPU yang dibuat secara khusus. Tim V8 telah menerapkan mitigasi untuk bukti konsep serangan yang diketahui, dan sedang mengerjakan perubahan pada TurboFan, compiler pengoptimalan mereka, yang membuat kode yang dihasilkannya aman meskipun serangan ini dipicu. Namun, perubahan pembuatan kode ini mungkin akan menyebabkan penalti performa.

Menjaga keamanan web

Ada banyak ketidakpastian seputar penemuan Spectre dan Meltdown serta implikasinya. Saya harap artikel ini menjelaskan apa yang dilakukan tim Chrome dan V8 untuk menjaga keamanan platform web, dan bagaimana developer web dapat membantu dengan menggunakan fitur keamanan yang ada. Jika ada pertanyaan, jangan ragu untuk menghubungi saya di Twitter.