Ringkasan
Pada 3 Januari, Project Zero mengungkap kerentanan di CPU modern yang dapat digunakan suatu proses untuk membaca (dalam kondisi terburuk) memori arbitrer — termasuk memori yang tidak termasuk dalam proses tersebut. Kerentanan ini dinamakan Spectre dan Meltdown. Apa yang dilakukan Chrome untuk membantu menjaga keamanan web, dan apa yang harus dilakukan developer web untuk situs mereka?
TL; DR (Ringkasan)
Sebagai pengguna yang menjelajahi web, Anda harus memastikan untuk selalu mengupdate sistem operasi dan browser. Selain itu, pengguna Chrome dapat mempertimbangkan untuk mengaktifkan Isolasi Situs.
Jika Anda adalah developer web, tim Chrome menyarankan:
- Jika memungkinkan, cegah cookie memasuki memori proses perender dengan menggunakan atribut cookie
SameSite
danHTTPOnly
, serta dengan menghindari pembacaan daridocument.cookie
. - Pastikan jenis MIME Anda sudah benar dan tentukan header
X-Content-Type-Options: nosniff
untuk setiap URL dengan konten khusus pengguna atau sensitif, guna mendapatkan hasil maksimal dari Pemblokiran Baca Lintas Asal bagi pengguna yang mengaktifkan Isolasi Situs. - Aktifkan Isolasi Situs dan beri tahu tim Chrome jika hal ini menyebabkan masalah pada situs Anda.
Jika Anda bertanya-tanya mengapa langkah-langkah ini membantu, baca terus.
Risiko
Ada banyak penjelasan tentang kerentanan ini, jadi saya tidak akan menambahkan satu lagi. Jika Anda ingin mengetahui cara mengeksploitasi kerentanan ini, sebaiknya baca postingan blog yang dibuat oleh rekan-rekan saya dari tim Google Cloud.
Meltdown dan Spectre berpotensi mengizinkan proses membaca memori yang
seharusnya tidak dapat dilakukan. Terkadang, beberapa dokumen dari situs yang
berbeda pada akhirnya dapat berbagi proses di Chrome. Hal ini dapat terjadi jika salah satunya 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 memitigasi ancaman ini.
Isolasi Lokasi
Dampak keberhasilan eksploitasi Spectre dapat dikurangi secara signifikan dengan mencegah data sensitif membagikan proses dengan kode yang dikontrol penyerang. Tim Chrome sedang mengerjakan fitur untuk mencapai hal ini yang disebut “Isolasi Situs”:
Isolasi Situs belum diaktifkan secara default karena ada beberapa
masalah umum
dan tim Chrome menginginkan sebanyak mungkin pengujian lapangan. Jika Anda adalah developer web, sebaiknya aktifkan Isolasi Situs dan periksa apakah situs Anda tetap berfungsi. Jika Anda ingin mengaktifkannya 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 subresource lintas situs, seperti gambar dan JavaScript, secara sah. Untuk membantu mencegah informasi sensitif membocorkan informasi ini, Isolasi Situs menyertakan fitur “pemblokiran dokumen lintas situs” yang membatasi respons jaringan 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 permisif. Resource mencakup hal-hal seperti gambar, JavaScript, CSS, dan font. Referensi dapat disertakan dari situs mana pun.
Kebijakan pemblokiran dokumen lintas situs mencegah suatu proses menerima “dokumen” dari origin lain jika:
- Mereka memiliki HTML, XML, JSON, atau jenis MIME teks/biasa, dan
- Eksperimen tersebut memiliki header respons HTTP
X-Content-Type-Options: nosniff
, atau analisis konten cepat (“sniffing”) mengonfirmasi bahwa jenisnya sudah benar - CORS tidak secara eksplisit mengizinkan akses ke dokumen
Dokumen yang diblokir oleh kebijakan ini akan 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 sampai ke
memori proses perender, yang pada saat itu perender melihat bahwa format gambar tersebut
tidak valid dan tidak merender gambar. Namun, dengan Spectre, sekarang ada
cara untuk membaca memori itu. 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 dikirimkan dengan jenis MIME text/html
atau text/plain
. Untuk menghindari pemblokiran resource yang tidak sengaja ditandai sebagai dokumen, Chrome mencoba mengendus respons untuk memastikan jenis MIME sudah benar. Deteksi ini tidak sempurna, jadi jika Anda yakin sudah menetapkan header Content-Type
yang benar di situs, tim Chrome merekomendasikan untuk menambahkan header X-Content-Type-Options: nosniff
ke semua respons.
Jika Anda ingin mencoba pemblokiran dokumen lintas situs, pilih ikut serta dalam Isolasi Situs seperti yang dijelaskan di atas.
SameSite
cookie
Mari kembali ke contoh di atas: <img
src="https://yourbank.com/balance.json">
. 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, oleh karena itu disebut. Sayangnya, pada saat penulisan ini, hanya Chrome dan Firefox 58+ yang mendukung atribut ini.
HTTPOnly
dan document.cookie
Jika cookie situs Anda hanya digunakan 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 menetapkan
HTTPOnly
tidak dapat dilakukan, Anda dapat membantu membatasi eksposur pemuatan data cookie
ke proses yang dirender dengan tidak membaca document.cookie
kecuali jika benar-benar
diperlukan.
Buka Link Eksternal Menggunakan rel="noopener"
Saat Anda menautkan ke halaman lain menggunakan target="_blank"
, halaman yang terbuka memiliki akses ke objek window
Anda, dapat mengarahkan 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 dibutuhkan 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 pemasangan
serangan.
Cara lain untuk mendapatkan timer resolusi tinggi adalah dengan menggunakan SharedArrayBuffer. {i>Buffer<i} 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 lain diterapkan.
V8
Untuk mengeksploitasi Spectre, diperlukan urutan petunjuk CPU yang dibuat khusus. Tim V8 telah menerapkan mitigasi untuk bukti konsep serangan yang diketahui, dan sedang menangani perubahan pada TurboFan, compiler pengoptimalan mereka, yang membuat kode yang dihasilkan aman bahkan saat serangan ini dipicu. Namun, perubahan pembuatan kode ini mungkin menyebabkan penalti performa.
Menjaga keamanan web
Ada banyak ketidakpastian seputar penemuan Spectre dan Meltdown serta implikasinya. Semoga artikel ini memberikan penerangan tentang 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.