Desain Sandbox2 dibuat berdasarkan teknologi yang sudah terkenal dan mapan, sebuah framework kebijakan, serta dua proses: Sandbox Executor dan Sandboxee.
Teknologi yang Terlibat
Bagian berikut membahas teknologi yang membangun lapisan dasar untuk Sandbox2.
Namespace Linux
Namespace Linux adalah upaya untuk menyediakan virtualisasi tingkat sistem operasi. Meskipun beberapa {i>userspace<i} berjalan secara independen satu sama lain, mereka berbagi satu instance {i>kernel<i}. Sandbox2 menggunakan jenis namespace berikut:
- IPC
- Jaringan (kecuali dinonaktifkan secara eksplisit dengan memanggil
PolicyBuilder::AllowUnrestrictedNetworking()
) - Pasang (menggunakan tampilan kustom hierarki sistem file)
- PID
- Pengguna (kecuali dinonaktifkan secara eksplisit dengan memanggil
PolicyBuilder::AllowUnsafeKeepCapabilities()
) - UTS
Baca selengkapnya tentang namespace Linux di Wikipedia atau di halaman utama terkait.
IPC
Sandbox2 memungkinkan pertukaran data arbitrer antara Sandbox Executor dan Sandboxee yang tidak tepercaya. Fungsi ini mendukung pesan Type-Length-Value (TLV), meneruskan deskriptor file, dan pertukaran kredensial melalui token dan handle.
Seccomp-BPF
Sandbox2 mengandalkan seccomp-bpf, yang merupakan ekstensi untuk Secure Computing Mode (seccomp) yang memungkinkan penggunaan aturan Berkeley Packet Filter (BPF) untuk memfilter syscall.
seccomp adalah fasilitas kernel Linux yang membatasi panggilan sistem proses agar hanya mengizinkan exit
, sigreturn
, read
, dan write
. Jika sebuah proses mencoba menjalankan
syscall lain, proses itu akan dihentikan. Ekstensi seccomp-bpf memungkinkan fleksibilitas yang lebih besar daripada seccomp. Sebagai ganti mengizinkan sekumpulan syscall yang tetap, seccomp-bpf menjalankan program BPF pada data syscall dan bergantung pada nilai hasil program, seccomp-bpf dapat menjalankan syscall, melewati syscall dan menampilkan nilai dummy, menghentikan proses, menghasilkan sinyal, atau memberi tahu tracer.
Ptrace
Syscall ptrace (pelacakan proses) menyediakan fungsi yang memungkinkan proses tracer mengamati dan mengontrol eksekusi proses tracee. Proses tracer memiliki kontrol penuh atas tracee setelah dilampirkan. Baca selengkapnya tentang ptrace di Wikipedia atau di halaman utama terkait.
Kebijakan Sandbox
Kebijakan Sandbox adalah bagian paling penting dari sandbox karena menentukan tindakan yang dapat dan tidak dapat dijalankan oleh Sandboxee. Ada 2 bagian dalam kebijakan sandbox:
- Kebijakan Syscall
- Penyiapan namespace
Kebijakan Syscall Default
Kebijakan default akan memblokir syscall yang selalu berbahaya dan lebih diutamakan daripada kebijakan diperluas yang diberikan pengguna.
Kebijakan Syscall yang Diperluas
Kebijakan syscall yang diperluas dapat dibuat menggunakan class PolicyBuilder kami. Class ini menentukan sejumlah aturan kemudahan (misalnya AllowStaticStartup
, AllowDynamicStartup
, AllowOpen
) yang dapat digunakan untuk meningkatkan keterbacaan kebijakan Anda.
Jika ingin membatasi syscall lebih lanjut atau memerlukan aturan yang lebih kompleks, Anda dapat menentukan makro BPF mentah dengan AddPolicyOnSyscall
dan AddPolicyOnSyscalls
. Contoh crc4 menggunakan mekanisme ini untuk membatasi argumen untuk syscall read
, write
, dan close
.
Secara umum, semakin ketat Kebijakan Sandbox, semakin baik karena eksploitasi kerentanan yang ada dalam kode akan dibatasi oleh kebijakan tersebut. Jika Anda dapat menentukan dengan tepat syscall dan argumen mana yang diperlukan untuk operasi normal program, maka setiap penyerang yang mengeksploitasi kerentanan eksekusi kode juga dibatasi pada batasan yang sama.
Kebijakan Sandbox yang sangat ketat dapat menolak semua syscall kecuali pembacaan dan penulisan pada deskriptor file input dan output standar. Di dalam sandbox ini, program dapat mengambil input, memprosesnya, dan menampilkan output. Namun, jika prosesnya akan mencoba melakukan syscall lain, proses itu akan dihentikan karena melanggar kebijakan. Oleh karena itu, jika proses disusupi (eksekusi kode oleh pengguna yang berbahaya), proses tersebut tidak dapat melakukan hal yang lebih jahat daripada menghasilkan output yang buruk (yang masih harus ditangani oleh eksekutor dan pengguna lain dengan benar).
Penyiapan Namespace
Objek PolicyBuilder juga digunakan untuk menyiapkan tampilan individual sistem file Sandboxee. File tunggal (AddFile
/ AddFileAt
), seluruh direktori (AddDirectory
/ AddDirectoryAt
), serta penyimpanan sementara (AddTmpfs
) dapat dipetakan ke dalam lingkungan Sandboxee. Selain itu, AddLibrariesForBinary
dapat digunakan untuk otomatis memetakan semua library yang diperlukan oleh file executable yang ditautkan secara dinamis.
Tanda Command Line
Setiap kebijakan Sandbox2 dapat dinonaktifkan dengan menentukan salah satu tanda command line berikut. Tanda ini ditujukan untuk tujuan pengujian (mis. saat menyempurnakan Kebijakan Syscall yang Diperluas).
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
Eksekutor Sandbox
Sandbox Executor adalah proses yang tidak di-sandbox itu sendiri. Ini adalah proses ptrace tracer yang menempel pada Sandboxee (proses ptrace tracee). Sandbox Executor juga menyiapkan dan menjalankan instance Monitor yang melacak Sandboxee dan memberikan informasi status.
Sandbox2 memungkinkan tiga mode eksekusi: Stand-alone, Sandbox2 Forkserver, dan Custom Forkserver. Jika Anda menggunakan forkserver, Sandboxee akan dibuat sebagai proses turunan dari Sandbox Executor. Mode ini dijelaskan secara mendetail di sini.
Sandbox
Sandboxee adalah proses yang berjalan di lingkungan dalam sandbox terbatas yang ditentukan oleh Kebijakan Sandbox. Executor Sandbox mengirimkan kebijakan ke Sandboxee melalui IPC. Sandboxee kemudian menerapkan kebijakan tersebut. Setiap pelanggaran kebijakan akan mengakibatkan penghentian proses tersebut, kecuali jika dikonfigurasi lain (lihat Kebijakan Sandbox).