Penjelasan Sandbox2

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).