Skip to content

Menjaga Isi, Bukan Wadah: Guard Dua Arah Rebind Media

Adityo Guni Waluyo

Guard menjaga entitas tujuan tetapi melewatkan id media sumber; setelah rebind, mengelola media orang lain jadi sah. Perbaikannya: guard sebelum mutasi.

Ringkasan

Jadi ada editor yang bisa "mencuri" media punya entitas lain pas rebind galeri, soalnya endpoint cuma ngecek tujuan, nggak cek asal media-nya. Perbaikannya: tiap media dicek kepemilikan modulnya dalam satu kueri, ditolak 403 sebelum nulis apa-apa, plus uji regresi merah-hijau. Modul pengumuman juga ketahuan kena celah serupa, jadi penjagaan cakupan wajib dipanggil di semua jalur tulis.

Saat seorang editor dengan cakupan terbatas melakukan pengikatan ulang pada galeri entitas, ia berhasil mengambil alih media milik entitas bidang lain. Titik akhir tersebut telah menjaga modul entitas tujuan, tetapi tidak pernah memeriksa asal-usul identitas media sumber. Lebih buruk lagi, setelah proses pengikatan ulang selesai, operasi pembaruan atau penghapusan pada media tersebut lolos dari penjagaan, karena media itu kini tercatat berada di bawah entitas editor tersebut.

Dugaan awal menyatakan bahwa penjagaan modul pada entitas sudah mencakup media di dalamnya. Kenyataannya, identitas media merupakan permukaan otorisasi tingkat objek yang terpisah. Menjaga wadah tidak sama dengan menjaga isinya. Celah ini memungkinkan eskalasi hak istimewa horizontal, yaitu kondisi di mana pengguna mengakses sumber daya pengguna lain pada tingkat hak yang sama [3].

Mekanisme Validasi Sumber Media

Perbaikan pada modul administrasi entitas menerapkan resolusi modul setiap media sumber dalam satu kueri batch melalui jalur media ke entitas lalu ke kategori. Kueri ini menggunakan parameterisasi sqlx.In untuk mencegah injeksi: daftar id dibangun sebagai klausul IN berparameter, bukan dirangkai ke dalam string kueri, dan beban kueri berantai terhindar. Sistem akan menolak identitas yang berada di luar cakupan pemohon dengan respons 403 statis sebelum operasi tulis apa pun terjadi. Penolakan yang terjadi sebelum tulis berarti tidak ada keadaan setengah jadi: galeri entitas tetap utuh, pustaka media tidak berpindah, dan tidak ada media yang harus dikembalikan manual.

Media bebas dengan nilai entity_id bernilai kosong tetap dikhususkan hanya untuk administrator global, meniru perilaku modul administrasi media yang sudah ada. Uji regresi TestService_RebindMediaSourceScope ditulis lebih dulu dan terbukti gagal pada kode lama, lalu lolos setelah guard berjalan. Pola merah-sebelum-hijau semacam ini menjadi bukti penerimaan bahwa celah benar-benar tertutup, bukan sekadar dianggap tertutup.

Penemuan Celah pada Modul Saudara

Tinjauan atas perbaikan pertama menemukan celah serupa pada modul administrasi pengumuman. Modul ini menerima bidang pemohon tetapi sama sekali tidak memanggil fungsi penjagaan cakupan [F-SEC-43.1]. Bentuk kegiatannya memang berbeda: pengikatan ulang pengumuman terjadi lewat alamat pada URL, bukan daftar id media, sehingga tidak ada identitas sumber untuk diresolve. Pemeriksaan cakupan tetap wajib berjalan sebelum mutasi, karena identitas entitas yang dibawa klien pun tidak boleh dipercaya begitu saja. Permintaan yang tidak lolos kini dijawab 403, dan deskripsi 400 dikoreksi sekaligus: kode itu untuk permintaan cacat, bukan untuk penolakan otorisasi.

Perbaikan pada pengumuman disertai uji TestService_RebindMediaScope yang juga terbukti merah sebelum perbaikan diterapkan. Dua perbaikan berurutan menunjukkan satu hal: satu mekanisme penjagaan belum bisa disebut pola yang mapan sampai setiap jalur penulisan memanggilnya. Tinjauan yang menemukan modul saudara justru tanda proses review berjalan semestinya.

Prinsip Otorisasi Tingkat Objek

Kerentanan pengendalian akses objek tidak langsung (IDOR) memerlukan tiga bahan utama: objek, referensi yang dikendalikan pengguna, dan pemeriksaan otorisasi tingkat objek yang hilang [2]. Ketika klien mengirimkan daftar identitas media, daftar tersebut adalah referensi yang sepenuhnya dikendalikan pengguna. Tanpa validasi silang terhadap kepemilikan modul, sistem memberikan akses ke objek yang bukan milik pengguna tersebut. Validasi dalam satu kueri terpusat menjaga guard tetap murah meski daftar media yang dikirim panjang.

Prinsip tolak secara bawaan harus diterapkan di sisi peladen tanpa pengecualian. Identitas yang tiba dari klien adalah kunci yang tidak tepercaya dan harus dianggap berbahaya hingga terbukti sah [2]. Penggunaan identitas yang kompleks atau format GUID yang acak tidak akan menggantikan kebutuhan akan pemeriksaan akses yang eksplisit dan terstruktur [2]. Akses kontrol hanya efektif ketika diterapkan secara konsisten pada kode sisi peladen dan model basis datanya menegakkan kepemilikan catatan secara ketat [1].

Kerentanan ini secara spesifik dikategorikan sebagai Otorisasi Horizontal dalam standar CWE-639, yang menyoroti risiko ketika pengguna memodifikasi parameter untuk mengakses data milik pengguna lain [4]. Otorisasi objek sumber harus sama kuatnya dengan otorisasi objek tujuan, di setiap jalur tulis. Tinjauan atas perbaikan pertama yang menemukan modul saudara justru tanda proses review berjalan semestinya.

Sumber

[1] Broken_Access_Control/index.html — OWASP Top 10:2021 A01 Broken Access Control

[2] OWASP IDOR Prevention Cheat Sheet

[3] OWASP Authorization Cheat Sheet

[4] CWE-639: Authorization Bypass Through User-Controlled Key

Artikel terkait