Subresource Integrity Mengikat Aset Eksternal ke Digest Kriptografis
Halaman web dapat memuat JavaScript dan CSS dari origin di luar batas deployment-nya sendiri. Susunan ini praktis untuk package bersama dan content delivery network, tetapi sebagian jalur eksekusi atau presentasi halaman ikut bergantung pada server yang mengirim resource tersebut.
Subresource Integrity (SRI) menambahkan batasan pada tingkat byte terhadap dependensi itu. Halaman menyertakan satu atau beberapa digest kriptografis melalui atribut integrity. Browser yang mendukung SRI mengambil resource, menghitung digest memakai algoritma yang dideklarasikan, lalu menerima response hanya jika byte-nya memenuhi metadata integritas.
<script
src="https://cdn.example.net/app.min.js"
integrity="sha384-BASE64_DIGEST"
crossorigin="anonymous"></script>Digest tidak mengidentifikasi penerbit dan tidak membuktikan bahwa sebuah file aman. Pernyataannya lebih sempit: representasi yang diterima harus cocok dengan byte yang telah disetujui pembuat halaman.
Metadata integritas terikat pada konten yang tepat
Token SRI menggabungkan nama algoritma dengan digest berformat Base64. Metadata yang umum memakai SHA-256, SHA-384, atau SHA-512.
sha384-BASE64_DIGESTPerubahan satu byte menghasilkan digest kriptografis yang berbeda dengan probabilitas yang sangat tinggi untuk fungsi hash yang aman. Artinya, perubahan minifikasi, penambahan banner, source map yang tertanam dan dibangun ulang, atau perubahan byte lain memerlukan metadata integritas baru.
Sifat ini membuat SRI sengaja ketat. Sebuah URL dapat tetap sama sementara response berubah, tetapi digest lama tidak otomatis mengizinkan representasi baru. Browser menolak response yang gagal pada pemeriksaan integritas alih-alih mengeksekusi atau menerapkannya sebagai subresource yang diminta.
Konsekuensinya, URL aset yang mutable memerlukan disiplin operasional. Jika deployment mengganti app.min.js pada URL yang sama, HTML yang membawa digest-nya harus diperbarui secara terkoordinasi. Nama aset berbasis versi atau content address mengurangi persoalan tersebut karena representasi baru secara alami memperoleh referensi baru.
Halaman tetap menjadi otoritas bagi digest yang disetujui
SRI berguna ketika HTML dan aset eksternal tidak berada pada batas kompromi yang sama. Penyerang yang hanya dapat mengubah aset eksternal tidak dapat membuat byte pengganti sembarang memenuhi digest yang sudah tertanam pada HTML yang tidak ikut dikompromikan.
Batas tersebut berubah jika penyerang dapat memodifikasi kedua permukaan. Jika kompromi yang sama memungkinkan penggantian script sekaligus perubahan nilai integrity pada halaman, penyerang dapat menerbitkan digest untuk pengganti berbahaya. SRI tidak menciptakan independensi antara dua artefak yang dikendalikan melalui jalur kompromi yang sama.
Perbedaan ini penting pada desain deployment. Nilai keamanannya berasal dari penempatan digest yang diharapkan pada permukaan dengan batas integritas terpisah dari resource yang dibatasi.
Aturan fetch lintas origin tetap berlaku
SRI tidak melewati model lintas origin milik browser. Untuk subresource lintas origin, pemeriksaan integritas berinteraksi dengan pemrosesan CORS, dan resource harus dikirim dengan cara yang mengizinkan browser memakai response sesuai mode request.
Bentuk script eksternal yang umum karena itu memasangkan integrity dengan crossorigin="anonymous":
<script
src="https://static.example.net/vendor.js"
integrity="sha384-BASE64_DIGEST"
crossorigin="anonymous"></script>Atribut crossorigin bukan pemeriksaan hash kedua. Atribut itu mengatur konfigurasi CORS untuk fetch. Atribut integrity membawa metadata digest yang diharapkan. Keduanya memengaruhi apakah resource eksternal dapat digunakan, tetapi kondisi yang diterapkan berbeda.
Pengujian deployment perlu mencakup header response aktual dan jalur request browser. Digest yang benar tidak dapat memperbaiki konfigurasi CORS yang membuat resource tidak dapat diterima.
Beberapa digest mendukung transisi terkontrol
Atribut integrity dapat berisi beberapa token metadata yang dipisahkan whitespace. Ini memungkinkan halaman mendeklarasikan lebih dari satu digest yang dapat diterima sesuai aturan pemrosesan.
<script
src="/bundle.js"
integrity="sha384-DIGEST_A sha384-DIGEST_B"></script>Beberapa nilai tidak seharusnya menjadi jalan pintas umum untuk konten mutable. Setiap digest yang diterima memperluas himpunan representasi yang diizinkan pembuat halaman. Nilai lama perlu dihapus saat sudah tidak diperlukan.
Pemilihan algoritma juga relevan. Browser mengevaluasi metadata integritas menurut model pemrosesan SRI, termasuk perlakuan terhadap algoritma yang didukung dan beberapa opsi. Aplikasi sebaiknya menghasilkan metadata melalui tooling yang mengeluarkan algoritma yang didukung dan mempertahankan output secara tepat tanpa mengubah string digest secara manual.
SRI membatasi konten, bukan kebaruan pengiriman
Digest yang cocok menyatakan bahwa byte yang diterima sama dengan representasi yang disetujui. Digest tidak menyatakan bahwa representasi tersebut merupakan rilis terbaru.
Cache, intermediary, atau origin dapat mengirim aset lama yang masih cocok dengan digest yang tetap tercantum pada halaman. Jika resistansi rollback atau kebaruan rilis yang ketat diperlukan, pemilihan versi dan kebijakan deployment harus menerapkan properti tersebut secara terpisah.
SRI juga tidak menggantikan HTTPS. TLS melindungi kanal transport, autentikasi server, dan integritas response selama transit. SRI menambahkan ekspektasi yang dideklarasikan aplikasi terhadap byte subresource. Keduanya menangani batas yang berbeda dan lazim digunakan bersama.
Loading dinamis memerlukan desain yang sadar integritas
HTML statis menempatkan digest di samping URL resource. Loader runtime dapat membuat hubungan itu lebih rumit jika kode membentuk elemen script atau stylesheet secara dinamis.
Loader yang menerima URL arbitrer lalu memasukkannya tanpa metadata integritas tidak memperoleh perlindungan SRI hanya karena resource lain pada halaman memakai SRI. Digest yang diharapkan harus ikut melalui jalur loading dan dipasang pada request resource dalam bentuk yang diwajibkan browser.
Build system dapat menyederhanakan proses ini dengan menghasilkan manifest aset yang mencatat URL berversi beserta digest terkait. Aplikasi kemudian dapat merender kedua nilai dari satu artefak deployment. Manifest tersebut menjadi relevan bagi keamanan karena perubahan pasangan URL-digest mengubah himpunan byte eksternal yang diterima.
Kegagalan harus diperlakukan sebagai kegagalan dependensi
Ketika pemeriksaan integritas gagal, resource yang dilindungi tidak tersedia bagi halaman. Aplikasi sebaiknya tidak diam-diam mencoba kembali dependensi yang sama tanpa metadata integritas, karena tindakan itu mengubah kegagalan verifikasi menjadi pemuatan tanpa verifikasi.
Model operasional yang lebih aman memperlakukan kejadian tersebut seperti kegagalan dependensi kritis lainnya. Monitoring dapat mencatat kegagalan pemuatan aset, health check deployment dapat memverifikasi HTML yang dipublikasikan terhadap aset yang terpasang, dan prosedur rilis dapat mencegah halaman merujuk digest yang tidak cocok dengan resource pada URL target.
Untuk script, kegagalan dapat menghentikan startup aplikasi. Untuk stylesheet, presentasi dapat menurun. Biaya availability tersebut merupakan bagian dari kontrak: SRI memilih penolakan daripada menerima byte di luar himpunan yang dideklarasikan halaman.
Digest adalah trust anchor yang sempit dan berguna
SRI tidak mensertifikasi source code, mengaudit package, atau menetapkan identitas penerbit. SRI juga tidak dapat melindungi halaman jika HTML-nya sendiri dapat ditulis ulang oleh adversary yang sama dengan pihak yang mengendalikan aset eksternal.
Kontribusinya lebih spesifik. Halaman dapat mengikat referensi subresource ke byte yang disetujui, lalu browser menerapkan ikatan tersebut sebelum memakai response. Untuk script dan stylesheet eksternal dengan jalur hosting di luar batas deployment utama halaman, pemeriksaan ini mengubah dependensi implisit terhadap apa pun yang dikembalikan URL menjadi dependensi eksplisit terhadap representasi kriptografis tertentu.