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
Commsza 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/versioni 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/hostnameCMake + Ninja
cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameGoogle3 (Blaze)
blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameFlagi:
--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
NetworkProxyClienti 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).