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:
- Wykonawca uruchamia Sandboxee ze ścieżki pliku za pomocą polecenia
::sandbox2::GetDataDependencyFilePath()
. - Proces wykonawczy wysyła dane wejściowe do procesu Sandboxee przez kanał komunikacyjny
Comms
za pomocą funkcjiSendBytes()
. - Sandboxee oblicza CRC4 i wysyła odpowiedzi z powrotem do wykonawcy przez kanał komunikacyjny
Comms
, który odbiera je zRecvUint32()
.
Jeśli program wykonuje jakiekolwiek wywołanie systemowe inne niż komunikacja (read()
i 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:
- Wykonawca uruchamia Sandboxee ze ścieżki pliku za pomocą
GetDataDependencyFilepath
, tak jak w przypadku CRC4. - Ustawia limity, otwiera deskryptor pliku w
/proc/version
i oznacza go jako mapowany w Sandboxee za pomocąMapFd
. - 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ć SandboxeeSTDOUT_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życieNetworkProxyClient::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).