Pertanyaan Umum (FAQ)

Dapatkah saya menggunakan thread?

Ya, thread didukung di Sandbox2.

Semua thread 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:

Bagaimana cara mengompilasi Sandboxee?

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

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

Ini adalah dilema yang pada dasarnya dapat direduksi menjadi:

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

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

Compiler telah ditingkatkan selama bertahun-tahun dan kini mendukung opsi static-pie. Dengan opsi ini, compiler diinstruksikan untuk menghasilkan kode independen posisi, tetapi dibandingkan dengan pie, kode 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 adalah peningkatan dibandingkan 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 BUILD statis: static_bin.cc ditautkan secara statis dengan static-pie, yang memungkinkan Anda memiliki kebijakan syscall yang sangat ketat. Hal ini juga berfungsi dengan baik untuk sandbox biner pihak ketiga.

Dapatkah saya melakukan sandbox biner x86 32-bit?

Sandbox2 hanya dapat melakukan sandbox 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 melakukan sandbox biner x86 32-bit, atau biner x86 64-bit yang membuat syscall 32-bit (melalui int 0x80), keduanya akan menghasilkan pelanggaran sandbox yang dapat diidentifikasi berdasarkan label arsitektur [X86-32].

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

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

Untuk setiap instance Sandboxee (proses baru yang dibuat dari forkserver), thread baru akan dibuat – di situlah batasannya.

Dapatkah Eksekutor meminta pembuatan lebih dari satu Sandbox?

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

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

Sandbox2 hanya mendukung berjalan di kernel yang cukup baru. Batas saat ini adalah kernel 3.19, meskipun hal tersebut dapat berubah di masa mendatang. Alasannya adalah karena kami menggunakan fitur kernel yang relatif baru, termasuk namespace pengguna dan seccomp dengan flag TSYNC.

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

Jika Anda menjalankan di Debian atau Ubuntu, memperbarui kernel semudah menjalankan:

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