Przykłady

Przegląd

Przygotowaliśmy kilka przykładów, które pokazują, jak używać Sandbox2 w różnych scenariuszach i jak pisać zasady.

Znajdziesz je w //sandboxed_api/sandbox2/examples. Szczegółowe wyjaśnienia znajdziesz poniżej.

CRC4

Przykład CRC4 to celowo błędne obliczenie sumy kontrolnej CRC4, które pokazuje, jak umieścić inny program w piaskownicy i jak się z nim komunikować.

  • crc4bin.cc: program, który chcemy umieścić w piaskownicy (czyli Sandboxee);
  • crc4sandbox.cc: program piaskownicy, który będzie go uruchamiać (czyli wykonawca).

Jak to działa:

  1. Wykonawca uruchamia Sandboxee z jego ścieżki pliku za pomocą ::sandbox2::GetDataDependencyFilePath().
  2. Wykonawca wysyła dane wejściowe do Sandboxee przez kanał komunikacyjny Comms za pomocą SendBytes().
  3. Sandboxee oblicza CRC4 i wysyła odpowiedzi z powrotem do wykonawcy przez kanał komunikacyjny Comms, który odbiera je za pomocą RecvUint32().

Jeśli program wykona jakiekolwiek wywołanie systemowe inne niż komunikacja (read() i write()), zostanie zakończony z powodu naruszenia zasad.

statyczne

Przykład statyczny pokazuje, jak umieścić w piaskownicy statycznie połączony plik binarny, np. plik binarny innej firmy, do którego nie masz kodu źródłowego, co oznacza, że nie wie on, że będzie działać w piaskownicy.

  • static_bin.cc: Sandboxee to statyczny plik binarny C, który konwertuje tekst ASCII ze standardowego wejścia na wielkie litery.
  • static_sandbox.cc: wykonawca z zasadami, limitami i używający deskryptora pliku do danych wejściowych Sandboxee.

Jak to działa:

  1. Wykonawca uruchamia Sandboxee z jego ścieżki pliku za pomocą GetDataDependencyFilepath, tak jak w przypadku CRC4.
  2. Ustawia limity, otwiera deskryptor pliku w /proc/version i oznacza go jako mapowany w Sandboxee za pomocą MapFd.
  3. Zasady zezwalają na to, aby niektóre wywołania systemowe (open) zwracały błąd (ENOENT), zamiast powodować zakończenie programu z powodu naruszenia zasad. Może to być przydatne w przypadku umieszczania w piaskownicy programu innej firmy, w którym nie możemy modyfikować wywołań systemowych. Zamiast tego możemy sprawić, że będą one kończyć się w sposób kontrolowany.

narzędzie

Przykład narzędzia to zarówno narzędzie do tworzenia własnych zasad i eksperymentowania z interfejsami API Sandbox2, jak i demonstracja jego funkcji.

  • sandbox2tool.cc: wykonawca, który pokazuje:
    • jak uruchomić inny plik binarny w piaskownicy;
    • jak skonfigurować sprawdzanie systemu plików;
    • jak wykonawca może uruchamiać Sandboxee asynchronicznie, aby stopniowo odczytywać jego dane wyjściowe.

Wypróbuj:

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

Flagi:

  • --sandbox2tool_resolve_and_add_libraries – aby rozwiązać i zamontować wymagane biblioteki dla Sandboxee.
  • --sandbox2tool_additional_bind_mounts <PATHS> – aby udostępnić Sandboxee dodatkowe katalogi.
  • --sandbox2tool_keep_env – aby zachować bieżące zmienne środowiskowe.
  • --sandbox2tool_redirect_fd1 – aby odbierać STDOUT_FILENO (1) Sandboxee i wyświetlać je lokalnie.
  • --sandbox2tool_cpu_timeout – aby ustawić limit czasu procesora w sekundach.
  • --sandbox2tool_walltime_timeout – aby ustawić limit czasu rzeczywistego w sekundach.
  • --sandbox2tool_file_size_creation_limit – aby ustawić maksymalny rozmiar tworzonych plików.
  • --sandbox2tool_cwd – aby ustawić bieżący katalog roboczy piaskownicy.

custom_fork

Przykład custom_fork pokazuje, jak utworzyć piaskownicę, która zainicjuje plik binarny, a następnie będzie czekać na żądania fork() pochodzące od wykonawcy nadrzędnego.

Ten tryb może zwiększyć wydajność w porównaniu z innymi typami piaskownicy, ponieważ w tym przypadku tworzenie nowych instancji Sandboxee nie wymaga wykonywania nowych plików binarnych, tylko rozwidlenia istniejących.

  • custom_fork_bin.cc: niestandardowy serwer rozwidlenia, który odbiera żądania fork() (za pomocą ForkingClient::EnterForkLoop), aby tworzyć nowe Sandboxee.
  • custom_fork_sandbox.cc: wykonawca, który uruchamia niestandardowy serwer rozwidlenia. Następnie wysyła do niego żądania (za pomocą nowych wykonawców), aby tworzyć (za pomocą fork()) nowe Sandboxee.

sieć

Przestrzeń nazw sieci, która jest domyślnie włączona, uniemożliwia procesowi działającemu w piaskownicy łączenie się ze światem zewnętrznym. Ten przykład pokazuje, jak rozwiązać ten problem.

Połączenie jest inicjowane w wykonawcy, a wynikowy gniazdo jest przekazywane za pomocą ::sandbox2::Comms::SendFD(). Sandboxee odbiera gniazdo za pomocą ::sandbox2::Comms::RecvFD(), a następnie może używać tego gniazda do wymiany danych jak zwykle.

  • network_bin.cc: program, który chcemy umieścić w piaskownicy (czyli Sandboxee);
  • network_sandbox.cc: program piaskownicy, który będzie go uruchamiać (czyli wykonawca).

network_proxy

Ten przykład pokazuje alternatywny sposób radzenia sobie z przestrzenią nazw sieci. Wewnętrznie działa dokładnie tak samo jak powyższy przykład, ale jest udostępniany jako wygodniejszy interfejs API.

Sandboxee może nawiązać połączenie sieciowe na 2 sposoby:

  • automatyczny – przez zainstalowanie automatycznego modułu obsługi i wykonywanie regularnych wywołań połączenia.
  • ręczny – przez uzyskanie NetworkProxyClient i bezpośrednie użycie NetworkProxyClient::Connect.

Ten przykład pokazuje obie metody. Tryb automatyczny jest używany, gdy ustawiona jest flaga connect_with_handler. W przeciwnym razie używany jest tryb ręczny.

  • network_bin.cc: program, który chcemy umieścić w piaskownicy (czyli Sandboxee);
  • network_sandbox.cc: program piaskownicy, który będzie go uruchamiać (czyli wykonawca).