Penjelasan Sandbox API

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:

Diagram 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 aturan cc_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.