Tujuh puluh persen CVE adalah bug memory safety. Buffer overflow, use-after-free, double free. Jenis kerentanan yang memungkinkan penyerang berpindah dari JPEG yang malformed hingga akses root.

Kita telah mengetahui cara menghentikan sebagian besar bug tersebut di tingkat hardware sejak tahun 1975. Komputer Cambridge CAP menggunakan pengalamatan berbasis capability. Hydra dari Carnegie Mellon juga melakukannya. Idénya sederhana: setiap akses memori membawa izinnya sendiri. Hardware menegakkannya. Tanpa izin, tanpa akses.

Dan kemudian hardware capability menghabiskan empat dekade berikutnya dengan kalah dari model memori datar. Baru sekarang, dengan papan Morello dari ARM dan set instruksi CHERI, arsitektur capability sedang mengalami kembalinya yang kredibel.

Pertanyaannya bukan apakah capability berfungsi. Memang begitu. Pertanyaannya adalah mengapa butuh empat puluh tahun bagi industri untuk peduli.

Capability pointer adalah tiket yang tidak dapat dipalsukan, bukan sekadar alamat

Pointer normal adalah bilangan bulat. Sebuah alamat. Tidak memiliki panjang, izin, atau asal-usul. Jika Anda bisa menebak alamat, Anda bisa mengaksesnya. Itu bukan fitur. Itu adalah bug desain yang diwarisi C dari PDP-11.

Sebaliknya, capability pointer adalah tuple yang diberlakukan oleh hardware. Berisi alamat virtual, basis dan panjang wilayah yang diotorisasi, izin baca/tulis/eksekusi, serta tag validitas 1 bit. Tag disimpan di luar memori normal, di metadata hardware khusus, yang membuat capability tidak dapat dipalsukan. Anda tidak dapat membangun capability yang valid dari bilangan bulat. Anda hanya dapat menerimanya dari sesuatu yang sudah memiliki otoritas.

Di CHERI, ini terlihat seperti pointer 128-bit pada mesin 64-bit. 64 bit tambahan membawa batas dan izin. Bit tag berada di tabel bayangan atau bit ECC backup, tergantung pada implementasinya.

Berikut adalah penampakan penyempitan capability dalam praktik pada sistem CHERI:

#include <cheriintrin.h>
#include <stdio.h>

int main(void) {
    char buffer[64];

    // In the purecap ABI, &buffer[0] is already a capability
    // carrying 64-byte bounds and read/write permissions.
    char *cap = buffer;

    printf("Original length: %zu\n", cheri_length_get(cap));

    // Narrow authority to the first 16 bytes.
    char *narrow = cheri_bounds_set(cap, 16);
    printf("Narrowed length: %zu\n", cheri_length_get(narrow));

    // This access is safe and hardware-authorized.
    narrow[15] = 'x';

    // This would trap with a CHERI bounds violation:
    // narrow[20] = 'y';

    return 0;
}

Jika penyerang merusak capability pointer, bit tag akan terhapus. Hardware akan mengangkat pengecualian pada dereferensi berikutnya. Rantai eksploitasi mati pada lompatan pertama.

Itu adalah model keamanan yang jauh lebih baik daripada ASLR dan stack canary, yang hanyalah penghambat kecepatan.

iAPX 432 meracuni sumur untuk satu generasi

Jadi mengapa kita menghabiskan empat puluh tahun berpura-pura bahwa pointer hanyalah bilangan bulat?

Intel meluncurkan iAPX 432 pada tahun 1981. Ia memiliki hardware capability, segmen memori berorientasi objek, bahkan garbage collection berbantuan hardware. Ia juga kira-kira lima hingga sepuluh kali lebih lambat dari 8086, sangat kompleks, dan tidak kompatibel dengan setiap compiler yang ada.

IBM lebih beruntung dengan System/38, yang menggunakan capability untuk single-level store-nya. Ia berfungsi. Stabil. Namun ini adalah sistem midrange proprietari tanpa jalur menuju ekosistem terbuka yang sedang berkembang. Ketika revolusi UNIX tiba, ia membawa ruang alamat datar, pointer C, dan asumsi bahwa pointer muat dalam register. Asumsi itu menjadi ABI dari seluruh industri.

Pada tahun 1990-an, hardware capability hanyalah sebuah raritas penelitian. Imperatif komersial adalah kompatibilitas mundur dan performa mentah. Memory safety adalah masalah tingkat bahasa, jika memang menjadi masalah. C dan C++ menyatakannya sebagai masalah programmer.

Itu cukup berfungsi hingga internet membuat setiap buffer overflow dapat dieksploitasi dari jarak jauh.

Mode hybrid CHERI memutuskan kebuntuan kompatibilitas

Hardware capability modern, khususnya CHERI, belajar dari pelajaran iAPX 432. Ia tidak memaksa migration serba-atau-tidak-sama-sekali.

CHERI mendukung ABI hybrid di mana pointer integer legacy dan capability pointer berdampingan dalam proses yang sama. Anda dapat mengompilasi hanya parser jaringan atau library sandboxed Anda dengan capability, sementara bagian lain aplikasi menggunakan pointer normal. Sistem operasi (CheriBSD, atau port Linux CHERI) mengelola transisi tersebut.

Ini penting karena hambatan sebenarnya bukanlah luas silikon. Melainkan inersia perangkat lunak. Ada miliaran baris kode C dan C++ yang mengasumsikan sizeof(void *) == 8. Arsitektur capability yang mengharuskan penulisan ulang semuanya sudah mati sebelum tiba. Yang dapat diadopsi secara bertahap memiliki peluang.

Mekanisme hardware-nya elegan. Load dan store yang aware terhadap capability menggunakan instruksi khusus yang memeriksa tag dan batas secara paralel dengan translasi alamat. Pointer integer menghindari pemeriksaan sepenuhnya. Anda membayar keamanan hanya di tempat Anda menggunakannya.

Biaya sebenarnya adalah tekanan TLB dan pembengkakan pointer, bukan jumlah siklus

Capability tidak gratis. Overhead-nya terbagi menjadi tiga kelompok.

Pertama, ukuran pointer. Dalam ABI purecap, setiap pointer berukuran 128 bit. Itu menggandakan tekanan cache untuk struktur data yang pointer-heavy. Linked list, tree, dan vtable semuanya menjadi lebih besar.

Kedua, granularitas batas. CHERI menegakkan batas pada granularitas byte, yang berarti subsistem memori harus memeriksa batas pada setiap dereferensi. Pemeriksaan itu sendiri cepat, tetapi capability dengan butiran halus dapat meningkatkan tekanan TLB dan cache jika Anda membuat banyak wilayah kecil yang dilindungi.

Ketiga, dan yang paling penting, perubahan perangkat lunak. Compiler harus membuat prolog yang aware terhadap capability. ABI berubah. Memory allocator harus mengembalikan capability yang dibatasi, bukan pointer raw. Debugger perlu memahami register 128-bit.

Overhead runtime yang terukur pada hardware CHERI biasanya berada dalam rentang persentase satu digit untuk sebagian besar beban kerja, dan hingga sepuluh hingga lima belas persen untuk benchmark yang pointer-heavy. Itu lebih rendah daripada overhead banyak mitigasi modern seperti memory tagging atau sandboxing, dan memberikan jaminan yang lebih kuat.

Trade-off-nya bukan performa. Trade-off-nya adalah pergolakan ekosistem.

Anda bisa menjalankannya hari ini di papan pengembangan

Jika Anda ingin mencoba hardware capability, Anda tidak membutuhkan mesin waktu atau hibah penelitian.

Papan Morello dari ARM mengimplementasikan ekstensi CHERI pada inti Neoverse N1. CheriBSD berjalan di atasnya out of the box. Jika Anda tidak memiliki hardware-nya, QEMU-CHERI mengemulasi arsitektur capability secara penuh.

Toolchain-nya adalah LLVM standar. Anda mengompilasi dengan cheri-clang dan flag -march=morello+cheri. Port FreeBSD dan Linux tersedia. Assembler, linker, dan debugger terintegrasi LLVM semuanya memahami capability.

Mulai dari satu fungsi. Bungkus parser atau rutin deserialisasi dalam capability yang disempitkan. Jalankan fuzzer Anda terhadapnya. Ketika penulisan di luar batas akan merusak heap, Anda malah mendapatkan pengecualian hardware yang bersih.

Hardware capability bukan perbaikan teoritis untuk memory safety. Ini adalah teknologi yang berfungsi dan telah dikirim, yang diabaikan industri selama empat puluh tahun karena insentifnya salah. Memori datar lebih cepat dibangun, lebih mudah di-porting, dan cukup baik hingga eksploitasi jarak jauh menjadi threat model baku.

Silikonnya bekerja. Compiler-nya bekerja. Sistem operasinya bekerja. Satu-satunya yang tersisa adalah memutuskan bagian mana dari basis kode Anda yang layak dilindungi terlebih dahulu.