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:
- Wykonawca uruchamia piaskownicę od ścieżki pliku za pomocą polecenia
::sandbox2::GetDataDependencyFilePath()
. - Wykonawca wysyła dane wejściowe do użytkownika piaskownicy przez kanał komunikacji
Comms
za pomocąSendBytes()
. - Sandboxee oblicza CRC4 i odsyła swoje odpowiedzi do wykonawcy przez kanał komunikacji
Comms
, który otrzymuje go za pomocą usługiRecvUint32()
.
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:
- Wykonawca uruchamia Sandboxee od swojej ścieżki do pliku za pomocą
GetDataDependencyFilepath
, tak jak w przypadku CRC4. - Ustawia limity, otwiera deskryptor pliku w
/proc/version
i oznacza go do mapowania w środowisku piaskownicy za pomocąMapFd
. - 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ć plikSTDOUT_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.
- network_bin.cc: program, który ma być piaskownicy (tzn. użytkownik piaskownicy).
- network_sandbox.cc: program piaskownicy, który go uruchomi (wykonawca).