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 dosyaları //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ı hesaplanmış bir örneğidir.
- crc4bin.cc: Korumalı alana almak istediğimiz program (yani Sandboxee)
- crc4sandbox.cc: Programı çalıştıracak 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ı
Comms
iletiş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 dışında bir sistem çağrısı yaparsa (read()
ve write()
) politika ihlali nedeniyle sonlandırılır.
statik
Statik örnek, kaynak koduna sahip olmadığınız üçüncü taraf ikilisi gibi statik olarak bağlanmış bir ikilinin nasıl korumalı alana alınacağını gösterir. Bu tür ikililer, 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ı ve sınırlarıyla birlikte 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
GetDataDependencyFilepath
kullanarak 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 veMapFd
ile 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 çıkışını kademeli 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/hostname
CMake + Ninja
cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname
Google3 (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_libraries
Sandboxee için gerekli kitaplıkları çözmek ve bağlamak üzere--sandbox2tool_additional_bind_mounts <PATHS>
, Sandboxee'nin ek dizinlere erişebilmesi için--sandbox2tool_keep_env
mevcut ortam değişkenlerini korumak için--sandbox2tool_redirect_fd1
Sandboxee'yi almakSTDOUT_FILENO (1)
ve yerel olarak çıktı vermek için- 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_cwd
ile sanal alanın mevcut çalışma dizinini ayarlayın.
custom_fork
custom_fork
örneği, ikiliyi başlatacak bir sanal 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 türlerine kıyasla performansı artırabilir. Bunun nedeni, burada Sandboxee'lerin yeni örneklerini oluşturmak için yeni ikili dosyaların yürütülmesinin gerekmemesi, yalnızca mevcut olanların çatallanmasıdır.
- custom_fork_bin.cc: Yeni Sandboxee'ler oluşturmak için
fork()
'ye (Client::WaitAndFork
ü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 (
fork()
aracılığıyla) yeni yürütücüler üzerinden bu Sandboxee'ye istekler gönderir.
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 çalıştıracak 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:
- automatic: Otomatik bir işleyici yükleyip düzenli bağlantı çağrıları göndererek.
- Manuel:
NetworkProxyClient
alarak ve doğrudanNetworkProxyClient::Connect
kullanarak.
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 çalıştıracak korumalı alan programı (yürütücü).