Örnekler

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:

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

  1. Yürütücü, Sandboxee'yi CRC4'te olduğu gibi GetDataDependencyFilepath kullanarak dosya yolundan başlatır.
  2. 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.
  3. 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.

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.
  • manualNetworkProxyClient edinip doğrudan NetworkProxyClient::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).