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 penjelasan mendetail di bawah.

CRC4

Contoh CRC4 adalah penghitungan checksum CRC4 yang sengaja dibuat rusak, yang menunjukkan cara melakukan sandbox pada program lain dan cara berkomunikasi dengannya.

  • crc4bin.cc: Program yang ingin kita masukkan ke sandbox (yaitu Sandboxee)
  • crc4sandbox.cc: Program sandbox yang akan menjalankannya (yaitu, executor).

Cara kerjanya:

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

Jika program membuat syscall selain berkomunikasi (read() dan write()), program tersebut akan dihentikan karena pelanggaran kebijakan.

static

Contoh statis menunjukkan cara melakukan sandbox pada biner yang ditautkan secara statis, seperti biner pihak ketiga yang tidak Anda miliki sumbernya, yang berarti biner tersebut 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: Executor dengan kebijakan dan batasnya, serta menggunakan deskriptor file untuk input Sandboxee.

Cara kerjanya:

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

alat

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

  • sandbox2tool.cc: Pelaksana yang mendemonstrasikan:
    • cara menjalankan sandbox biner lain,
    • cara menyiapkan pemeriksaan sistem file, dan
    • cara executor 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

Flag:

  • --sandbox2tool_resolve_and_add_libraries untuk menyelesaikan dan memasang library yang diperlukan untuk Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> untuk menyediakan direktori tambahan bagi Sandboxee
  • --sandbox2tool_keep_env untuk mempertahankan variabel lingkungan saat ini
  • --sandbox2tool_redirect_fd1 untuk menerima STDOUT_FILENO (1) Sandboxee dan mengeluarkan outputnya secara lokal
  • --sandbox2tool_cpu_timeout untuk menyetel waktu tunggu CPU dalam detik
  • --sandbox2tool_walltime_timeout untuk menyetel waktu tunggu waktu sistem dalam detik
  • --sandbox2tool_file_size_creation_limit untuk menetapkan ukuran maksimum file yang dibuat
  • --sandbox2tool_cwd untuk menetapkan direktori kerja saat ini di sandbox

custom_fork

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

Mode ini berpotensi meningkatkan performa terkait jenis sandbox lainnya, karena di sini, pembuatan instance Sandboxee baru tidak memerlukan eksekusi biner baru, hanya melakukan forking pada biner yang ada

  • custom_fork_bin.cc: Server fork kustom, menerima permintaan ke fork() (melalui Client::WaitAndFork) untuk membuat Sandboxee baru.
  • custom_fork_sandbox.cc: Pelaksana, yang memulai server fork kustom. Kemudian, Sandboxee mengirim permintaan ke Sandbox (melalui eksekutor baru) untuk membuat (melalui fork()) Sandboxee baru.

jaringan

Namespace jaringan, yang diaktifkan secara default, mencegah proses sandbox terhubung ke dunia luar. Contoh ini menunjukkan cara mengatasi masalah ini.

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

  • network_bin.cc: Program yang ingin kita masukkan ke sandbox (yaitu Sandboxee).
  • network_sandbox.cc: Program sandbox yang akan menjalankannya (yaitu, executor).

network_proxy

Contoh ini menunjukkan cara alternatif untuk menangani namespace jaringan. Secara internal, cara kerjanya sama persis dengan contoh di atas, tetapi diekspos sebagai API yang lebih mudah.

Sandboxee dapat membuat koneksi jaringan dengan 2 cara berbeda:

  • otomatis – Dengan menginstal handler otomatis, lalu mengeluarkan panggilan koneksi reguler.
  • manual – Dengan mendapatkan NetworkProxyClient dan langsung menggunakan NetworkProxyClient::Connect.

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