Subresource Integrity Mengikat Eksekusi Browser ke Byte yang Diharapkan
Halaman web dapat mengambil JavaScript dan stylesheet dari infrastruktur di luar batas deployment aplikasi. CDN membantu distribusi, tetapi browser pada kondisi normal memperlakukan response dari URL yang dirujuk sebagai resource yang diminta halaman. Jika response itu berubah secara tidak terduga, keamanan transport saja tidak memberi tahu browser bahwa byte yang diterima berbeda dari versi yang dipilih operator aplikasi.
Subresource Integrity (SRI) menambahkan pemeriksaan konten pada proses tersebut. Halaman membawa metadata kriptografis untuk representasi yang diharapkan. Browser yang mendukung SRI menghitung hash resource hasil fetch dan menerimanya hanya ketika hasilnya memenuhi metadata integritas yang dinyatakan.
Digest melekat pada artifact yang dipilih
Elemen script dapat membawa atribut integrity:
<script
src="https://cdn.example.com/app.min.js"
integrity="sha384-BASE64_DIGEST"
crossorigin="anonymous"></script>Nilainya menggabungkan identifier algoritma hash dengan digest berformat Base64. SRI mendukung metadata integritas dengan SHA-256, SHA-384, dan SHA-512. Digest dihitung atas representasi resource yang divalidasi browser, sehingga perubahan byte menghasilkan nilai berbeda sesuai dengan sifat collision dari fungsi hash yang dipilih.
Pemisahan antara lokasi dan konten menjadi tegas. URL src menentukan lokasi tempat browser mengambil script. Metadata integrity menentukan konten yang dapat diterima dari lokasi tersebut.
Digest perlu berasal dari jalur build atau release yang tepercaya. Mengambil digest dari lokasi delivery yang sama dan sudah terkompromi dengan resource akan merusak pemisahan tersebut: penyerang yang dapat mengganti artifact sekaligus metadata dapat membuat keduanya kembali konsisten.
Ketidakcocokan menghentikan pemuatan resource
Untuk resource dengan metadata integritas, browser menghitung digest yang relevan setelah menerima response lalu membandingkannya dengan metadata yang dapat diterima. Jika tidak ada digest yang cocok, browser menolak resource alih-alih menjalankan script atau menerapkan stylesheet.
Perilaku ini penting untuk JavaScript yang di-host secara eksternal. Tanpa SRI, kendali atas endpoint delivery dapat berubah menjadi kendali atas kode yang dijalankan dalam konteks origin halaman. Dengan digest yang dipasang secara benar, perubahan file pada hosting tanpa perubahan metadata yang diterima halaman membuat pemuatan gagal.
SRI dengan demikian merupakan pemeriksaan konten yang gagal secara tertutup, bukan mekanisme availability. Response CDN yang berubah tetap dapat merusak halaman karena resource ditolak. Kontrol ini membatasi byte yang diterima; SRI tidak membuat host remote selalu dapat dijangkau dan tidak menjamin dependency tetap tersedia.
Integritas lintas origin juga bergantung pada CORS
Pemeriksaan integritas untuk resource lintas origin berjalan bersama CORS. Deklarasi script eksternal umumnya berbentuk:
<script
src="https://static.example.net/library.js"
integrity="sha384-BASE64_DIGEST"
crossorigin="anonymous"></script>Server resource perlu mengirim header response Access-Control-Allow-Origin yang sesuai. Pengaturan crossorigin="anonymous" menempatkan pemuatan elemen dalam mode CORS tanpa mengirim kredensial lintas origin seperti cookie atau kredensial autentikasi HTTP.
Syarat ini mencegah metadata integritas menjadi sarana untuk memeriksa response lintas origin yang opaque melalui sinyal berhasil atau gagal. Deployment yang menambahkan atribut integrity tanpa perilaku CORS yang sesuai pada CDN dapat mengubah pemuatan yang sebelumnya berhasil menjadi gagal.
Beberapa digest dapat mendukung transisi terkontrol
Atribut integrity dapat berisi beberapa ekspresi digest yang dipisahkan spasi. Ketika metadata memakai lebih dari satu algoritma yang didukung, pemrosesan browser memprioritaskan algoritma terkuat yang terdapat pada metadata valid, bukan memperlakukan entri yang lebih lemah sebagai fallback terpisah.
Beberapa digest dengan algoritma terpilih yang sama dapat mewakili lebih dari satu body resource yang dapat diterima. Pola ini dapat mendukung transisi terkontrol ketika halaman untuk sementara perlu menerima dua versi artifact yang sudah ditentukan.
Fleksibilitas tersebut perlu disengaja. Setiap digest yang diterima memperluas kumpulan konten yang boleh dimuat browser. Nilai lama sebaiknya tidak dibiarkan setelah rollout selesai, terutama jika artifact lama berisi kode yang tidak lagi ditujukan untuk digunakan.
Perubahan versi memerlukan perubahan metadata
SRI sengaja tidak cocok dengan URL asset yang berubah-ubah. Jika https://cdn.example.com/library.js berpindah dari satu release ke release lain sementara HTML tetap memakai digest lama, browser akan menolak byte baru.
URL asset yang immutable atau memiliki versi lebih sesuai dengan model ini:
https://cdn.example.com/library/4.2.1/library.min.jsRelease kemudian dapat memperbarui URL dan digest secara bersamaan sebagai satu perubahan yang ditinjau. Sistem build dapat menghasilkan metadata integritas secara otomatis, tetapi nilai itu tetap perlu melewati jalur publikasi tepercaya bersama HTML yang merujuknya.
Perilaku rollback juga menjadi eksplisit. Mengembalikan dokumen HTML lama berarti mengembalikan digest dan URL yang dipilih dokumen tersebut, bukan menerima secara diam-diam isi terbaru dari endpoint yang mutable.
SRI mempersempit satu batas supply chain
SRI tidak mengautentikasi publisher dependency dan tidak membuktikan bahwa artifact yang diharapkan bebas dari kode berbahaya. Jika kode berbahaya sudah ada saat digest dipilih, browser tetap menerimanya karena konten tersebut cocok dengan nilai yang dinyatakan.
SRI juga tidak dapat melindungi halaman ketika penyerang dapat mengubah halaman itu sendiri. Kendali atas HTML memungkinkan penggantian URL resource, metadata integritas, atau keduanya. Trust anchor SRI karena itu berada pada dokumen dan proses yang menempatkan digest yang diharapkan ke dalamnya.
SRI melengkapi HTTPS, bukan menggantikannya. TLS melindungi koneksi dan mengautentikasi endpoint HTTPS sesuai validasi sertifikat browser. SRI menambahkan batas terpisah pada representasi yang diambil. Kedua kontrol tersebut menangani batas yang berbeda.
Content Security Policy dapat menambah lapisan lain dengan membatasi sumber script atau pola eksekusi yang diizinkan dokumen. SRI lebih sempit: untuk resource yang membawa metadata integritas, penerimaan diikat ke byte yang diharapkan.
Pemeriksaan operasional berada di jalur release
Deployment yang baik memverifikasi digest terhadap artifact production yang tepat sebelum halaman yang merujuknya dipublikasikan. Proses tersebut juga memeriksa perilaku CORS untuk resource lintas origin dan menguji jalur kegagalan agar ketidakcocokan digest terlihat pada diagnostik browser dan monitoring.
Pembaruan dependency sebaiknya mengubah referensi artifact dan metadata integritas secara bersamaan. Reviewer dapat melihat bahwa perubahan konten disertai perubahan digest, bukan baru menemukan kegagalan production tanpa konteks.
Properti keamanan yang diberikan SRI bersifat spesifik. Browser yang menerima metadata integritas valid tidak menjalankan atau menerapkan resource hanya karena resource itu datang dari URL yang dikonfigurasi. Byte hasil fetch juga harus cocok dengan konten yang secara eksplisit diterima halaman.