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 dalam menyiapkan library C/C++ untuk sandbox, serta API yang diperlukan untuk berkomunikasi dengan library C/C++ versi sandbox.
Diagram ini menunjukkan arsitektur library C/C++ yang di-sandbox SAPI:
SAPI juga menyediakan primitif untuk sinkronisasi memori manual dan otomatis (berdasarkan atribut penunjuk kustom) (array, struktur) antara Library SAPI dan kode host.
Terakhir, Transactions API tingkat tinggi memungkinkan pemantauan Library SAPI, dan memulai ulang Library SAPI 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 terbatas untuk Sandboxed Library. Hal ini dilakukan dengan memperjelas 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.
SAPI menggunakan kebijakan default, atau Anda dapat menggunakan kebijakan sandbox khusus dengan menentukannya dalam file header sandbox.h dan meneruskannya sebagai argumen dalam aturan build sapi_library.
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 yang di-sandbox dibuat dengan aturan build sapi_library, yang memungkinkan Anda menentukan kebijakan sandbox yang disesuaikan yang menentukan lingkungan eksekusi terbatas. Bergantung pada library, Anda mungkin harus menulis kode wrapper atau stub (lihat libcurl), tetapi Anda tidak diharapkan untuk 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. Oleh karena itu, Kode Host memanggil fungsi yang diekspor oleh library SAPI, meneruskan data ke dan menerima data dari sandbox.
Kode Host harus diadaptasi untuk menggunakan library SAPI. Terutama, pemanggilan fungsi library tidak mungkin dilakukan karena library berada dalam proses sandbox terpisah. Oleh karena itu, SAPI menyediakan alat yang membuat objek SAPI yang memproksi 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++ di-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 isolasi memori, antara Kode Host dan Library yang di-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 Sandboxed Library diteruskan melalui lapisan RPC. Untuk dapat menangani kegagalan di lapisan ini, Anda harus menerapkan penanganan error yang sesuai. Modul Transaksi SAPI menyediakan mekanisme yang diperlukan untuk memastikan bahwa semua panggilan ke Sandboxed Library diselesaikan tanpa masalah tingkat RPC, atau ditampilkan dengan error yang relevan.
Untuk penjelasan yang lebih lengkap tentang topik ini, lihat Transaksi.
Memulai
Baca halaman Mulai kami untuk menyiapkan project Sandboxed API pertama Anda.