Genel Bakış
Sandbox2'nin farklı senaryolarda nasıl kullanılacağını ve politikaların nasıl yazılacağını göstermek için birkaç örnek hazırladık.
Bu örnekleri //sandboxed_api/sandbox2/examples adresinde bulabilirsiniz. Ayrıntılı açıklamalar için aşağıya bakın.
CRC4
CRC4 örneği, başka bir programın nasıl korumalı alana alınacağını ve bu programla nasıl iletişim kurulacağını gösteren, CRC4 sağlama toplamının kasıtlı olarak hatalı bir hesaplamasıdır.
- crc4bin.cc: Korumalı alana almak istediğimiz program (ör. Sandboxee)
- crc4sandbox.cc: Programı uygulayacak korumalı alan programı (ör. yürütücü).
İşleyiş şekli:
- Yürütücü,
::sandbox2::GetDataDependencyFilePath()kullanarak Sandboxee'yi dosya yolundan başlatır. - Yürütücü,
SendBytes()kullanarak iletişim kanalıCommsüzerinden Sandboxee'ye giriş gönderir. - Sandboxee, CRC4'ü hesaplar ve yanıtlarını
Commsiletişim kanalı üzerinden yürütücüye geri gönderir. Yürütücü, yanıtlarıRecvUint32()ile alır.
Program, iletişim kurma (read() ve write()) dışında bir sistem çağrısı yaparsa politika ihlali nedeniyle sonlandırılır.
statik
Statik örnek, kaynak koduna sahip olmadığınız üçüncü taraf ikili programı gibi statik olarak bağlanmış bir ikili programın nasıl korumalı alana alınacağını gösterir. Bu tür ikili programlar, korumalı alana alınacaklarının farkında değildir.
- static_bin.cc: Sandboxee, standart girişten gelen ASCII metnini büyük harfe dönüştüren statik bir C ikili programıdır.
- static_sandbox.cc: Politikası, sınırları ve Sandboxee girişi için dosya tanımlayıcısı kullanan yürütücü.
İşleyiş şekli:
- Yürütücü, Sandboxee'yi dosya yolundan
GetDataDependencyFilepathkullanarak başlatır (CRC4'te olduğu gibi). - Bu işlem, sınırları ayarlar,
/proc/versionüzerinde bir dosya tanımlayıcısı açar veMapFdile Sandboxee'de eşlenecek şekilde işaretler. - Bu politika, bazı sistem çağrılarının (
open) politika ihlali nedeniyle sonlandırılmak yerine hata (ENOENT) döndürmesine olanak tanır. Bu, hangi sistem çağrılarının yapıldığını değiştiremediğimiz üçüncü taraf programlarını korumalı alana yerleştirirken yararlı olabilir. Bu durumda, sistem çağrılarının sorunsuz bir şekilde başarısız olmasını sağlayabiliriz.
Aç
Araç örneği, hem kendi politikalarınızı geliştirip Sandbox2 API'leriyle denemeler yapabileceğiniz bir araç hem de özelliklerinin gösterildiği bir demo niteliğindedir.
- sandbox2tool.cc: Aşağıdakileri gösteren yürütücü:
- başka bir ikiliyi korumalı alanda çalıştırma,
- Dosya sistemi kontrollerini ayarlama ve
- Yürütücünün, Sandboxee'yi eşzamansız olarak nasıl çalıştırabileceği ve çıktısını aşamalı olarak nasıl okuyabileceği.
Kendiniz deneyin:
Bazel
bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameCMake + Ninja
cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameGoogle3 (Blaze)
blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameİşaretler:
--sandbox2tool_resolve_and_add_librariesSandboxee için gerekli kitaplıkları çözmek ve bağlamak üzere--sandbox2tool_additional_bind_mounts <PATHS>Sandboxee'ye ek dizinler sunmak için--sandbox2tool_keep_envmevcut ortam değişkenlerini korumak için--sandbox2tool_redirect_fd1ile Sandboxee'yi alıp yerel olarak çıkışını yapınSTDOUT_FILENO (1)- CPU zaman aşımını saniye cinsinden ayarlamak için
--sandbox2tool_cpu_timeout --sandbox2tool_walltime_timeout, duvar saati zaman aşımını saniye cinsinden ayarlamak için kullanılır.- Oluşturulan dosyaların maksimum boyutunu ayarlamak için
--sandbox2tool_file_size_creation_limit --sandbox2tool_cwdile sanal alanın mevcut çalışma dizinini ayarlayın.
custom_fork
custom_fork örneği, ikili programı ilk kullanıma hazırlayacak bir korumalı alanın nasıl oluşturulacağını ve ardından üst yürütücüden gelen fork() isteklerinin nasıl bekleneceğini gösterir.
Bu mod, diğer korumalı alan oluşturma türlerine kıyasla performansı artırabilir. Çünkü burada, Sandboxee'lerin yeni örneklerini oluşturmak için yeni ikili dosyaların yürütülmesi gerekmez, yalnızca mevcut olanlar çatallanır.
- custom_fork_bin.cc: Yeni Sandboxee'ler oluşturmak için
fork()'ye (ForkingClient::EnterForkLoopüzerinden) istek alan özel fork sunucusu. - custom_fork_sandbox.cc: Özel bir fork sunucusunu başlatan yürütücü. Ardından, yeni Sandboxee'ler oluşturmak için (yeni yürütücüler aracılığıyla) istekler gönderir (
fork()aracılığıyla).
ağ
Varsayılan olarak etkinleştirilen ağ ad alanı, korumalı alana alınmış işlemin dış dünyayla bağlantı kurmasını engeller. Bu örnekte, bu sorunla nasıl başa çıkılacağı gösterilmektedir.
Yürütücü içinde bir bağlantı başlatılır ve sonuçta elde edilen soket ::sandbox2::Comms::SendFD() üzerinden iletilir. Sandboxee, ::sandbox2::Comms::RecvFD() kullanarak soketi alır ve ardından verileri her zamanki gibi değiştirmek için bu soketi kullanabilir.
- network_bin.cc: Korumalı alana almak istediğimiz program (yani Sandboxee).
- network_sandbox.cc: Bunu uygulayacak korumalı alan programı (yani yürütücü).
network_proxy
Bu örnekte, ağ ad alanıyla ilgilenmenin alternatif bir yolu gösterilmektedir. Bu API, dahili olarak yukarıdaki örnekle aynı şekilde çalışır ancak daha kullanışlı bir API olarak sunulur.
Sandboxee, ağ bağlantısını 2 farklı şekilde kurabilir:
- Otomatik: Otomatik bir işleyici yükleyip düzenli bağlantı çağrıları göndererek.
- Manuel:
NetworkProxyClientalarak ve doğrudanNetworkProxyClient::Connectkullanarak.
Bu örnekte her iki yöntem de gösterilmektedir. connect_with_handler işareti ayarlandığında otomatik mod, aksi takdirde manuel mod kullanılır.
- network_bin.cc: Korumalı alana almak istediğimiz program (yani Sandboxee).
- network_sandbox.cc: Bunu uygulayacak korumalı alan programı (yürütücü).