Update SharedArrayBuffer di Android Chrome 88 dan Chrome Desktop 92

Dapat dikatakan bahwa SharedArrayBuffer mengalami sedikit kesulitan saat diluncurkan di web, tetapi semuanya sudah beres. Berikut hal yang perlu Anda ketahui:

Singkatnya

  • SharedArrayBuffer saat ini didukung di Firefox 79+, dan akan hadir di Android Chrome 88. Namun, fitur ini hanya tersedia untuk halaman yang diisolasi lintas origin.
  • SharedArrayBuffer saat ini tersedia di Chrome Desktop, tetapi mulai Chrome 92, SharedArrayBuffer akan dibatasi untuk halaman yang diisolasi lintas origin. Jika merasa tidak dapat melakukan perubahan ini tepat waktu, Anda dapat mendaftar untuk uji coba origin guna mempertahankan perilaku saat ini hingga setidaknya Chrome 113.
  • Jika Anda ingin mengaktifkan isolasi lintas origin untuk terus menggunakan SharedArrayBuffer, evaluasi dampak yang akan ditimbulkan terhadap elemen lintas origin lain di situs Anda, seperti penempatan iklan. Periksa apakah SharedArrayBuffer digunakan oleh resource pihak ketiga Anda untuk memahami dampak dan panduan.

Ringkasan isolasi lintas origin

Anda dapat membuat halaman terisolasi lintas origin dengan menayangkan halaman menggunakan header berikut:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

Setelah Anda melakukannya, halaman tidak akan dapat memuat konten lintas-asal kecuali jika resource secara eksplisit mengizinkannya melalui header Cross-Origin-Resource-Policy atau header CORS (Access-Control-Allow-* dan sebagainya).

Ada juga reporting API, sehingga Anda dapat mengumpulkan data tentang permintaan yang gagal akibat Cross-Origin-Embedder-Policy dan Cross-Origin-Opener-Policy.

Jika merasa tidak dapat melakukan perubahan ini tepat waktu untuk Chrome 92, Anda dapat mendaftar untuk uji coba origin guna mempertahankan perilaku Chrome Desktop saat ini hingga setidaknya Chrome 113.

Lihat bagian Bacaan lebih lanjut di bagian bawah halaman ini untuk mendapatkan panduan dan informasi selengkapnya tentang isolasi lintas origin.

Bagaimana kita bisa sampai di sini?

SharedArrayBuffer hadir di Chrome 60 (yaitu Juli 2017, bagi Anda yang memikirkan waktu dalam tanggal, bukan versi Chrome), dan semuanya berjalan lancar. Selama 6 bulan.

Pada Januari 2018, kerentanan terungkap di beberapa CPU populer. Lihat pengumuman untuk mengetahui detail selengkapnya, tetapi pada dasarnya hal ini berarti kode dapat menggunakan timer resolusi tinggi untuk membaca memori yang tidak boleh diakses.

Hal ini menjadi masalah bagi kami, vendor browser, karena kami ingin mengizinkan situs mengeksekusi kode dalam bentuk JavaScript dan WASM, tetapi mengontrol memori yang dapat diakses kode ini secara ketat. Jika Anda membuka situs saya, saya seharusnya tidak dapat membaca apa pun dari situs internet banking yang juga Anda buka. Bahkan, saya seharusnya tidak tahu bahwa Anda membuka situs internet banking. Ini adalah dasar-dasar keamanan web.

Untuk menguranginya, kami mengurangi resolusi timer resolusi tinggi seperti performance.now(). Namun, Anda dapat create timer beresolusi tinggi menggunakan SharedArrayBuffer dengan mengubah memori dalam loop ketat di pekerja, dan membacanya kembali di thread lain. Hal ini tidak dapat dimitigasi secara efektif tanpa memengaruhi kode yang berniat baik secara signifikan, sehingga SharedArrayBuffer dinonaktifkan sepenuhnya.

Mitigasi umum adalah memastikan proses sistem halaman web tidak berisi data sensitif dari tempat lain. Chrome telah berinvestasi dalam arsitektur multiproses sejak awal (ingat komiknya?), tetapi masih ada kasus saat data dari beberapa situs dapat berakhir dalam proses yang sama:

<iframe src="https://your-bank.example/balance.json"></iframe>
<script src="https://your-bank.example/balance.json"></script>
<link rel="stylesheet" href="https://your-bank.example/balance.json" />
<img src="https://your-bank.example/balance.json" />
<video src="https://your-bank.example/balance.json"></video>
<!-- …and more… -->

API ini memiliki perilaku 'lama' yang memungkinkan konten dari origin lain digunakan tanpa keikutsertaan dari origin lain. Permintaan ini dibuat dengan cookie dari origin lain, sehingga merupakan permintaan 'login' penuh. Saat ini, API baru mengharuskan origin lain untuk ikut serta menggunakan CORS.

Kami mengatasi API lama ini dengan mencegah konten memasuki proses halaman web jika terlihat 'salah', dan menyebutnya pemblokiran baca lintas origin. Jadi, dalam kasus di atas, kami tidak akan mengizinkan JSON memasuki proses, karena bukan format yang valid untuk API tersebut. Artinya, kecuali iframe. Untuk iframe, kita akan menempatkan konten dalam proses yang berbeda.

Dengan mitigasi ini, kami memperkenalkan kembali SharedArrayBuffer di Chrome 68 (Juli 2018), tetapi hanya di desktop. Persyaratan proses tambahan berarti kami tidak dapat melakukan hal yang sama di perangkat seluler. Kami juga mencatat bahwa solusi Chrome tidak lengkap, karena kami hanya memblokir format data yang 'salah', sedangkan CSS/JS/gambar yang valid di URL yang dapat ditebak mungkin (meskipun tidak biasa) berisi data pribadi.

Para pakar standar web berkumpul untuk menghasilkan solusi lintas browser yang lebih lengkap. Solusinya adalah memberi halaman cara untuk mengatakan "Dengan ini saya melepaskan kemampuan saya untuk memasukkan konten dari origin lain ke dalam proses ini tanpa keikutsertaan mereka". Pernyataan ini dilakukan melalui header COOP dan COEP yang ditayangkan dengan halaman. Browser menerapkan hal tersebut, dan sebagai gantinya halaman mendapatkan akses ke SharedArrayBuffer dan API lainnya dengan kemampuan serupa. Origin lain dapat memilih untuk mengaktifkan penyematan konten melalui Cross-Origin-Resource-Policy atau CORS.

Firefox adalah yang pertama kali mengirimkan SharedArrayBuffer dengan pembatasan ini, dalam versi 79 (Juli 2020).

Kemudian, pada Januari 2021, saya menulis artikel ini, dan Anda membacanya. Halo.

Dan itulah yang kita lakukan sekarang. Chrome 88 menghadirkan kembali SharedArrayBuffer ke Android untuk halaman yang diisolasi lintas origin, dan Chrome 92 menghadirkan persyaratan yang sama ke desktop, baik untuk konsistensi, maupun untuk mencapai isolasi lintas origin total.

Menunda perubahan Chrome Desktop

Ini adalah pengecualian sementara dalam bentuk 'uji coba origin' yang memberi pengguna lebih banyak waktu untuk menerapkan halaman yang diisolasi lintas origin. Hal ini memungkinkan SharedArrayBuffer tanpa mengharuskan halaman diisolasi lintas origin. Masa berlaku pengecualian ini akan berakhir di Chrome 113, dan pengecualian ini hanya berlaku untuk Chrome Desktop.

  1. Minta token untuk origin Anda.
  2. Tambahkan token ke halaman Anda. Ada dua cara untuk melakukannya:
    • Tambahkan tag origin-trial <meta> ke header setiap halaman. Misalnya, tampilannya mungkin terlihat seperti ini:
      <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • Jika dapat mengonfigurasi server, Anda juga dapat menambahkan token menggunakan header HTTP Origin-Trial. Header respons yang dihasilkan akan terlihat seperti:
      Origin-Trial: TOKEN_GOES_HERE

Bacaan lebih lanjut

Foto banner oleh Daniel Gregoire di Unsplash