1. Korumalı Alan Yürütücü Yöntemi Seçin
Korumalı alan oluşturma işlemi, Sandboxee'yi çalıştırmaktan sorumlu bir yürütücüyle (bkz. Korumalı Alan Yürütücü) başlar. executor.h başlık dosyası, bu amaç için gereken API'yi içerir. API çok esnektir ve kullanım alanınıza en uygun olanı seçmenizi sağlar. 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 – Korumalı alan oluşturma zaten etkin olan bir ikili program yürütme
Bu, korumalı alana almanın en basit yoludur ve kaynak kodu bulunmayan bir ikili programın tamamını korumalı alana almak istediğinizde önerilen yöntemdir. Ayrıca, olumsuz etkileri olabilecek korumalı alana alınmayan başlatma olmadığından, korumalı alana alma işleminin en güvenli yoludur.
Aşağıdaki kod snippet'inde, korumalı alana alınacak ikili programın yolunu ve yönetici syscall'a iletmemiz gereken bağımsız değişkenleri tanımlıyoruz. executor.h üstbilgi dosyasında görebileceğiniz gibi, envp
için bir değer belirtmeyiz ve bu nedenle ortamı üst işlemden kopyalarız. İlk bağımsız değişkenin her zaman yürütülecek programın adı olduğunu ve snippet'imizin başka hiçbir bağımsız değişkeni tanımlamadığını unutmayın.
Bu yürütme yöntemine örnek olarak statik ve araç 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 Çatal sunucusu – Yürütücüye ne zaman korumalı alana alınacağını bildirin
Bu yöntem, başlatma sırasında korumalı alana alınmama ve ardından ::sandbox2::Client::SandboxMeHere()
çağrısı yaparak korumalı alana ne zaman girileceğini seçme esnekliği sunar. Korumalı alana almaya başlamak istediğiniz zamanı kodda tanımlayabilmeniz ve tek iş parçacıklı olması gerekir (nedenini SSS bölümünde bulabilirsiniz).
Aşağıdaki kod snippet'inde, yukarıdaki 1. Yöntem'de açıklanan kodun aynısını kullanırız. Ancak, başlatma sırasında programın korumalı alana alınmadan yürütülebilmesini sağlamak için set_enable_sandbox_before_exec(false)
yöntemini çağırırı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 bildirilene kadar devre dışı bırakılmış bir korumalı alana sahip olduğundan bir ::sandbox2::Client
örneği oluşturmamız, yürütücü ile Sandboxee arasında iletişim kurmamız ve ardından başlatma işlemimizin tamamlandığını ve şimdi sandbox2_client.SandboxMeHere()
çağrısı yaparak korumalı alana başlamak istediğimizi yürütücüye bildirmemiz gerekiyor.
// 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öntemine örnek olarak crc4 verilebilir. Burada crc4bin.cc
, Sandboxee'dir ve korumalı alana girmesi gerektiğinde yürütücüye (crc4sandbox.cc
) bildirimde bulunur.
3. Yöntem: Özel Çatal sunucusu - İkili program hazırlayın, çatal isteklerini bekleyin ve kendi kendinize korumalı alan oluşturun
Bu mod, bir ikili programı başlatmanızı, korumalı alan için hazırlamanızı ve ikili program yaşam döngüsünün belirli bir anında yürütme aracının kullanımına sunmanızı sağlar.
Yürütücü, ikili programınıza bir çatal isteği gönderir. Bu istek, fork()
(::sandbox2::ForkingClient::WaitAndFork()
üzerinden) üzerinden yapılır. Yeni oluşturulan işlem, ::sandbox2::Client::SandboxMeHere()
ile korumalı alana alınmaya hazır olacaktır.
#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 ve yalnızca belirli durumlarda (örneğin, kısıtlı bellek gereksinimleri olduğunda) geçerli olduğunu unutmayın. COW'den faydalanırsınız ancak bunun dezavantajı gerçek bir ASLR olmamasıdır. Diğer bir tipik kullanım örneği, Sandboxee'nin güvenilir olmayan 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.