1. Bir Sandbox Executor yöntemi seçin

Özel korumalı alan, Sandbox Executor'ı (Sandboxee'yi çalıştırmaktan sorumlu) kullanarak başlar. executor.h üstbilgi dosyası, bu amaç için gereken API'yi içerir. API çok esnektir ve kullanım alanınıza en uygun olanı seçmenize olanak tanır. Aşağıdaki bölümlerde, aralarından seçim yapabileceğiniz 3 farklı yöntem açıklanmaktadır.

1. yöntem: Bağımsız - Sanal alan oluşturma özelliği zaten etkinleştirilmiş bir ikili programı yürütün

Bu, sanal alan oluşturmayı kullanmanın en basit yoludur ve kaynak kodu olmayan bir ikili dosyanın tamamını sanal alan oluşturmak istediğinizde önerilen yöntemdir. Ayrıca, olumsuz etkileri olabilecek korumalı alan dışı başlatma işlemi olmadığından korumalı alanı kullanmanın en güvenli yoludur.

Aşağıdaki kod snippet'inde, korumalı alan oluşturulacak ikilinin yolunu ve bir execve sistem çağrısına iletmemiz gereken bağımsız değişkenleri tanımlıyoruz. executor.h başlık dosyasında görebileceğiniz gibi, envp için bir değer belirtmiyoruz ve bu nedenle ortamı üst işlemden kopyalıyoruz. İlk bağımsız değişkenin her zaman yürütülecek programın adı olduğunu ve snippet'imizin başka bir bağımsız değişken tanımlamadığını unutmayın.

Bu yürütme yöntemine örnek olarak: static ve tool verilebilir.

#include "sandboxed_api/sandbox2/executor.h"

std::string path = "path/to/binary";
std::vector<std::string> args = {path};  // args[0] will become the sandboxed
                                         // process' argv[0], typically the
                                         // path to the binary.
auto executor = absl::make_unique<sandbox2::Executor>(path, args);

2. yöntem: Sandbox2 Forkserver – Yürütücüye ne zaman korumalı alana alınacağını söyleme

Bu yöntem, başlatma sırasında korumalı alan dışında kalma ve ardından ::sandbox2::Client::SandboxMeHere() çağrısı yaparak korumalı alana girme zamanını seçme esnekliği sunar. Bu API'yi kullanmak için, sanal alan oluşturmaya ne zaman başlamak istediğinizi kodda tanımlayabilmeniz gerekir. Ayrıca, tek iş parçacıklı olmalıdır (nedenini SSS bölümünde okuyabilirsiniz).

Aşağıdaki kod snippet'inde, yukarıdaki 1. Yöntem'de belirtilen kodun aynısı kullanılmıştır. Ancak programın başlatma sırasında korumalı alan dışında çalışmasına izin vermek için set_enable_sandbox_before_exec(false) çağrısı yaparız.

#include "sandboxed_api/sandbox2/executor.h"

std::string path = "path/to/binary";
std::vector<std::string> args = {path};
auto executor = absl::make_unique<sandbox2::Executor>(path, args);
executor->set_enable_sandbox_before_exec(false);

Yürütücü, Sandboxee tarafından bilgilendirilene kadar devre dışı bırakılmış bir sanal alana sahip olduğundan ::sandbox2::Client örneği oluşturmamız, yürütücü ile Sandboxee arasında iletişimi ayarlamamız ve ardından sandbox2_client.SandboxMeHere()'yi çağırarak başlatma işleminin tamamlandığını ve artık sanal alan oluşturmaya başlamak istediğimizi yürütücüye bildirmemiz gerekir.

// main() of sandboxee
int main(int argc, char** argv) {
  gflags::ParseCommandLineFlags(&argc, &argv, false);

  // Set-up the sandbox2::Client object, using a file descriptor (1023).
  sandbox2::Comms comms(sandbox2::Comms::kSandbox2ClientCommsFD);
  sandbox2::Client sandbox2_client(&comms);
  // Enable sandboxing from here.
  sandbox2_client.SandboxMeHere();
  

Bu yürütücü yönteminin bir örneği crc4'tür. Burada crc4bin.cc, Sandboxee'dir ve yürütücüye (crc4sandbox.cc) ne zaman sanal alana girmesi gerektiğini bildirir.

3. yöntem: Özel Forkserver – Bir ikili dosya hazırlayın, fork isteklerini bekleyin ve kendi sandbox'ınızda çalışın

Bu mod, bir ikiliyi başlatmanıza, onu korumalı alan için hazırlamanıza ve ikilinizin yaşam döngüsünün belirli bir anında yürütücüye sunmanıza olanak tanır.

Yürütücü, ikili dosyanıza bir çatallama isteği gönderir. Bu istek fork() (::sandbox2::ForkingClient::WaitAndFork() aracılığıyla) olur. Yeni oluşturulan işlem, ::sandbox2::Client::SandboxMeHere() ile korumalı alan oluşturmaya hazır olur.

#include "sandboxed_api/sandbox2/executor.h"

// Start the custom ForkServer
std::string path = "path/to/binary";
std::vector<std::string> args = {path};
auto fork_executor = absl::make_unique<sandbox2::Executor>(path, args);
fork_executor->StartForkServer();

// Initialize Executor with Comms channel to the ForkServer
auto executor = absl::make_unique<sandbox2::Executor>(
    fork_executor->ipc()->GetComms());

Bu modun oldukça karmaşık olduğunu ve yalnızca belirli birkaç durumda (ör. sıkı bellek gereksinimleriniz olduğunda) geçerli olduğunu unutmayın. COW'dan yararlanabilirsiniz ancak gerçek ASLR olmaması dezavantajdır. Diğer bir tipik kullanım örneği, Sandboxee'nin güvenilmeyen veriler işlenmeden önce çalıştırılabilen uzun ve CPU yoğun bir başlatma işlemine sahip olmasıdır.

Bu yürütücü yönteminin bir örneği için custom_fork konusuna bakın.