Desain Sandbox2 didasarkan pada teknologi yang sudah dikenal dan mapan, framework kebijakan, dan 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 ruang pengguna berjalan secara independen satu sama lain, mereka berbagi satu instance kernel. Sandbox2 menggunakan jenis namespace berikut:
- IPC
- Jaringan (kecuali jika dinonaktifkan secara eksplisit dengan memanggil
PolicyBuilder::AllowUnrestrictedNetworking()) - Pemasangan (menggunakan tampilan kustom dari pohon sistem file)
- PID
- Pengguna
- UTS
Baca lebih lanjut tentang namespace Linux di Wikipedia atau di halaman manual terkait.
IPC
Sandbox2 memungkinkan pertukaran data arbitrer antara Sandbox Executor dan Sandboxee yang tidak tepercaya. Sandbox2 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 ke Mode Komputasi Aman (seccomp) yang memungkinkan penggunaan aturan Berkeley Packet Filter (BPF) untuk memfilter syscall.
seccomp adalah fasilitas kernel Linux yang membatasi panggilan sistem proses untuk hanya mengizinkan exit, sigreturn, read, dan write. Jika proses mencoba menjalankan syscall lain, proses tersebut akan dihentikan. Ekstensi seccomp-bpf memungkinkan lebih banyak fleksibilitas daripada seccomp. Daripada mengizinkan kumpulan syscall tetap, seccomp-bpf menjalankan program BPF pada data syscall dan bergantung pada nilai yang ditampilkan program, program dapat menjalankan syscall, melewati syscall dan menampilkan nilai dummy, menghentikan proses, membuat sinyal, atau memberi tahu pelacak.
Ptrace
Syscall ptrace (pelacakan proses) menyediakan fungsi yang memungkinkan proses pelacak mengamati dan mengontrol eksekusi proses tracee. Proses pelacak memiliki kontrol penuh atas tracee setelah terlampir. Baca lebih lanjut tentang ptrace di Wikipedia atau di halaman manual terkait.
Kebijakan Sandbox
Kebijakan Sandbox Policy adalah bagian terpenting dari sandbox, karena kebijakan ini menentukan tindakan yang dapat dan tidak dapat dijalankan oleh Sandboxee. Kebijakan sandbox memiliki 2 bagian:
- Kebijakan Syscall
- Penyiapan namespace
Kebijakan Syscall Default
Kebijakan default memblokir syscall yang selalu berbahaya dan diutamakan daripada kebijakan diperluas yang disediakan pengguna.
Kebijakan Syscall Diperluas
Kebijakan syscall yang diperluas dapat dibuat menggunakan
PolicyBuilder
class kami. Class ini menentukan sejumlah aturan praktis (misalnya AllowStaticStartup, AllowDynamicStartup, AllowOpen) yang dapat digunakan untuk meningkatkan keterbacaan kebijakan Anda.
Dalam sebagian besar kasus, Anda sebaiknya mulai dengan
DefaultPolicyBuilder
(sapi::Sandbox2Config::DefaultPolicyBuilder()), yang menampilkan
PolicyBuilder yang telah dikonfigurasi sebelumnya dengan kebijakan dasar untuk library
single-thread biasa dan dapat disesuaikan lebih lanjut dengan aturan tambahan
(seperti .AllowDynamicStartup() dan .AddLibrariesForBinary() saat melakukan sandbox
pada biner). Di Sandboxed API (SAPI), DefaultPolicyBuilder() digunakan oleh sapi::SandboxConfig::DefaultConfig() bersama dengan sapi::SandboxConfig::DefaultFlags(), sapi::SandboxConfig::DefaultEnvironmentVariables(), dan sapi::Sandbox2Config::DefaultLimits(). Membuat PolicyBuilder secara langsung
hanya boleh digunakan jika DefaultPolicyBuilder() tidak dapat digunakan atau jika konfigurasi yang tepat diperlukan.
Jika Anda ingin lebih membatasi syscall 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 apa pun 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, penyerang yang mengeksploitasi kerentanan eksekusi kode juga dibatasi oleh batas 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 proses mencoba membuat syscall lain, proses tersebut akan dihentikan karena pelanggaran kebijakan. Oleh karena itu, jika proses terganggu (eksekusi kode oleh pengguna berbahaya), proses tersebut tidak dapat melakukan hal yang lebih berbahaya daripada menghasilkan output yang buruk (yang masih perlu ditangani dengan benar oleh eksekutor dan lainnya).
Penyiapan Namespace
Objek PolicyBuilder juga digunakan untuk menyiapkan tampilan sistem file individual Sandboxee. 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 secara otomatis.
Tanda Command Line
Kebijakan Sandbox2 dapat dinonaktifkan dengan menentukan salah satu tanda command line berikut. Tanda ini ditujukan untuk tujuan pengujian (misalnya, saat menyempurnakan Kebijakan Syscall Diperluas).
--sandbox2_danger_danger_permit_all--sandbox2_danger_danger_permit_all_and_log
Sandbox Executor
Sandbox Executor adalah proses yang tidak di-sandbox. Proses ini adalah proses pelacak ptrace yang terlampir ke Sandboxee (proses tracee ptrace). Sandbox Executor juga menyiapkan dan menjalankan instance Monitor yang melacak Sandboxee dan memberikan informasi status.
Sandbox2 memungkinkan tiga mode eksekusi: Standalone, Sandbox2 Forkserver, dan Forkserver Kustom. Jika Anda menggunakan forkserver, Sandboxee akan dibuat sebagai proses turunan dari Sandbox Executor. Mode ini dijelaskan secara mendetail di sini.
Sandboxee
Sandboxee adalah proses yang berjalan di lingkungan sandbox terbatas yang ditentukan oleh Kebijakan Sandbox. Sandbox Executor mengirimkan kebijakan ke Sandboxee melalui IPC. Kemudian, Sandboxee menerapkan kebijakan tersebut. Pelanggaran kebijakan akan mengakibatkan penghentian proses, kecuali jika dikonfigurasi lain (lihat Kebijakan Sandbox).