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