Contoh

Ringkasan

Kami telah menyiapkan beberapa contoh untuk menunjukkan cara menggunakan Sandbox2 dalam berbagai skenario dan cara menulis kebijakan.

Anda dapat menemukannya di //sandboxed_api/sandbox2/examples, lihat di bawah untuk penjelasan mendetail.

CRC4

Contoh CRC4 adalah penghitungan checksum CRC4 yang sengaja berisi bug, yang menunjukkan cara melakukan sandbox program lain dan cara berkomunikasi dengannya.

  • crc4bin.cc: Program yang ingin kita lakukan dalam sandbox (yaitu Sandboxee)
  • crc4sandbox.cc: Program sandbox yang akan menjalankannya (yaitu eksekutor).

Cara kerjanya:

  1. Eksekutor memulai Sandboxee dari jalur filenya menggunakan ::sandbox2::GetDataDependencyFilePath().
  2. Eksekutor mengirimkan input ke Sandboxee melalui saluran komunikasi Comms menggunakan SendBytes().
  3. Sandboxee menghitung CRC4 dan mengirimkan balasannya kembali ke eksekutor melalui saluran komunikasi Comms yang menerimanya dengan RecvUint32().

Jika program melakukan syscall selain berkomunikasi (read() dan write()), program akan dihentikan karena melanggar kebijakan.

static

Contoh statis menunjukkan cara melakukan sandbox biner yang ditautkan secara statis, seperti biner pihak ketiga yang sumbernya tidak Anda miliki, artinya biner tidak mengetahui bahwa biner tersebut akan di-sandbox.

  • static_bin.cc: Sandboxee adalah biner C statis yang mengonversi teks ASCII dari input standar menjadi huruf besar.
  • static_sandbox.cc: Eksekutor dengan kebijakannya, membatasi, dan menggunakan deskriptor file untuk input Sandboxee.

Cara kerjanya:

  1. Eksekutor memulai Sandboxee dari jalur filenya menggunakan GetDataDependencyFilepath, seperti untuk CRC4.
  2. Library ini menyiapkan batas, membuka deskriptor file di /proc/version, dan menandainya untuk dipetakan di Sandboxee dengan MapFd.
  3. Kebijakan ini memungkinkan beberapa syscall (open) menampilkan error (ENOENT), bukan dihentikan karena pelanggaran kebijakan. Hal ini berguna saat melakukan sandbox program pihak ketiga tempat kita tidak dapat mengubah syscall yang dibuat, sehingga kita dapat membuatnya gagal secara halus.

alat (tool)

Contoh alat tersebut adalah alat untuk mengembangkan kebijakan Anda sendiri dan bereksperimen dengan Sandbox2 API, serta demonstrasi fitur-fiturnya.

  • sandbox2tool.cc: Eksekutor menunjukkan:
    • bagaimana cara menjalankan sandbox biner lainnya,
    • cara mengatur pemeriksaan sistem file, dan
    • cara eksekutor dapat menjalankan Sandboxee secara asinkron untuk membaca outputnya secara progresif.

Cobalah sendiri:

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

Tanda:

  • --sandbox2tool_resolve_and_add_libraries untuk me-resolve dan memasang library yang diperlukan untuk Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> untuk membuat direktori tambahan tersedia untuk Sandboxee
  • --sandbox2tool_keep_env untuk mempertahankan variabel lingkungan saat ini
  • --sandbox2tool_redirect_fd1 untuk menerima STDOUT_FILENO (1) Sandboxee dan menghasilkan output secara lokal
  • --sandbox2tool_cpu_timeout untuk menyetel waktu tunggu CPU dalam detik
  • --sandbox2tool_walltime_timeout untuk menyetel waktu tunggu lama dalam detik
  • --sandbox2tool_file_size_creation_limit untuk menetapkan ukuran maksimum file yang dibuat
  • --sandbox2tool_cwd untuk menetapkan direktori kerja sandbox saat ini

custom_fork

Contoh custom_fork menunjukkan cara membuat sandbox yang akan menginisialisasi biner, lalu menunggu permintaan fork() berasal dari eksekutor induk.

Mode ini berpotensi meningkatkan performa sehubungan dengan jenis sandbox lainnya. Dalam kasus ini, pembuatan instance Sandboxee baru tidak memerlukan eksekusi biner baru, tetapi hanya menyalin biner yang sudah ada

  • custom_fork_bin.cc: Server fork kustom yang menerima permintaan ke fork() (melalui Client::WaitAndFork) untuk memunculkan Sandboxee baru.
  • custom_fork_sandbox.cc: Eksekutor, yang memulai server fork kustom. Kemudian, kode ini akan mengirimkan permintaan kepadanya (melalui eksekutor baru) untuk memunculkan (melalui fork()) Sandboxee baru.

jaringan

Namespace jaringan, yang diaktifkan secara default, mencegah proses yang di-sandbox agar tidak terhubung ke dunia luar. Contoh ini menunjukkan bagaimana menangani masalah tersebut.

Koneksi diinisialisasi di dalam eksekutor dan soket yang dihasilkan diteruskan melalui ::sandbox2::Comms::SendFD(). Sandboxee menerima soket dengan menggunakan ::sandbox2::Comms::RecvFD(), lalu dapat menggunakan soket ini untuk bertukar data seperti biasa.

network_proxy

Contoh ini menunjukkan cara alternatif untuk menangani namespace jaringan. Secara internal, ini berfungsi dengan cara yang sama persis seperti contoh di atas, namun diekspos sebagai API yang lebih praktis.

Sandboxee dapat membuat koneksi jaringan dengan 2 cara berbeda:

  • otomatis – Dengan menginstal pengendali otomatis lalu melakukan panggilan koneksi reguler.
  • manual – Dengan mendapatkan NetworkProxyClient dan langsung menggunakan NetworkProxyClient::Connect.

Contoh ini menunjukkan kedua metode tersebut. Mode otomatis digunakan saat flag connect_with_handler ditetapkan, jika tidak, mode manual akan digunakan.