Baru-baru ini, penulis pustaka standar Cosmopolitan C dan platform Redbean mengumumkan implementasi mekanisme isolasi pledge() untuk Linux.
Awalnya dikembangkan oleh proyek OpenBSD , pledge memungkinkan Anda untuk secara selektif melarang aplikasi mengakses panggilan sistem yang tidak digunakan (membuat daftar putih panggilan sistem untuk aplikasi dan melarang panggilan lainnya). Tidak seperti mekanisme kontrol akses syscall yang tersedia di Linux, seperti seccomp, pledge dirancang dari awal agar semudah mungkin digunakan.
Inisiatif yang gagal untuk mengisolasi aplikasi di lingkungan dasar OpenBSD menggunakan mekanisme systrace menunjukkan bahwa isolasi pada tingkat panggilan sistem individual terlalu rumit dan memakan waktu.
Alternatifnya, diusulkan sebuah mekanisme yang memungkinkan pembuatan aturan isolasi tanpa perlu membahas detail dan memanipulasi kelas akses yang telah disiapkan.
Misalnya kelas yang ditawarkan adalah stdio (input/output), rpath (hanya membaca file), wpath (menulis file), cpath (membuat file), tmppath (bekerja dengan file sementara), inet (jaringan soket), unix (soket unix ), dns (resolusi DNS), getpw (akses baca ke basis data pengguna), ioctl (panggilan ioctl), proc (kontrol proses), exec (proses startup), dan id (kontrol izin).
Aturan untuk bekerja dengan panggilan sistem ditentukan dalam bentuk anotasi yang mencakup daftar kelas panggilan sistem yang diizinkan dan larik jalur file tempat akses diperbolehkan. Setelah mengkompilasi dan menjalankan aplikasi yang dimodifikasi, kernel mengambil alih tugas memantau kepatuhan terhadap aturan yang ditentukan.
Secara terpisah, implementasi janji untuk FreeBSD sedang dikembangkan, yang dibedakan dengan kemampuan untuk mengisolasi aplikasi tanpa membuat perubahan pada kode mereka, sedangkan di OpenBSD panggilan janji ditujukan untuk integrasi yang erat dengan lingkungan dasar dan penambahan anotasi ke kode dari masing-masing.
Ikrar seperti buah terlarang yang kita semua idamkan ketika bos mengatakan kita harus menggunakan hal-hal seperti Linux. Mengapa itu penting? Itu karena janji() sebenarnya membuat keamanan dapat dimengerti. Linux tidak pernah benar-benar memiliki lapisan keamanan yang dapat dipahami oleh manusia biasa.
Para pengembang port pledge Linux mengikuti jejak FreeBSD dan, alih-alih melakukan perubahan kode, menyiapkan utilitas tambahan dari pledge.com yang memungkinkan Anda menerapkan pembatasan tanpa mengubah kode aplikasi Anda. Misalnya, untuk menjalankan utilitas curl dengan akses hanya ke kelas panggilan sistem stdio, rpath, inet, dan threadstdio, cukup jalankan `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.
Utilitas ini berfungsi pada semua distribusi Linux mulai dari RHEL6 dan seterusnya dan tidak memerlukan akses root. Selain itu, berdasarkan pustaka cosmopolitan, disediakan API untuk mengelola pembatasan dalam kode program C, yang memungkinkan, antara lain, pembuatan enklave untuk membatasi akses secara selektif ke fungsi aplikasi tertentu.
Ada beberapa pengembang di masa lalu yang telah mencoba ini. Saya tidak akan menyebutkan nama, karena sebagian besar proyek ini tidak pernah selesai. Ketika membahas SECOMP, tutorial online hanya menjelaskan cara memasukkan panggilan sistem ke daftar putih, sehingga kebanyakan orang kehilangan minat sebelum mengetahui cara memfilter argumen. Proyek-proyek yang bergerak maju juga memiliki kekhilafan seperti mengizinkan bit setuid/setgid/sticky diubah. Oleh karena itu, tidak ada alternatif saat ini yang harus digunakan. Saya pikir upaya ini membawa kita lebih dekat untuk memiliki janji() daripada sebelumnya.
Implementasi tidak memerlukan perubahan kernel: batasan utilitas diterjemahkan ke dalam aturan SECCOMP BPF dan diproses menggunakan mekanisme isolasi panggilan sistem asli Linux. Misalnya, memanggil janji("stdio rpath", 0) akan dikonversi ke filter BPF
Terakhir, jika Anda tertarik untuk mempelajari lebih lanjut, Anda dapat menemukan detailnya di tautan berikut.