Sandboxed API (SAPI) dibangun di atas project Sandbox2 yang sudah mapan. Halaman ini menjelaskan arsitektur desain SAPI dan konsep utama.
Ringkasan
SAPI dirancang untuk menyediakan alat bagi developer guna menyiapkan library C/C++ untuk sandboxing, serta API yang diperlukan untuk komunikasi dengan versi library C/C++ yang di-sandbox.
Diagram ini menunjukkan arsitektur library C/C++ dengan sandbox SAPI:

SAPI juga menyediakan primitif untuk sinkronisasi memori (array, struktur) manual dan otomatis (berdasarkan atribut pointer kustom) antara Library SAPI dan kode host.
Terakhir, Transactions API tingkat tinggi memungkinkan pemantauan Library SAPI, dan memulai ulang Library tersebut jika gagal (misalnya, karena pelanggaran keamanan, error, atau kehabisan resource).
Sandbox2
Project open source Sandbox2 dikembangkan dan dikelola oleh engineer keamanan Google serta merupakan teknologi sandboxing inti yang digunakan oleh SAPI. Sandbox2 berisi tiga komponen utama, yaitu Sandbox Policy, Executor, dan Sandboxee.
Kebijakan Sandbox
Kebijakan sandbox menentukan lingkungan eksekusi yang dibatasi untuk Library Sandbox. Hal ini dicapai dengan mengklarifikasi syscall mana yang dapat dieksekusi. SAPI menggunakan mekanisme yang sama dengan Sandbox2. Lihat bagian Kebijakan Sandbox dan halaman Memulai untuk Sandbox2 guna mengetahui informasi selengkapnya tentang cara mendesain dan menentukan kebijakan sandbox.
Secara default, class sandbox SAPI yang dihasilkan diinisialisasi menggunakan
DefaultConfig
(sapi::SandboxConfig::DefaultConfig()). DefaultConfig() mengonfigurasi
sandbox dengan:
- Kebijakan Sandbox2 default yang dibuat dengan
sapi::Sandbox2Config::DefaultPolicyBuilder() - Batas resource dan waktu default dari
sapi::Sandbox2Config::DefaultLimits() - Komunikasi memori bersama diaktifkan (dipasangkan dengan izin memori bersama di
DefaultPolicyBuilder()) - Flag command line default (
sapi::SandboxConfig::DefaultFlags()) dan variabel lingkungan (sapi::SandboxConfig::DefaultEnvironmentVariables()), yang mengonfigurasi logging dasar pengukuran dan perilaku runtime di sandboxee
Untuk menyesuaikan kebijakan atau konfigurasi sandbox, mulai dari
sapi::SandboxConfig::DefaultConfig(), ubah
sapi::SandboxConfig yang ditampilkan, dan teruskan ke konstruktor sandbox yang dihasilkan (atau
tentukan subclass sandbox kustom dalam file header sandbox.h yang diteruskan ke
aturan build
sapi_library). Misalnya, Anda dapat membuat kebijakan mulai dari
sapi::Sandbox2Config::DefaultPolicyBuilder() dan merangkai aturan tambahan (atau
membuat
PolicyBuilder
secara langsung saat konfigurasi yang lebih ketat diperlukan), dan saat menambahkan
flag atau variabel lingkungan, mulai dari sapi::SandboxConfig::DefaultFlags()
atau sapi::SandboxConfig::DefaultEnvironmentVariables() sehingga setelan dasar
dipertahankan.
Library dengan Sandbox
Ini adalah library C/C++ dalam sandbox yang akan dieksekusi di lingkungan sandbox terbatas yang disediakan oleh Sandbox2. Pada akhirnya, Sandboxed Library mengekspos fungsi yang diperlukan yang dapat digunakan oleh Kode Host.
Library dengan Sandbox dibuat dengan aturan build sapi_library, yang memungkinkan Anda menentukan kebijakan sandbox yang disesuaikan yang menentukan lingkungan eksekusi yang dibatasi. Bergantung pada library, Anda mungkin harus menulis kode wrapper atau stub (lihat libcurl), tetapi Anda tidak perlu mengubah kode sumber library C/C++ saat menyiapkan versi SAPI.
Objek SAPI dan Stub RPC
Objek SAPI adalah objek C++ yang mengekspos API Sandboxed Library. Proses ini meneruskan panggilan dari Kode Host ke RPC Stub, yang disematkan di SAPI Library bersama dengan Sandboxed Library.
Kedua elemen ini dibuat secara otomatis oleh sistem build menggunakan
aturan build sapi_library(). SAPI mendukung dua sistem build, Bazel Google dan CMake.
Kode Host
Kode Host adalah kode yang mengimplementasikan logika yang disediakan oleh library SAPI. Ini adalah yang akan menggunakan versi library C/C++ yang tidak di-sandbox. Dengan demikian, Kode Host memanggil fungsi yang diekspor oleh library SAPI, meneruskan data ke dan menerima data dari sandbox.
Kode Host perlu disesuaikan untuk menggunakan library SAPI. Terutama, memanggil fungsi library tidak dapat dilakukan karena library berada dalam proses sandbox terpisah. Oleh karena itu, SAPI menyediakan alat yang membuat objek SAPI yang mem-proxy panggilan ke library SAPI.
Konsep
Aturan Build Bazel
Project SAPI menyediakan dua aturan build Bazel untuk membuat sandbox library C/C++:
sapi_library()– Membuat semua output yang diperlukan agar library C/C++ memiliki sandbox sebagai Sandboxee Sandbox2. Output build dapat digunakan sebagai dependensi untuk aturancc_binary()yang digunakan untuk membuat biner kode host.sapi_interface()– Membuat header secara otomatis yang dapat disertakan dalam biner kode host.
Untuk penjelasan yang lebih lengkap tentang Aturan Build, lihat Aturan Build.
Variabel
SAPI menyediakan sejumlah jenis khusus, yang disebut Jenis SAPI, yang sebaiknya digunakan dalam Kode Host. Alasan utama mengapa Jenis SAPI diperlukan adalah karena proses, dan dengan demikian memori, isolasi antara Kode Host dan Library dengan Sandbox.
Untuk penjelasan yang lebih lengkap tentang topik ini dan ringkasan beberapa Jenis SAPI yang umum digunakan, lihat Variabel.
Transaksi
Seperti yang dijelaskan di atas, setiap panggilan API ke Library yang Di-sandbox diteruskan melalui lapisan RPC. Agar dapat menangani kegagalan pada lapisan ini, Anda harus menerapkan penanganan error yang sesuai. Modul Transaksi SAPI menyediakan mekanisme yang diperlukan untuk memastikan bahwa semua panggilan ke Library dengan Sandbox diselesaikan tanpa masalah tingkat RPC, atau ditampilkan dengan error yang relevan.
Untuk penjelasan yang lebih lengkap tentang topik ini, lihat Transaksi.
Memulai
Baca halaman Memulai kami untuk menyiapkan project Sandboxed API pertama Anda.