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 uruchomić 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 uruchomi kod (czyli wykonawca).

Jak to działa:

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

Jeśli program wykonuje jakiekolwiek wywołanie systemowe inne niż komunikacja (read()write()), zostaje zamknięty 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 w języku C, który przekształca tekst ASCII ze standardowego wejścia na wielkie litery.
  • static_sandbox.cc: wykonawca z zasadami i limitami, który używa deskryptora pliku do wprowadzania danych do piaskownicy.

Jak to działa:

  1. Wykonawca uruchamia Sandboxee ze ś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 zwracanie błędu (ENOENT) przez niektóre wywołania systemowe (open), zamiast przerywać działanie procesu z powodu naruszenia zasad. Może to być przydatne w przypadku piaskownicy programu innej firmy, w której nie możemy modyfikować wywoływanych wywołań systemowych, więc zamiast tego możemy spowodować, że będą one kończyć się bez błędów.

narzędzie

Przykład narzędzia służy zarówno do opracowywania własnych zasad i eksperymentowania z interfejsami API Sandbox2, jak i do demonstrowania jego funkcji.

  • sandbox2tool.cc wykonawca demonstrujący:
    • jak uruchomić kolejny 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> – udostępnianie dodatkowych katalogów procesowi Sandboxee;
  • --sandbox2tool_keep_env, aby zachować bieżące zmienne środowiskowe.
  • --sandbox2tool_redirect_fd1, aby otrzymać Sandboxee STDOUT_FILENO (1) i wygenerować go lokalnie.
  • --sandbox2tool_cpu_timeout, aby ustawić czas oczekiwania procesora w sekundach.
  • --sandbox2tool_walltime_timeout, aby ustawić czas oczekiwania w sekundach
  • --sandbox2tool_file_size_creation_limit, aby ustawić maksymalny rozmiar utworzonych 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 z procesu nadrzędnego.

Ten tryb może zapewniać większą wydajność niż inne rodzaje piaskownicy, ponieważ tworzenie nowych instancji Sandboxees nie wymaga wykonywania nowych plików binarnych, a jedynie rozwidlenia istniejących.

  • custom_fork_bin.cc: niestandardowy serwer rozwidlenia, który otrzymuje żądania fork() (za pomocą Client::WaitAndFork) w celu tworzenia nowych procesów 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 utworzyć (za pomocą fork()) nowe Sandboxee.

sieć

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

Połączenie jest inicjowane w wykonawcy, a wynikowe gniazdo jest przekazywane za pomocą ::sandbox2::Comms::SendFD(). Proces Sandboxee otrzymuje gniazdo za pomocą funkcji ::sandbox2::Comms::RecvFD(), a następnie może go używać do wymiany danych w zwykły sposób.

  • 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 obsługi przestrzeni nazw sieci. Wewnętrznie działa dokładnie tak samo jak w powyższym przykładzie, ale jest udostępniany jako wygodniejszy interfejs API.

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

  • automatyczne – przez zainstalowanie automatycznego modułu obsługi, a następnie regularne wysyłanie wywołań połączenia.
  • ręcznie – przez uzyskanie NetworkProxyClient i bezpośrednie użycie NetworkProxyClient::Connect;

W tym przykładzie pokazujemy 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ć (wykonawca).