Örnekler

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:

  1. Yürütücü, ::sandbox2::GetDataDependencyFilePath() kullanarak Sandboxee'yi dosya yolundan başlatır.
  2. Yürütücü, SendBytes() kullanarak iletişim kanalı Comms üzerinden Sandboxee'ye giriş gönderir.
  3. 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:

  1. Yürütücü, Sandboxee'yi dosya yolundan GetDataDependencyFilepath kullanarak başlatır (CRC4'te olduğu gibi).
  2. Bu işlem, sınırları ayarlar, /proc/version üzerinde bir dosya tanımlayıcısı açar ve MapFd ile Sandboxee'de eşlenecek şekilde işaretler.
  3. 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.

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 almak STDOUT_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.

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ğrudan NetworkProxyClient::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ü).