Pertanyaan Umum (FAQ)

Dapatkah saya menggunakan thread?

Ya, thread didukung di Sandbox2.

Semua rangkaian pesan harus di-sandbox

Karena cara kerja Linux, kebijakan seccomp-bpf hanya diterapkan ke thread saat ini: artinya, kebijakan tidak diterapkan ke thread lain yang ada, tetapi thread mendatang akan mewarisi kebijakan tersebut:

  • Jika Anda menggunakan Sandbox2 dalam mode pertama dengan sandboxing diaktifkan sebelum execve(), semua thread akan mewarisi kebijakan, dan tidak ada masalah. Ini adalah mode sandbox yang lebih disukai.
  • Jika Anda menggunakan mode kedua dengan eksekutor memiliki set_enable_sandbox_before_exec(false) dan Sandboxee memberi tahu eksekutor kapan ia ingin di-sandbox dengan SandboxMeHere(), pastikan filter diterapkan ke semua thread. Jika tidak, ada risiko keluar dari sandbox: kode berbahaya dapat bermigrasi dari thread yang di-sandbox ke thread yang tidak di-sandbox.

Bagaimana cara mengompilasi Sandboxee?

Jika dibandingkan dengan executable yang ditautkan secara statis, mengompilasi sandboxee ke executable yang ditautkan secara dinamis akan menghasilkan peningkatan signifikan pada syscall (misalnya, open/openat, mmap, dll.) yang perlu dimasukkan dalam daftar yang diizinkan. Semua syscall tambahan ini diperlukan karena pemanggilan linker dinamis saat runtime untuk memuat library bersama.

Namun, jika melihat sandboxee yang ditautkan secara statis: Meskipun lebih sedikit syscall yang perlu dimasukkan dalam daftar yang diizinkan, ada juga implikasi keamanan; entropi heap ASLR berkurang (dari 30 bit menjadi 8 bit), yang membuat eksploitasi lebih mudah.

Dilema ini pada dasarnya dapat direduksi menjadi:

  • Dinamis: ASLR heap yang baik, berpotensi lebih sulit untuk mendapatkan eksekusi kode awal, tetapi dengan biaya kebijakan sandbox yang kurang efektif, berpotensi lebih mudah untuk keluar.
  • Statis: ASLR heap buruk, berpotensi lebih mudah mendapatkan eksekusi kode awal, tetapi kebijakan sandbox yang lebih efektif, berpotensi lebih sulit untuk keluar.

Sebelumnya, biner yang ditautkan secara statis tidak mendukung kode independen posisi (pie). Selain itu, Bazel menambahkan pie secara default. Untuk dapat menentukan filter syscall yang ketat, Anda harus mengganti nilai default Bazel.

Kompilator telah ditingkatkan selama bertahun-tahun dan kini mendukung opsi static-pie. Dengan opsi ini, compiler diinstruksikan untuk membuat kode yang independen dari posisi, tetapi dibandingkan dengan pie, opsi ini kini juga mencakup semua library yang ditautkan secara statis. Dari sudut pandang keamanan, static-pie masih mengurangi entropi ASLR (dari 30 bit menjadi 14 bit), tetapi ini merupakan peningkatan dari situasi sebelumnya tanpa pie.

Karena Bazel menambahkan pie secara default dan statis tidak kompatibel dengannya, pertimbangkan untuk menggunakan flag opsi linker untuk meneruskan flag linker -static-pie ke aturan cc_binary dan mengganti default:

  linkstatic = 1,
  linkopts=["-static-pie"],

Untuk contoh opsi ini, lihat contoh static BUILD: static_bin.cc ditautkan secara statis dengan static-pie, sehingga memungkinkan kebijakan syscall yang sangat ketat. Hal ini juga berfungsi dengan baik untuk sandbox biner pihak ketiga.

Dapatkah saya melakukan sandbox pada biner x86 32-bit?

Sandbox2 hanya dapat melakukan sandbox pada arsitektur yang sama dengan arsitektur yang digunakan untuk mengompilasinya.

Selain itu, dukungan untuk x86 32-bit telah dihapus dari Sandbox2. Jika Anda mencoba menggunakan eksekutor x86 64-bit untuk menyandbox biner x86 32-bit, atau biner x86 64-bit yang membuat panggilan sistem 32-bit (melalui int 0x80), keduanya akan menghasilkan pelanggaran sandbox yang dapat diidentifikasi oleh label arsitektur [X86-32].

Alasan di balik perilaku ini adalah karena nomor syscall berbeda di antara arsitektur dan karena kebijakan syscall ditulis dalam arsitektur executor, maka akan berbahaya jika mengizinkan arsitektur yang berbeda untuk Sandboxee. Memang, hal ini dapat menyebabkan syscall yang tampaknya tidak berbahaya sebenarnya berarti syscall lain yang lebih berbahaya dapat membuka sandbox untuk melakukan pelarian.

Apakah ada batasan jumlah sandbox yang dapat diminta oleh proses eksekutor?

Untuk setiap instance Sandboxee (proses baru yang dihasilkan dari forkserver), thread baru dibuat – di sinilah letak batasannya.

Dapatkah Eksekutor meminta pembuatan lebih dari satu Sandbox?

Tidak. Ada hubungan 1:1 – instance Executor menyimpan PID Sandboxee, mengelola instance Comms ke instance Sandbox, dll.

Mengapa saya mendapatkan “Function not implemented” di dalam forkserver.cc?

Sandbox2 hanya mendukung berjalan di kernel yang cukup baru. Saat ini, batas akhir kami adalah kernel 3.19, tetapi hal ini dapat berubah pada masa mendatang. Alasannya adalah kami menggunakan fitur kernel yang relatif baru, termasuk namespace pengguna dan seccomp dengan flag TSYNC.

Jika Anda menjalankan di prod, hal ini tidak akan menjadi masalah, karena hampir seluruh fleet menjalankan kernel yang cukup baru. Jika Anda mengalami masalah terkait hal ini, harap hubungi kami.

Jika Anda menjalankan Debian atau Ubuntu, mengupdate kernel semudah menjalankan:

sudo apt-get install linux-image-<RECENT_VERSION>