Ringkasan
Pada 3 Januari, Project Zero mengungkapkan kelemahan pada CPU modern yang dapat digunakan proses untuk membaca (paling buruk) memori arbitrer — termasuk memori yang bukan milik proses tersebut. Kerentanan ini telah diberi nama Spectre dan Meltdown. Apa yang dilakukan Chrome untuk membantu menjaga keamanan web, dan apa yang harus dilakukan developer web untuk situs mereka sendiri?
TL; DR
Sebagai pengguna yang menjelajahi web, Anda harus memastikan sistem operasi dan browser Anda selalu diupdate. Selain itu, pengguna Chrome dapat mempertimbangkan untuk mengaktifkan Isolasi Situs.
Jika Anda adalah developer web, tim Chrome menyarankan:
- Jika memungkinkan, cegah cookie agar tidak masuk ke memori proses perender dengan
menggunakan atribut cookie
SameSite
danHTTPOnly
, dan dengan menghindari pembacaan daridocument.cookie
. - Pastikan jenis MIME Anda sudah benar dan tentukan header
X-Content-Type-Options: nosniff
untuk URL apa pun dengan konten sensitif atau khusus pengguna, untuk mendapatkan manfaat maksimal dari Pemblokiran Operasi Baca Lintas-Asal bagi pengguna yang mengaktifkan Isolasi Situs. - Aktifkan Isolasi Situs dan beri tahu tim Chrome jika hal ini menyebabkan masalah untuk situs Anda.
Jika Anda ingin tahu alasan langkah-langkah ini membantu, lanjutkan membaca.
Risiko
Ada berbagai penjelasan tentang kerentanan ini, jadi saya tidak akan menambahkan penjelasan lainnya. Jika Anda tertarik dengan cara kelemahan ini dapat dieksploitasi, sebaiknya lihat postingan blog oleh kolega saya dari tim Google Cloud.
Meltdown dan Spectre berpotensi memungkinkan proses membaca memori yang
tidak seharusnya dapat dilakukan. Terkadang, beberapa dokumen dari situs yang berbeda
dapat berbagi proses di Chrome. Hal ini dapat terjadi jika salah satu telah membuka
yang lain 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 mengurangi ancaman ini.
Isolasi Situs
Dampak dari keberhasilan mengeksploitasi Spectre dapat dikurangi secara signifikan dengan mencegah data sensitif berbagi proses dengan kode yang dikontrol penyerang. Tim Chrome telah mengerjakan fitur untuk mencapai hal ini yang disebut “Isolasi Situs”:
Isolasi Situs belum diaktifkan secara default karena ada beberapa
masalah umum
dan tim Chrome ingin melakukan pengujian lapangan sebanyak mungkin. Jika Anda adalah
developer web, Anda harus mengaktifkan Isolasi Situs dan memeriksa 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 menyebutkan bahwa Anda
telah mengaktifkan Isolasi Situs.
Pemblokiran Dokumen Lintas Situs
Meskipun semua halaman lintas situs dimasukkan ke dalam proses terpisah, halaman masih dapat meminta beberapa sub-resource 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 dikirim ke proses perender.
Situs dapat meminta dua jenis data dari server: "dokumen" dan "resource". Di sini, dokumen adalah 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 origin lain jika:
- File tersebut memiliki jenis MIME HTML, XML, JSON, atau teks/plain, dan
- File tersebut memiliki header respons HTTP
X-Content-Type-Options: nosniff
, atau analisis konten cepat (“sniffing”) mengonfirmasi bahwa jenisnya sudah benar - CORS tidak mengizinkan akses ke dokumen secara eksplisit
Dokumen yang diblokir oleh kebijakan ini ditampilkan ke proses sebagai kosong, meskipun permintaan 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 masuk ke
memori proses perender, pada saat itu perender akan melihat bahwa file tersebut bukan
format gambar yang valid dan tidak merender gambar. Namun, dengan Spectre, kini
ada cara untuk berpotensi membaca bagian memori tersebut. Pemblokiran dokumen lintas situs
akan mencegah konten file ini masuk ke memori
proses yang dijalankan perender karena jenis MIME diblokir oleh
pemblokiran dokumen lintas situs.
Menurut metrik pengguna, ada banyak file JavaScript dan CSS yang
dikirimkan dengan jenis MIME text/html
atau text/plain
. Untuk menghindari pemblokiran
resource yang tidak sengaja ditandai sebagai dokumen, Chrome mencoba memindai
respons untuk memastikan jenis MIME sudah benar. Penyadap ini tidak sempurna, jadi
jika Anda yakin bahwa Anda menetapkan 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, ikut serta dalam Isolasi Situs seperti yang dijelaskan di atas.
SameSite
cookie
Mari kita kembali ke contoh di atas: <img
src="https://yourbank.com/balance.json">
. Hal ini hanya berfungsi jika yourbank.com telah
menyimpan cookie yang 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, sehingga namanya. Sayangnya, pada saat penulisan artikel 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 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 menetapkan
HTTPOnly
, Anda dapat membantu membatasi eksposur data cookie
yang dimuat ke proses yang dirender dengan tidak membaca document.cookie
kecuali jika benar-benar
diperlukan.
Membuka Link Eksternal Menggunakan rel="noopener"
Saat Anda menautkan ke halaman lain menggunakan target="_blank"
, halaman yang dibuka memiliki akses ke objek window
Anda,
dapat mengarahkan halaman Anda ke URL yang berbeda, dan tanpa Isolasi Situs akan berada dalam
proses yang sama dengan 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 waktu yang diperlukan untuk membaca nilai tertentu dari memori. Untuk itu, diperlukan timer yang andal dan akurat.
Salah satu API yang ditawarkan platform web adalah
performance.now()
yang akurat hingga 5 mikrodetik. Sebagai mitigasi, semua browser utama telah
menurunkan resolusi performance.now()
untuk mempersulit serangan
dilancarkan.
Cara lain untuk mendapatkan timer beresolusi tinggi adalah dengan menggunakan SharedArrayBuffer. Buffer digunakan oleh pekerja khusus untuk menambah 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, urutan petunjuk CPU yang dibuat secara khusus diperlukan. Tim V8 telah menerapkan mitigasi untuk proof of concept serangan yang diketahui, dan sedang mengerjakan perubahan di TurboFan, compiler pengoptimal mereka, yang membuat kode yang dihasilkan aman meskipun serangan ini dipicu. Namun, perubahan pembuatan kode ini dapat menimbulkan penalti performa.
Menjaga keamanan web
Ada banyak ketidakpastian seputar penemuan Spectre dan Meltdown serta implikasinya. Kami harap artikel ini dapat 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 kami di Twitter.