Genel bakış
Sandbox2'nin farklı senaryolarda nasıl kullanılacağını ve politika nasıl yazılacağını göstermek için birkaç örnek hazırladık.
Bunları //sandboxed_api/sandbox2/examples içinde 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 o programla nasıl iletişim kurulacağını gösteren, bir CRC4 sağlamasının kasıtlı olarak hatalı bir şekilde hesaplanmasıdır.
- crc4bin.cc: Korumalı alana almak istediğimiz program (ör. Sandboxee)
- crc4sandbox.cc: Etiketi çalıştıracak korumalı alan programı (ör. yürütücü).
İşleyiş şekli:
- Yürütücü, Sandboxee'yi
::sandbox2::GetDataDependencyFilePath()
kullanarak dosya yolundan başlatır. - Yürütücü,
SendBytes()
kullanarakComms
iletişim kanalı üzerinden Sandboxee'ye giriş gönderir. - Sandboxee, CRC4'ü hesaplar ve yanıtlarını
RecvUint32()
ile alanComms
iletişim kanalı üzerinden yürütücüye geri gönderir.
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, statik olarak bağlantılı bir ikili programın (kaynağınızın bulunmadığı üçüncü taraf ikili programı gibi) korumalı alana nasıl alınacağını gösterir; yani kaynak olmadan, korumalı alan içine alınacağını bilmez.
- static_bin.cc: Sandboxee, ASCII metnini standart girişten 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 bir dosya tanımlayıcı kullanan yürütücü.
İşleyiş şekli:
- Yürütücü, Sandboxee'yi CRC4'te olduğu gibi
GetDataDependencyFilepath
kullanarak dosya yolundan başlatır. - Sınırlar belirler,
/proc/version
üzerinde bir dosya tanımlayıcısı açar ve dosyayıMapFd
ile Sandboxee'de eşlenmek üzere işaretler. - Bu politika, bazı syscall'ların (
open
) politika ihlali nedeniyle sonlandırılmak yerine hata (ENOENT
) döndürmesine izin veriyor. Bu, hangi syscall'ların yapıldığını değiştiremediğimiz ve bu sayede başarılı bir şekilde başarısız olmalarını sağlayamadığımız bir üçüncü taraf programının korumalı alana alınması sırasında yararlı olabilir.
Araç
Araç örneğinde hem kendi politikalarınızı geliştirebileceğiniz, hem Sandbox2 API'leri deneyebileceğiniz bir araç hem de özelliklerini görebilirsiniz.
- sandbox2tool.cc: Şunu gösteren yürütücü:
- nasıl çalıştırılacağını,
- Dosya sistemi denetimlerinin nasıl ayarlandığını ve
- işlecinin, çıktısını kademeli olarak okumak için Sandboxee'yi eşzamansız olarak nasıl çalıştırabileceğini öğrenin.
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:
- Sandboxee için gerekli kitaplıkları çözmek ve eklemek üzere
--sandbox2tool_resolve_and_add_libraries
- Sandboxee'ye ek dizinler sağlamak için
--sandbox2tool_additional_bind_mounts <PATHS>
- Mevcut ortam değişkenlerini korumak için
--sandbox2tool_keep_env
- Sandboxee (korumalı alan)
STDOUT_FILENO (1)
dosyasını almak ve yerel olarak çıkış yapmak için--sandbox2tool_redirect_fd1
- CPU zaman aşımını saniye cinsinden ayarlamak için
--sandbox2tool_cpu_timeout
- Zaman aşımını saniye cinsinden ayarlamak için
--sandbox2tool_walltime_timeout
- Oluşturulan dosyaların maksimum boyutunu ayarlamak için
--sandbox2tool_file_size_creation_limit
- Korumalı alanın geçerli çalışma dizinini ayarlamak için
--sandbox2tool_cwd
custom_fork
custom_fork
örneği, ikili dosyayı başlatacak ve ardından üst yürütücüden gelen fork()
isteğini bekleyecek bir korumalı alanın nasıl oluşturulacağını gösterir.
Bu mod, diğer korumalı alan türlerine kıyasla potansiyel olarak daha yüksek performans sunar. Çünkü burada yeni Sandboxees örnekleri oluşturmak için yeni ikili programlar yürütmek gerekmez, yalnızca mevcut olanları çatallayın.
- custom_fork_bin.cc: Yeni Sandboxe'ler oluşturmak için
fork()
isteklerini alan (Client::WaitAndFork
aracılığıyla) özel çatal sunucusu. - custom_fork_sandbox.cc: Özel bir çatal sunucusu başlatan yürütücü. Ardından, yeni Korumalı Alan'lar (
fork()
aracılığıyla) oluşturmak için buna (yeni yürütücüler aracılığıyla) istekler gönderir.
ağ
Varsayılan olarak etkin olan ağ ad alanı, korumalı alana alınan işlemin dış dünyaya bağlanmasını engeller. Bu örnek, söz konusu sorunun nasıl ele alınacağını gösterir.
Yürütücü içinde bir bağlantı başlatılır ve elde edilen yuva ::sandbox2::Comms::SendFD()
üzerinden geçirilir. Sandboxee, ::sandbox2::Comms::RecvFD()
kullanarak soketi alır ve ardından her zamanki gibi veri alışverişi yapmak için bu yuvayı kullanabilir.
- network_bin.cc: Korumalı alana almak istediğimiz program (ör. Sandboxee).
- network_sandbox.cc: Raporu çalıştıracak korumalı alan programı (ör. yürütücü).
network_proxy
Bu örnekte, bir ağ ad alanını ele almanın alternatif bir yolu gösterilmektedir. Dahili olarak yukarıdaki örnekle tamamen aynı şekilde çalışır ancak daha kullanışlı bir API olarak kullanıma sunulmuştur.
Sandboxee ağ bağlantısını 2 farklı şekilde oluşturabilir:
- otomatik: Bir otomatik işleyici yükleyip ardından düzenli bağlantı çağrıları yaparak.
- manual –
NetworkProxyClient
edinip doğrudanNetworkProxyClient::Connect
kullanarak.
Bu örnekte her iki yöntem de gösterilmektedir. Otomatik mod, connect_with_handler
işareti ayarlandığında kullanılır. Aksi takdirde manuel mod kullanılır.
- network_bin.cc: Korumalı alana almak istediğimiz program (ör. Sandboxee).
- network_sandbox.cc: Reklamı çalıştıracak korumalı alan programı (yürütici).