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:
- Jika Anda menggunakan Sandbox2 dalam mode pertama
tempat sandbox diaktifkan sebelum
execve(), semua thread akan mewarisi kebijakan tersebut, dan tidak ada masalah. Ini adalah mode sandbox yang disukai. - Jika Anda menggunakan mode kedua
tempat eksekutor memiliki
set_enable_sandbox_before_exec(false)dan Sandboxee memberi tahu eksekutor kapan ia ingin di-sandbox denganSandboxMeHere(), pastikan filter diterapkan ke semua thread. Jika tidak, ada risiko sandbox escape: kode berbahaya dapat bermigrasi dari thread yang di-sandbox ke thread yang tidak di-sandbox.
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>