Przykłady

Opis

Przygotowaliśmy kilka przykładów, aby zademonstrować, jak korzystać z Piaskownicy 2 w różnych sytuacjach, oraz jak tworzyć zasady.

Znajdziesz je w sekcji //sandboxed_api/sandbox2/examples. Szczegółowe wyjaśnienia znajdują się poniżej.

CRC4

Przykładowy kod CRC4 to celowo błędne obliczenie sumy kontrolnej CRC4. Pokazuje ono, jak połączyć inny program z piaskownicy i jak się z nim komunikować.

  • crc4bin.cc: program, który ma działać w trybie piaskownicy (tzn.użytkownik piaskownicy).
  • crc4sandbox.cc: program piaskownicy, który go uruchomi (czyli wykonawca).

Jak to działa:

  1. Wykonawca uruchamia piaskownicę od ścieżki pliku za pomocą polecenia ::sandbox2::GetDataDependencyFilePath().
  2. Wykonawca wysyła dane wejściowe do użytkownika piaskownicy przez kanał komunikacji Comms za pomocą SendBytes().
  3. Sandboxee oblicza CRC4 i odsyła swoje odpowiedzi do wykonawcy przez kanał komunikacji Comms, który otrzymuje go za pomocą usługi RecvUint32().

Jeśli program wykonuje wywołania systemowe inne niż komunikacja (read() i write()), zostaje przerwane z powodu naruszenia zasad.

statyczne

Przykład statyczny pokazuje, jak umieścić w piaskownicy statycznie powiązany plik binarny, np. plik binarny innej firmy, którego źródła nie masz, więc nie ma on wiedzy o tym, że będzie on w piaskownicy.

  • static_bin.cc: plik Sandboxee to statyczny plik binarny C, który konwertuje tekst ASCII ze standardowych danych wejściowych na wielkie litery.
  • static_sandbox.cc: wykonawcy z zasadami, ograniczeniami i deskryptorem pliku na potrzeby danych wejściowych Sandboxee.

Jak to działa:

  1. Wykonawca uruchamia Sandboxee od swojej ścieżki do pliku za pomocą GetDataDependencyFilepath, tak jak w przypadku CRC4.
  2. Ustawia limity, otwiera deskryptor pliku w /proc/version i oznacza go do mapowania w środowisku piaskownicy za pomocą MapFd.
  3. Ta zasada pozwala na zwrócenie błędu (ENOENT) przez niektóre wywołania systemowe (open) zamiast ich zamknięcia z powodu naruszenia zasad. Może to być przydatne w przypadku korzystania z piaskownicy programu innej firmy, w którym nie możemy modyfikować wykonywanych wywołań syscall, więc możemy odpowiednio zadbać o ich niezawodność.

narzędzie

Przykład tego narzędzia jest narzędziem do tworzenia własnych zasad i eksperymentowania z interfejsami API Sandbox2. Jest to także prezentacja jego funkcji.

  • sandbox2tool.cc: wykonawca demonstrujący:
    • jak uruchomić inny plik binarny w piaskownicy,
    • jak skonfigurować sprawdzanie systemu plików
    • sposób, w jaki wykonawcy mogą asynchronicznie uruchamiać środowisko Sandboxee w celu stopniowego odczytu danych wyjściowych.

Sprawdź to:

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 znaleźć i podłączyć wymagane biblioteki dla Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS>, aby udostępnić dodatkowe katalogi użytkownikowi Sandboxee.
  • --sandbox2tool_keep_env, aby zachować bieżące zmienne środowiskowe
  • --sandbox2tool_redirect_fd1, aby otrzymać plik STDOUT_FILENO (1) z piaskownicy i wyświetlić go lokalnie
  • --sandbox2tool_cpu_timeout, aby ustawić limit czasu procesora w sekundach
  • --sandbox2tool_walltime_timeout, aby ustawić limit czasu wyłączania urządzenia 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 oczekiwać na żądania fork() pochodzące od nadrzędnego wykonawcy.

Ten tryb zapewnia potencjalnie większą wydajność niż inne typy piaskownicy, ponieważ tutaj tworzenie nowych instancji takich gier nie wymaga uruchamiania nowych plików binarnych, tylko rozwidlenie istniejących.

  • custom_fork_bin.cc: niestandardowy serwer rozwijany, który odbiera żądania do usługi fork() (za pomocą Client::WaitAndFork), aby utworzyć nowe środowiska piaskownicy.
  • custom_fork_sandbox.cc: wykonawcy, którzy uruchamiają niestandardowy serwer rozwidleń. Następnie wysyła do niej (za pośrednictwem nowych wykonawców) żądania utworzenia nowych piaskownicy (za pomocą fork()).

sieć

Sieć przestrzeni nazw, która jest domyślnie włączona, uniemożliwia procesowi piaskownicy ze światem zewnętrznym. Ten przykład pokazuje, jak sobie radzić z tym problemem.

Połączenie jest inicjowane w wykonaniu, a wynikowe gniazdo jest przekazywane przez ::sandbox2::Comms::SendFD(). Tryb piaskownicy otrzymuje gniazdo za pomocą protokołu ::sandbox2::Comms::RecvFD(), a następnie może używać tego gniazda do wymiany danych w zwykły sposób.

  • network_bin.cc: program, który ma być piaskownicy (tzn. użytkownik piaskownicy).
  • network_sandbox.cc: program piaskownicy, który go uruchomi (czyli wykonawca).

network_proxy

Ten przykład pokazuje alternatywny sposób radzenia sobie z przestrzenią nazw sieci. Wewnętrznie działa on dokładnie tak samo jak ten powyżej, ale pojawia się jako wygodniejszy interfejs API.

Użytkownik piaskownicy może nawiązać połączenie sieciowe na 2 sposoby:

  • Automatyczne – instalując automatyczny moduł obsługi, a potem regularnie wysyłać połączenia.
  • manual – poprzez uzyskanie NetworkProxyClient bezpośrednio za pomocą 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.