Desain Sandbox2 dibangun berdasarkan teknologi yang sudah dikenal dan mapan, framework kebijakan, dan dua proses: Sandbox Executor dan Sandboxee.
Teknologi yang Terlibat
Bagian berikut mencakup teknologi yang membangun lapisan dasar untuk Sandbox2.
Namespace Linux
Namespace Linux adalah upaya untuk menyediakan virtualisasi tingkat sistem operasi. Meskipun beberapa ruang pengguna berjalan secara independen satu sama lain, ruang pengguna tersebut berbagi satu instance kernel. Sandbox2 menggunakan jenis namespace berikut:
- IPC
- Jaringan (kecuali jika dinonaktifkan secara eksplisit dengan memanggil
PolicyBuilder::AllowUnrestrictedNetworking()
) - Pasang (menggunakan tampilan kustom hierarki sistem file)
- PID
- Pengguna
- UTS
Baca selengkapnya tentang namespace Linux di Wikipedia atau di halaman manual terkait.
IPC
Sandbox2 memungkinkan pertukaran data arbitrer antara Sandbox Executor dan Sandboxee yang tidak tepercaya. API 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 Mode Komputasi Aman (seccomp) yang memungkinkan penggunaan aturan Berkeley Packet Filter (BPF) untuk memfilter syscall.
seccomp adalah fasilitas kernel Linux yang membatasi panggilan sistem suatu proses agar hanya mengizinkan exit
, sigreturn
, read
, dan write
. Jika proses mencoba
mengeksekusi syscall lain, proses tersebut akan dihentikan. Ekstensi seccomp-bpf memberikan
fleksibilitas yang lebih besar daripada seccomp. Daripada mengizinkan serangkaian syscall tetap, seccomp-bpf menjalankan program BPF pada data syscall dan bergantung pada nilai yang ditampilkan program, seccomp-bpf dapat mengeksekusi syscall, melewati syscall dan menampilkan nilai tiruan, menghentikan proses, menghasilkan sinyal, atau memberi tahu tracer.
Ptrace
Syscall ptrace (process trace) 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 manual terkait.
Kebijakan Sandbox
Kebijakan Sandbox adalah bagian terpenting dari sandbox, karena menentukan tindakan yang dapat dan tidak dapat dilakukan oleh Sandboxee. Ada 2 bagian dalam kebijakan sandbox:
- Kebijakan Syscall
- Penyiapan namespace
Kebijakan Syscall Default
Kebijakan default memblokir syscall yang selalu berbahaya dan lebih diutamakan daripada kebijakan yang diperluas yang disediakan pengguna.
Kebijakan Syscall yang Diperluas
Kebijakan syscall yang diperluas dapat dibuat menggunakan class
PolicyBuilder
kami. Class ini menentukan sejumlah aturan praktis (misalnya,
AllowStaticStartup
, AllowDynamicStartup
, AllowOpen
) yang dapat digunakan untuk
meningkatkan keterbacaan kebijakan Anda.
Jika Anda 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 terhadap kerentanan apa pun yang ada dalam kode akan dibatasi oleh kebijakan. Jika Anda dapat menentukan secara persis syscall dan argumen mana yang diperlukan untuk operasi normal program, maka penyerang mana pun yang mengeksploitasi kerentanan eksekusi kode juga dibatasi pada batas yang sama.
Kebijakan Sandbox yang sangat ketat dapat menolak semua panggilan sistem kecuali operasi baca dan tulis pada deskriptor file input dan output standar. Di dalam sandbox ini, program dapat mengambil input, memprosesnya, dan menampilkan output. Namun, jika proses mencoba melakukan syscall lain, proses tersebut akan dihentikan karena pelanggaran kebijakan. Oleh karena itu, jika prosesnya terganggu (eksekusi kode oleh pengguna jahat), proses tersebut tidak dapat melakukan hal yang lebih jahat daripada menghasilkan output yang buruk (yang masih perlu ditangani dengan benar oleh eksekutor dan lainnya).
Penyiapan Namespace
Objek PolicyBuilder juga digunakan untuk menyiapkan tampilan individual Sandboxee terhadap sistem file. File tunggal (AddFile
/ AddFileAt
), seluruh direktori
(AddDirectory
/ AddDirectoryAt
), serta penyimpanan sementara (AddTmpfs
)
dapat dipetakan ke lingkungan Sandboxee. Selain itu, AddLibrariesForBinary
dapat digunakan untuk memetakan semua library yang diperlukan oleh executable yang ditautkan secara dinamis yang ditentukan secara otomatis.
Tanda Command Line
Kebijakan Sandbox2 dapat dinonaktifkan dengan menentukan salah satu flag command line berikut. Flag ini ditujukan untuk tujuan pengujian (misalnya, saat menyempurnakan Kebijakan Syscall yang Diperluas).
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
Sandbox Executor
Sandbox Executor adalah proses yang tidak di-sandbox itu sendiri. Proses ini adalah proses pelacak ptrace yang terhubung ke Sandboxee (proses yang dilacak ptrace). Sandbox Executor juga menyiapkan dan menjalankan instance Monitor yang melacak Sandboxee dan memberikan informasi status.
Sandbox2 memungkinkan tiga mode eksekusi: Mandiri, Sandbox2 Forkserver, dan Forkserver Kustom. Jika Anda menggunakan forkserver, Sandboxee dibuat sebagai proses turunan dari Sandbox Executor. Mode ini dijelaskan secara mendetail di sini.
Sandboxee
Sandboxee adalah proses yang berjalan di lingkungan sandbox yang dibatasi yang ditentukan oleh Kebijakan Sandbox. Sandbox Executor mengirimkan kebijakan ke Sandboxee melalui IPC. Sandboxee kemudian menerapkan kebijakan. Setiap pelanggaran terhadap kebijakan akan mengakibatkan penghentian proses, kecuali jika dikonfigurasi lainnya (lihat Kebijakan Sandbox).