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:
- Eksekutor memulai Sandboxee dari jalur filenya menggunakan
::sandbox2::GetDataDependencyFilePath()
. - Eksekutor mengirimkan input ke Sandboxee melalui saluran komunikasi
Comms
menggunakanSendBytes()
. - Sandboxee menghitung CRC4 dan mengirimkan balasannya kembali ke eksekutor melalui saluran komunikasi
Comms
yang menerimanya denganRecvUint32()
.
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:
- Eksekutor memulai Sandboxee dari jalur filenya menggunakan
GetDataDependencyFilepath
, seperti untuk CRC4. - Library ini menyiapkan batas, membuka deskriptor file di
/proc/version
, dan menandainya untuk dipetakan di Sandboxee denganMapFd
. - 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 menerimaSTDOUT_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()
(melaluiClient::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_bin.cc: Program yang ingin di-sandbox (yaitu Sandboxee).
- network_sandbox.cc: Program sandbox yang akan menjalankannya (yaitu eksekutor).
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 menggunakanNetworkProxyClient::Connect
.
Contoh ini menunjukkan kedua metode tersebut. Mode otomatis digunakan saat flag connect_with_handler
ditetapkan, jika tidak, mode manual akan digunakan.
- network_bin.cc: Program yang ingin di-sandbox (yaitu Sandboxee).
- network_sandbox.cc: Program sandbox yang akan menjalankannya (eksekutor).