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:

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

Bagaimana cara mengompilasi Sandboxee?

Jika tidak berhati-hati, mudah untuk mewarisi banyak dependensi dan efek samping (syscall tambahan, akses file, atau bahkan koneksi jaringan) yang membuat sandboxing lebih sulit (melacak semua efek samping) dan kurang aman (karena kebijakan syscall dan file lebih luas). Beberapa opsi kompilasi dapat membantu mengurangi masalah tersebut:

  • Kompilasi biner Sandboxee secara statis untuk menghindari penautan dinamis yang menggunakan banyak syscall (open/openat, mmap, dll.).
  • Karena Bazel menambahkan pie secara default, tetapi statis tidak kompatibel dengannya, pertimbangkan untuk menggunakan tanda fitur untuk memaksanya menonaktifkannya melalui opsi berikut dalam aturan cc_binary:

    linkstatic = 1,
    features = [
        "fully_static_link",  # link libc statically
        "-pie",
    ],
    

Namun: Penggunaan statis memiliki kelemahan yaitu mengurangi entropi heap ASLR (dari 30 bit menjadi 8 bit), sehingga eksploitasi menjadi lebih mudah. Tentukan dengan cermat apa yang lebih disukai bergantung pada penerapan dan kebijakan sandbox Anda:

  • tidak statis: ASLR heap yang bagus, berpotensi lebih sulit untuk mendapatkan eksekusi kode awal, tetapi dengan mengorbankan kebijakan sandbox yang kurang efektif, berpotensi lebih mudah untuk dikeluarkan.
  • statis: ASLR heap yang buruk, berpotensi lebih mudah untuk mendapatkan eksekusi kode awal, tetapi dengan kebijakan sandbox yang lebih efektif, dan berpotensi lebih sulit untuk dikeluarkan.

Pilihan yang tidak tepat karena compiler tidak mendukung PIE statis (Position Independent Executables). PIE diterapkan dengan menjadikan biner sebagai objek dinamis, dan loader dinamis memetakannya di lokasi acak sebelum mengeksekusinya. Kemudian, karena heap biasanya ditempatkan pada offset acak setelah alamat dasar biner (dan diperluas dengan brk syscall), ini berarti bagi biner statis, entropi heap ASLR hanyalah offset ini karena tidak ada PIE.

Untuk contoh opsi kompilasi ini, lihat contoh statis BUILD.bazel: static_bin.cc dikompilasi secara statis, yang memungkinkan kita memiliki kebijakan syscall yang sangat ketat. Cara ini juga sangat cocok untuk {i>sandbox<i} biner pihak ketiga.

Bisakah saya melakukan sandbox biner x86 32-bit?

Sandbox2 hanya dapat melakukan sandbox arsitektur yang sama dengan kompilasinya.

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 oleh label arsitektur [X86-32].

Alasan di balik perilaku ini adalah jumlah syscall berbeda di setiap arsitektur. Karena kebijakan syscall ditulis dalam arsitektur eksekutor, akan berbahaya jika mengizinkan arsitektur yang berbeda untuk Sandboxee. Hal ini bisa menyebabkan adanya syscall yang tampak tidak berbahaya yang sebenarnya berarti syscall lain yang lebih berbahaya dapat membuka {i>sandbox<i} untuk melarikan diri.

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

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

Dapatkah Executor meminta pembuatan lebih dari satu Sandbox?

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

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

Sandbox2 hanya mendukung berjalan di kernel yang cukup baru. Batas kita saat ini adalah {i>kernel<i} 3.19, meskipun itu mungkin berubah di masa mendatang. Alasannya adalah karena kami menggunakan fitur kernel yang relatif baru, termasuk namespace pengguna dan seccomp dengan tanda TSYNC.

Jika Anda menjalankan produksi, hal ini seharusnya tidak menjadi masalah, karena hampir seluruh armada menjalankan kernel yang cukup baru. Jika Anda mengalami masalah, hubungi kami.

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

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