Alasan Anda perlu "isolasi lintas asal" untuk mendapatkan fitur canggih

Pelajari alasan isolasi lintas asal diperlukan untuk menggunakan fitur canggih seperti SharedArrayBuffer, performance.measureUserAgentSpecificMemory(), dan timer resolusi tinggi dengan presisi yang lebih baik.

Pengantar

Dalam Membuat situs Anda "diisolasi lintas origin" menggunakan COOP dan COEP, kami menjelaskan cara menerapkan model "cross-origin" terisolasi" status menggunakan COOP dan COEP. Ini adalah artikel pendamping yang menjelaskan mengapa isolasi lintas asal diperlukan untuk mengaktifkan fitur canggih pada browser.

Latar belakang

Web dibuat berdasarkan sumber yang sama policy: fitur keamanan yang membatasi bagaimana dokumen dan skrip dapat berinteraksi dengan resource dari asal lain. Ini membatasi cara situs dapat mengakses resource lintas origin. Sebagai contoh, dokumen dari https://a.example dicegah mengakses data yang dihosting di https://b.example.

Namun, kebijakan origin yang sama memiliki beberapa pengecualian historis. Situs web apa pun dapat:

  • Menyematkan iframe lintas origin
  • Sertakan resource lintas origin seperti gambar atau skrip
  • Buka jendela pop-up lintas origin dengan referensi DOM

Jika web dapat dirancang dari awal, pengecualian ini tidak akan ada. Sayangnya, pada saat komunitas web menyadari manfaat utama dari kebijakan origin yang sama yang ketat, web sudah mengandalkan pengecualian ini.

Efek samping keamanan dari kebijakan origin yang sama yang longgar tersebut di-patch menjadi dua cara. Salah satunya adalah melalui pengenalan protokol baru bernama Crossover Origin Resource Sharing (CORS) yang bertujuan untuk memastikan bahwa server memungkinkan berbagi sumber daya dengan asal tertentu. Cara lain adalah dengan secara implisit menghapus akses skrip langsung ke resource lintas origin sekaligus mempertahankan kompatibilitas mundur. Seperti resource lintas origin disebut "buram" Google Cloud Platform. Sebagai contoh, inilah alasan mengapa memanipulasi piksel gambar lintas origin melalui CanvasRenderingContext2D akan gagal kecuali jika CORS diterapkan ke image.

Semua keputusan kebijakan ini terjadi dalam grup konteks penjelajahan.

Grup Konteks Penjelajahan

Sejak lama, kombinasi CORS dan resource buram sudah cukup untuk browser Anda aman. Terkadang kasus ekstrem (seperti JSON kerentanan) ditemukan, dan perlu diperbaiki, tetapi secara keseluruhan prinsip tidak memungkinkan akses baca langsung ke byte mentah dari sumber daya lintas asal berhasil.

Semua ini diubah dengan Spectre, yang membuat data apa pun yang dimuat ke grup konteks penjelajahan yang sama dengan kode Anda dapat dibaca. Dengan mengukur waktu yang dibutuhkan oleh operasi tertentu, penyerang bisa menebak isi {i>cache<i} CPU, dan melalui itu, isi dari proses' memori. Serangan pengaturan waktu tersebut dapat dilakukan dengan timer dengan perincian rendah yang ada di platform, tetapi dapat dipercepat dengan timer terperinci, eksplisit (seperti performance.now()) maupun implisit (seperti SharedArrayBuffer). Jika evil.com menyematkan gambar lintas origin, ia dapat menggunakan Serangan Spectre untuk membaca data pikselnya, sehingga perlindungan bergantung pada "buram" tidak efektif.

Spektr

Idealnya, semua permintaan lintas asal harus diperiksa secara eksplisit oleh server yang memiliki resource tersebut. Jika pemeriksaan tidak disediakan oleh server pemilik sumber daya, maka data tidak akan bisa masuk ke dalam konteks tambahan dari aktor jahat, dan karenanya akan tetap berada di luar jangkauan Spectre serangan yang dapat dilakukan oleh sebuah laman web. Kami menyebutnya status terisolasi lintas origin. Inilah yang dimaksud dengan COOP+COEP.

Dengan status terisolasi lintas origin, situs yang meminta dianggap lebih sedikit berbahaya dan tindakan ini akan membuka fitur canggih seperti SharedArrayBuffer, performance.measureUserAgentSpecificMemory() dan resolusi tinggi timer dengan presisi lebih baik, yang dapat jika tidak, akan digunakan untuk serangan seperti Spectre. Hal ini juga mencegah modifikasi document.domain.

Kebijakan Penyemat Lintas Asal

Penyemat Lintas Asal Kebijakan (COEP) mencegah dokumen agar tidak memuat resource lintas origin yang tidak secara eksplisit memberikan izin dokumen (menggunakan CORP atau CORS). Dengan fitur ini, Anda dapat mendeklarasikan bahwa dokumen tidak dapat memuat sumber daya tersebut.

Cara kerja COEP

Untuk mengaktifkan kebijakan ini, tambahkan header HTTP berikut ke dokumen:

Cross-Origin-Embedder-Policy: require-corp

Kata kunci require-corp adalah satu-satunya nilai yang diterima untuk COEP. Hal ini memberlakukan kebijakan bahwa dokumen hanya dapat memuat resource dari asal yang sama, atau resource yang secara eksplisit ditandai sebagai dapat dimuat dari asal lain.

Agar resource dapat dimuat dari asal lain, resource tersebut harus mendukung Cross Origin Resource Sharing (CORS) atau Cross Origin Resource Policy (CORP).

Cross-Origin Resource Sharing (CORS)

Jika resource lintas origin mendukung Cross Origin Resource Sharing (CORS), Anda dapat menggunakan crossorigin untuk memuatnya ke halaman web Anda tanpa diblokir oleh COEP.

<img src="https://third-party.example.com/image.jpg" crossorigin>

Misalnya, jika resource gambar ini ditampilkan dengan header CORS, gunakan crossorigin sehingga permintaan untuk mengambil resource akan menggunakan CORS mode. Hal ini juga mencegah gambar dimuat kecuali jika header CORS ditetapkan.

Demikian pula, Anda dapat mengambil data lintas origin melalui metode fetch(), yang tidak memerlukan penanganan khusus selama server merespon dengan HTTP header.

Kebijakan Resource Lintas Asal

Kebijakan Resource Lintas Asal (CORP) awalnya diperkenalkan sebagai keikutsertaan untuk melindungi sumber daya agar tidak dimuat oleh asal lain. Dalam konteks COEP, CORP dapat menentukan sumber daya kebijakan pemilik mengenai siapa yang dapat memuat sumber daya.

Header Cross-Origin-Resource-Policy menggunakan tiga kemungkinan nilai:

Cross-Origin-Resource-Policy: same-site

Resource yang ditandai same-site hanya dapat dimuat dari situs yang sama.

Cross-Origin-Resource-Policy: same-origin

Resource yang ditandai same-origin hanya dapat dimuat dari asal yang sama.

Cross-Origin-Resource-Policy: cross-origin

Resource yang ditandai cross-origin dapat dimuat oleh situs apa pun. (Ini nilai tambahan telah ditambahkan ke CORP beserta COEP.)

Kebijakan Pembuka Lintas Asal

Kebijakan Pembuka Lintas Asal (COOP) memungkinkan Anda memastikan bahwa jendela tingkat atas diisolasi dari dokumen lain dengan menempatkannya dalam grup konteks penjelajahan yang berbeda, sehingga mereka tidak dapat berinteraksi langsung dengan {i>top-level window <i}(tingkat tertinggi). Misalnya, jika dokumen dengan COOP membuka jendela pop-up, Properti window.opener akan menjadi null. Selain itu, properti .closed dari elemen referensi pembukanya akan menampilkan true.

COOP

Header Cross-Origin-Opener-Policy menggunakan tiga kemungkinan nilai:

Cross-Origin-Opener-Policy: same-origin

Dokumen yang ditandai sebagai same-origin dapat berbagi konteks penjelajahan yang sama grup dengan dokumen dari origin yang sama yang juga secara eksplisit ditandai same-origin.

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

Dokumen tingkat atas dengan same-origin-allow-popups mempertahankan referensi ke pop-up yang tidak menetapkan COOP atau memilih untuk tidak mengisolasi menetapkan COOP sebesar unsafe-none.

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none adalah setelan default dan memungkinkan dokumen ditambahkan ke file pembuka grup konteks penjelajahan kecuali pembuka itu sendiri memiliki COOP same-origin.

Ringkasan

Jika Anda menginginkan akses yang terjamin ke fitur-fitur canggih seperti SharedArrayBuffer, performance.measureUserAgentSpecificMemory() atau resolusi tinggi timer dengan presisi yang lebih baik. Perlu diingat bahwa dokumen Anda perlu menggunakan COEP dengan nilai require-corp COOP dengan nilai same-origin. Jika tidak ada keduanya, browser akan tidak menjamin isolasi yang memadai untuk mengaktifkan fitur-fitur canggih tersebut dengan aman. Anda dapat menentukan situasi halaman Anda dengan memeriksa apakah self.crossOriginIsolated akan menampilkan true.

Pelajari langkah-langkah untuk menerapkannya di Membuat situs Anda "lintas asal terisolasi" menggunakan COOP dan COEP.

Resource