Di seluruh sistem operasi modern, infrastruktur cloud, dan aplikasi web, pelanggaran keamanan yang katastrofik mengikuti pola yang sangat berulang. Cross-Site Request Forgery (CSRF), Server-Side Request Forgery (SSRF), injeksi SQL dan perintah, pelarian kontainer (container escape), serta serangan rantai pasokan perangkat lunak di ekosistem npm atau PyPI sekilas tampak berada di lapisan perangkat lunak yang berbeda. Namun di balik detail permukaannya, terdapat satu cacat arsitektur yang sama.
Cacat tersebut adalah ketergantungan kita selama setengah abad pada Daftar Kontrol Akses (Access Control Lists, ACL) yang dipadukan dengan Otoritas Ambien (Ambient Authority)—paradigma desain di mana keputusan akses bergantung pada Siapa Anda (Identitas Subjek) alih-alih Apa yang Anda Pegang, dan di mana Penunjukan (Designation) (menamai sumber daya melalui jalur string atau URL yang dapat dipalsukan) dipisahkan dari Otoritas (Authority) (izin ambien yang dibawa oleh pemanggil).
Dalam artikel ini, kita membahas secara sistematis paradigma alternatif yang menghapus kerentanan struktural ini hingga ke akarnya: Keamanan Berbasis Kapabilitas (Capability-Based Security). Dimulai dari dekomposisi matematis Matriks Kontrol Akses Butler Lampson $M[S, O]$ (1971), kita menelusuri Masalah Deputi yang Bingung (Confused Deputy Problem) klasik karya Norm Hardy (1988), merumuskan model Object-Capability (OCap) karya Mark S. Miller dan Prinsip Hak Istimewa Terkecil (POLA), membangun pola kode konkret untuk atenuasi (facet) serta pencabutan instan atau transitif (Caretaker Redell dan Membran), dan meninjau penerapan industri modern pada mikrokernel terverifikasi formal seL4, FreeBSD Capsicum, pointer kapabilitas perangkat keras CHERI / ARM Morello, dan WebAssembly WASI.
1. Dua Paradigma Otoritas: Lencana Identitas vs. Kunci Valet (Valet Key)
Sebelum menyelami teori sistem operasi formal, mari bandingkan dua cara berlawanan dalam menerapkan keamanan fisik di dunia nyata.
Paradigma A: Lencana Identitas dan Buku Besar Pintu (Model ACL)
Bayangkan sebuah gedung perusahaan berkeamanan tinggi di mana setiap pintu dijaga oleh petugas yang memegang papan klip berisi daftar nama karyawan yang diizinkan masuk ke Ruang 302 (sebuah Access Control List). Ketika Anda meminta masuk, penjaga memeriksa lencana ID Anda (Identitas / uid) dan memeriksa apakah nama Anda ada di daftar Ruang 302.
Sekarang misalkan Anda ingin seorang anak magang (program pembantu atau pustaka pihak ketiga) mengambil satu file, Q3_Budget.pdf, dari lemari arsip di dalam Ruang 302. Karena anak magang tidak ada dalam daftar, Anda harus meminjamkan lencana ID Anda sendiri kepadanya (analog dengan setuid di UNIX atau menjalankan kode di bawah identitas pengguna Anda). Begitu anak magang masuk ke Ruang 302 mengenakan lencana Anda, ia secara otomatis memperoleh Otoritas Ambien (Ambient Authority) atas seluruh isi ruangan tersebut, termasuk Payroll_Master.db. Lebih buruk lagi, jika penyerang luar menukar catatan tempel anak magang untuk menipunya agar mengambil Payroll_Master.db, penjaga pintu akan mengizinkannya dengan senang hati karena anak magang tersebut mengenakan lencana Anda!
Paradigma B: Kunci Valet Mobil / Valet Key (Model Kapabilitas)
Bandingkan hal ini dengan saat Anda tiba di hotel dan menyerahkan mobil Anda kepada petugas parkir valet. Anda tidak menelepon kantor samsat untuk mendaftarkan SIM petugas pada daftar akses mobil Anda, dan Anda juga tidak menyerahkan KTP Anda. Sebaliknya, Anda menyerahkan Kunci Valet (Valet Key), yang mewujudkan tiga sifat arsitektur mendalam:
- Penyatuan Penunjukan dan Otoritas: Kunci tersebut secara bersamaan menunjuk kendaraan spesifik mana yang akan dioperasikan dan mengotorisasi pemegangnya untuk menyalakan mesin. Mobil tidak peduli siapa yang memegang kunci; kepemilikan token yang tak dapat dipalsukan itu sudah menjadi bukti otoritas yang cukup.
- Atenuasi (Hak Istimewa Terkecil): Berbeda dengan kunci utama, kunci valet tidak dapat membuka bagasi atau laci dasbor dan dapat membatasi kecepatan maksimum. Ia hanya memberikan otoritas minimum yang diperlukan untuk memarkir mobil.
- Delegasi Terdesentralisasi: Jika petugas pertama perlu menyerahkan tugas kepada petugas kedua untuk mengambil mobil Anda, ia cukup menyerahkan kunci valet tersebut tanpa mengedit basis data pusat mana pun.
Dalam ilmu komputer, Paradigma A adalah model ACL, sedangkan Paradigma B adalah model Keamanan Berbasis Kapabilitas (Capabilities).
2. Matriks Kontrol Akses Butler Lampson $M[S, O]$ dan Dua Dekomposisinya
Pada tahun 1971, peraih Turing Award Butler Lampson menerbitkan “Protection”, memperkenalkan Matriks Kontrol Akses sebagai abstraksi matematis universal untuk mekanisme perlindungan. Status perlindungan sistem didefinisikan oleh tripel $(S, O, M)$:
- Himpunan Subjek $S = \{s_1, s_2, \dots, s_m\}$: Entitas aktif yang memulai operasi (pengguna, proses, thread, modul perangkat lunak).
- Himpunan Objek $O = \{o_1, o_2, \dots, o_n\}$: Sumber daya yang dilindungi (file, segmen memori, soket IPC, perangkat), umumnya dengan $S \subseteq O$.
- Himpunan Hak Akses Universal $\mathcal{R} = \{\mathsf{read}, \mathsf{write}, \mathsf{execute}, \mathsf{append}, \mathsf{grant}, \mathsf{own}\}$: Operasi diskrit yang dapat diotorisasi pada suatu objek.
- Matriks Kontrol Akses $M : S \times O \to 2^{\mathcal{R}}$: Setiap entri $M[s, o] \subseteq \mathcal{R}$ menentukan himpunan operasi tepat yang diizinkan bagi subjek $s \in S$ terhadap objek $o \in O$.
Misalnya, sistem dengan tiga subjek $S = \{\text{Alice}, \text{Compiler}, \text{Logger}\}$ dan tiga objek file $O = \{\texttt{src.f}, \texttt{/SYSX/STAT}, \texttt{/SYSX/BILL}\}$:
$$ M[S, O] = \begin{array}{c|ccc} & \texttt{src.f} & \texttt{/SYSX/STAT} & \texttt{/SYSX/BILL} \\ \hline \text{Alice} & \{\mathsf{read}, \mathsf{write}\} & \emptyset & \emptyset \\ \text{Compiler} & \{\mathsf{read}\} & \{\mathsf{append}\} & \{\mathsf{read}, \mathsf{write}\} \\ \text{Logger} & \emptyset & \{\mathsf{read}, \mathsf{write}\} & \emptyset \end{array} $$Karena $M[S, O]$ sangat jarang (sparse) di sistem nyata, setiap arsitek harus mendekomposisinya di sepanjang salah satu dari dua sumbunya: memotong berdasarkan kolom (melampirkan daftar ke Objek), atau memotong berdasarkan baris (memberikan token ke Subjek).
flowchart TD
ACM["Matriks Kontrol Akses Butler Lampson M[S, O]<br/>Baris: Subjek S / Kolom: Objek O"]
ACM -->|"Potong per Kolom (Per Objek)"| ACL["Access Control Lists (ACL)<br/>Setiap Objek o menyimpan pasangan (Subjek s, Hak R)"]
ACM -->|"Potong per Baris (Per Subjek)"| CAP["Kapabilitas (C-Lists / OCap)<br/>Setiap Subjek s memegang handle tak terforging Cap(o, R)"]
ACL --> ACL_PROP["1. Memisahkan Penunjukan ('/etc/passwd') dari Otoritas (uid ambien)<br/>2. Subjek membawa SEMUA hak istimewanya sekaligus (Ambient Authority)<br/>3. Rentan secara struktural terhadap Confused Deputy (CSRF / SSRF)"]
CAP --> CAP_PROP["1. Menyatukan Penunjukan (objek o) dan Otoritas (hak R) dalam satu handle<br/>2. Tanpa Penunjukan Tanpa Otoritas (isolasi namespace penuh)<br/>3. Menegakkan Prinsip Hak Istimewa Terkecil (POLA) berbutir halus"]
2.1 Pemotongan per Kolom: Access Control Lists (ACL)
Ketika kita memotong matriks $M[S, O]$ secara vertikal berdasarkan kolom, kita mengaitkan setiap objek $o \in O$ dengan daftar entri tak kosong pada kolomnya:
$$ \text{ACL}(o) = \bigl\{ (s, M[s, o]) \;\big|\; s \in S,\; M[s, o] \neq \emptyset \bigr\} $$Izin UNIX/POSIX, DACL Windows NTFS, dan kebijakan IAM cloud semuanya menggunakan pemotongan kolom. Hal ini memaksakan pemisahan antara Penunjukan dan Otoritas: program menunjuk objek menggunakan string publik seperti "/SYSX/BILL", sementara monitor referensi kernel memeriksa identitas ambien (uid) proses pemanggil. Akibatnya, proses yang berjalan terus-menerus memegang gabungan seluruh izin di baris matriksnya $\bigcup_{o \in O} M[s, o]$ pada setiap panggilan sistem: Otoritas Ambien (Ambient Authority).
2.2 Pemotongan per Baris: Kapabilitas (Dennis & Van Horn 1966)
Pada tahun 1966, Jack B. Dennis dan Earl C. Van Horn memperkenalkan dekomposisi dual: memotong $M[S, O]$ secara horizontal berdasarkan baris. Pada setiap subjek $s \in S$, kita kaitkan Ruang Kapabilitas (CSpace atau C-List):
$$ \text{CSpace}(s) = \bigl\{ \text{Cap}(o, R) \;\big|\; o \in O,\; R = M[s, o] \neq \emptyset \bigr\} $$Setiap elemen $c = \text{Cap}(o, R)$ adalah sebuah Kapabilitas (Capability)—token otoritas yang tak dapat dipalsukan yang mengikat Penunjukan (pointer atau handle langsung ke objek $o$) dan Otoritas (himpunan bagian hak $R \subseteq \mathcal{R}$) menjadi satu referensi tak terpisahkan. Jika subjek $s$ tidak memegang kapabilitas ke objek $o$, subjek $s$ bahkan tidak dapat menamai atau mengalamatkan $o$: Tanpa Penunjukan Tanpa Otoritas; Tanpa Otoritas Tanpa Penunjukan.
| Dimensi Arsitektur | Access Control Lists (ACL — Potongan Kolom) | Kapabilitas (OCap / C-Lists — Potongan Baris) |
|---|---|---|
| Dekomposisi $M[S, O]$ | Disimpan per kolom pada setiap Objek $o \in O$ | Disimpan per baris yang dipegang setiap Subjek $s \in S$ |
| Filosofi Otorisasi | Siapa Anda (Who You Are): Identitas / uid pemanggil | Apa yang Anda Pegang (What You Hold): Token kapabilitas yang ditunjukkan |
| Penunjukan vs. Otoritas | Terpisah (Jalur string yang bisa dipalsukan + Identitas ambien) | Menyatu (Handle tak terforging menamai $o$ sekaligus memberi $R$) |
| Model Otoritas | Otoritas Ambien: Semua hak uid aktif di setiap panggilan | Otoritas Selektif: Hanya handle yang diteruskan secara eksplisit yang aktif |
| Kerentanan Confused Deputy | Rentan Secara Struktural (CSRF, SSRF, eskalasi setuid) | Kebal Secara Struktural (Klien wajib meneruskan handle resmi) |
| Sistem Representatif | ACL UNIX/POSIX, Windows NTFS DACL, AWS IAM | KeyKOS, seL4, FreeBSD Capsicum, Fuchsia Zircon, CHERI, WASI |
3. Masalah Deputi yang Bingung (Confused Deputy): Klasik Norm Hardy (1988)
Mengapa memisahkan Penunjukan dari Otoritas begitu berbahaya? Arsitek komputer Norm Hardy menerbitkan penjelasan definitifnya pada Oktober 1988 di ACM SIGOPS Operating Systems Review berjudul “The Confused Deputy (or why capabilities might have been invented)", menceritakan bencana keamanan nyata pada pertengahan 1970-an di sistem operasi komersial Tymshare.
3.1 Anatomi Bencana Kompiler /SYSX/FORT
Pada sistem Tymshare, kompiler Fortran berada di /SYSX/FORT:
- Kebutuhan Statistik: Administrator ingin mengumpulkan statistik penggunaan dengan memprogram
/SYSX/FORTagar menambahkan catatan ke file/SYSX/STATsetiap kali kompilasi selesai. - Pemberian Otoritas Ambien: Program
/SYSX/FORTdiberi otoritas tulis ambien ke seluruh direktori/SYSX(serupa dengansetuiddi UNIX). - Nama File Output dari Pengguna: Kompiler menerima argumen string dari pengguna yang menentukan jalur file tempat output debugging harus ditulis (mis.
FORT(SRC="prog.f", OUT="listing.txt")). - Permata Mahkota di
/SYSX/BILL: Di dalam/SYSXjuga tersimpan basis data utama penagihan pelanggan,/SYSX/BILL.
Suatu hari, seorang pengguna memanggil /SYSX/FORT dan memberikan string "/SYSX/BILL" sebagai nama file output debugging. Ketika kompiler memanggil open("/SYSX/BILL", WRITE), monitor referensi ACL OS bertanya: “Apakah proses aktif (/SYSX/FORT) memiliki izin menulis di /SYSX?” Jawabannya adalah Ya—dan kompiler dengan patuh menimpa basis data utama penagihan pelanggan perusahaan /SYSX/BILL dengan pesan diagnostik Fortran!
flowchart TD
subgraph ACL_WORLD["Model ACL + Otoritas Ambien (The Confused Deputy)"]
U1["Pengguna Jahat<br/>(Tanpa akses ke /SYSX/BILL)"] -->|"1. Meneruskan string jalur OUT='/SYSX/BILL'"| D1["Deputi: Kompiler /SYSX/FORT<br/>(Otoritas Ambien: Tulis ke /SYSX/*)"]
D1 -->|"2. open('/SYSX/BILL', WRITE)<br/>Secara implisit memakai otoritas ambien miliknya"| OS1["Monitor Referensi OS (Cek ACL)"]
OS1 -->|"3. Kompiler punya izin tulis /SYSX -> DIIZINKAN!"| BILL1["DB Penagihan Utama /SYSX/BILL<br/>[RUSAK / TERTIMPA!]"]
end
subgraph CAP_WORLD["Model Kapabilitas (Penunjukan & Otoritas Menyatu)"]
U2["Pengguna<br/>(Hanya memegang kapabilitas file miliknya)"] -->|"1. Meneruskan kapabilitas output cap_out<br/>(Tidak bisa meneruskan Cap ke /SYSX/BILL karena tidak punya!)"| D2["Deputi: Kompiler /SYSX/FORT<br/>(Hanya dibekali cap_stat)"]
D2 -->|"2a. write(cap_out, debug_output)<br/>Memakai otoritas yang diberikan eksplisit oleh Pengguna"| OUT2["File Output Pengguna listing.txt"]
D2 -->|"2b. append(cap_stat, usage_stats)<br/>Memakai kapabilitas privat saat instalasi"| STAT2["File Statistik /SYSX/STAT"]
end
3.2 Mengapa Kompiler “Bingung”? Dan Keturunan Modernnya
Hardy menyebut /SYSX/FORT sebagai Deputi yang Bingung (Confused Deputy) karena ia bertindak sebagai agen yang melayani dua prinsipal berbeda (administrator sistem dan pengguna) secara bersamaan tanpa cara untuk memisahkan otoritas mereka saat membuka jalur string. Dalam arsitektur kapabilitas, kompiler hanya dibekali kapabilitas privat $c_{\text{stat}} = \text{Cap}(\texttt{/SYSX/STAT}, \{\mathsf{append}\})$, dan pengguna wajib meneruskan handle kapabilitas tulis $c_{\text{out}} = \text{Cap}(f_{\text{out}}, \{\mathsf{write}\})$, sehingga bug tersebut mustahil terjadi.
Kelas kerentanan paling merusak dalam keamanan siber modern adalah wujud langsung dari Confused Deputy:
- Cross-Site Request Forgery (CSRF): Browser web adalah deputi yang bingung yang secara otomatis melampirkan otoritas ambien Anda (cookie sesi
bank.example) pada permintaan yang dipicu olehevil.example. Token CSRF memperbaiki ini dengan mewajibkan formulir menyertakan token kapabilitas yang tak dapat dipalsukan. - Server-Side Request Forgery (SSRF): Aplikasi web cloud mengambil URL yang diberikan pengguna (
"http://169.254.169.254/latest/meta-data/") menggunakan otoritas jaringan ambien miliknya di dalam VPC cloud untuk mencuri kredensial IAM. - Serangan Rantai Pasokan (
npm/PyPI): Pustaka pihak ketiga berukuran 20 baris dapat membaca~/.ssh/id_rsakarena di bawah ACL POSIX, setiap fungsi di dalam proses Anda mewarisi seluruh otoritas ambien dariuidAnda.
4. Model Object-Capability (OCap), Atenuasi, dan Pencabutan
Dalam disertasi PhD tahun 2006 di Universitas Johns Hopkins (“Robust Composition”), Mark S. Miller membuktikan bahwa bahasa pemrograman berorientasi objek yang aman secara memori sudah memiliki mekanisme tepat untuk menegakkan Prinsip Hak Istimewa Terkecil (POLA) hingga ke tingkat objek individual: referensi objek itu sendiri.
4.1 Tiga Invarian OCap dan Tiga Hukum Perolehan Kapabilitas
Agar bahasa yang aman secara memori (seperti Hardened JavaScript / SES, E, atau komponen Wasm) menjadi sistem Object-Capability (OCap) sejati, runtime harus menegakkan tiga invarian:
- Tanpa Referensi Palsu: Program tidak dapat membuat referensi objek dengan mengubah integer menjadi pointer atau aritmetika pointer di luar batas.
- Tanpa Status Global Mutable (Nol Otoritas Ambien): Lingkup global tidak boleh memiliki variabel mutable atau modul I/O ambien (
fs,net), dan prototipe dasar (Object.prototype) harus dibekukan secara mendalam (Object.freeze). - Enkapsulasi Mutlak: Status leksikal privat di dalam closure atau field
#privatetidak dapat diakses dari luar melalui refleksi.
Dalam graf referensi $G = (V, E)$, sisi baru $(A \to C)$ hanya dapat muncul melalui tiga cara: 1. Parenthood (Pembuatan, new C()), 2. Endowment (Pembekalan saat pembuatan closure), atau 3. Introduction (pengenal $B$ yang memegang $(B \to A)$ dan $(B \to C)$ meneruskan $C$ sebagai argumen pesan ke $A$):
4.2 Atenuasi via Facet dan Pencabutan via Caretaker Redell & Membran
Menepis mitos populer, kapabilitas mendukung atenuasi dan pencabutan instan, sebagaimana dipecahkan oleh David D. Redell pada tahun 1974 melalui pola Caretaker dan digeneralisasi oleh Membran yang Dapat Dicabut (Revocable Membranes) karya Mark S. Miller:
| |
Jika kapabilitas mengembalikan kapabilitas turunan (seperti direktori yang mengembalikan subdirektori), Membran yang Dapat Dicabut menggunakan Proxy dan WeakMap untuk membungkus secara transitif semua nilai kembalian dan argumen yang melewati batas membran, melumpuhkan seluruh subgraf seketika saat revoke() dipanggil.
5. Penerapan Industri: seL4, FreeBSD Capsicum, CHERI, dan WebAssembly WASI
Pertama-tama mari luruskan kesalahpahaman terminologi: capabilities(7) di Linux (CAP_NET_ADMIN, dll.) BUKANLAH kapabilitas objek! Fitur itu hanya memecah hak ambien root menjadi sekitar 41 flag per thread tanpa menunjuk objek spesifik apa pun. Arsitektur kapabilitas industri sejati diwujudkan dalam empat sistem:
- Mikrokernel Terverifikasi Formal seL4: Kernel OS pertama di dunia dengan bukti matematis lengkap yang diperiksa mesin (di Isabelle/HOL). Di seL4 tidak ada otoritas ambien: semua sumber daya (thread, ruang alamat, endpoint IPC, frame memori) diakses secara eksklusif melalui kapabilitas di CSpace (tabel CNode) milik thread, dengan atenuasi via
seL4_CNode_Mintdan pencabutan transitif melalui pohon derivasi CDT (seL4_CNode_Revoke). - FreeBSD Capsicum: Dibuat di Universitas Cambridge dan Google, Capsicum mengangkat deskriptor file UNIX (
fd) menjadi kapabilitas sejati. Saat proses memanggilcap_enter(), kernel memblokir secara permanen setiap panggilan sistem yang mengakses namespace global (open(),connect(),bind()menghasilkanECAPMODE). Proses hanya dapat beroperasi pada deskriptor yang sudah dipegangnya (serta sub-jalur relatif melaluiopenat(dir_fd, ...)tanpa pelarian".."), sambil membatasi lebih dari 60 bit hak secara presisi dengancap_rights_limit(fd, &rights). - Kapabilitas dalam Silikon: CHERI dan ARM Morello: Dikembangkan oleh SRI International dan Universitas Cambridge serta diwujudkan dalam silikon oleh ARM pada prosesor Morello dan CHERIoT-RISC-V, CHERI menggantikan pointer 64-bit dengan kapabilitas perangkat keras 128-bit ditambah tag validitas out-of-band 1-bit (Tag Bit):
Pada setiap akses memori, CPU memeriksa dalam satu siklus apakah alamat berada di dalam [Base, Top) dan memenuhi izin. Jika instruksi integer menimpa satu byte saja dari kapabilitas di RAM, pengontrol memori secara otomatis menghapus bit Tag menjadi 0, mencegah dereferensi pointer palsu dan memberantas buffer overflow serta serangan ROP langsung di silikon.
4. WebAssembly (WASI) dan Macaroons: Modul WASI berjalan tanpa otoritas ambien dan hanya dapat mengakses deskriptor direktori pra-buka yang disuntikkan secara eksplisit oleh host. Di lingkungan cloud terdistribusi, Macaroons dari Google menggunakan rantai tanda tangan HMAC bersarang yang memungkinkan pemegang token melakukan atenuasi mandiri dengan menambahkan syarat kontekstual (Caveats) tanpa menghubungi basis data pusat.
