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 umieścić 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 będzie go uruchamiać (czyli wykonawca).
Jak to działa:
- Wykonawca uruchamia Sandboxee z jego ścieżki pliku za pomocą
::sandbox2::GetDataDependencyFilePath(). - Wykonawca wysyła dane wejściowe do Sandboxee przez kanał komunikacyjny
Commsza pomocąSendBytes(). - Sandboxee oblicza CRC4 i wysyła odpowiedzi z powrotem do wykonawcy przez kanał komunikacyjny
Comms, który odbiera je za pomocąRecvUint32().
Jeśli program wykona jakiekolwiek wywołanie systemowe inne niż komunikacja (read() i write()), zostanie zakończony 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 C, który konwertuje tekst ASCII ze standardowego wejścia na wielkie litery.
- static_sandbox.cc: wykonawca z zasadami, limitami i używający deskryptora pliku do danych wejściowych Sandboxee.
Jak to działa:
- Wykonawca uruchamia Sandboxee z jego ś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 to, aby niektóre wywołania systemowe (
open) zwracały błąd (ENOENT), zamiast powodować zakończenie programu z powodu naruszenia zasad. Może to być przydatne w przypadku umieszczania w piaskownicy programu innej firmy, w którym nie możemy modyfikować wywołań systemowych. Zamiast tego możemy sprawić, że będą one kończyć się w sposób kontrolowany.
narzędzie
Przykład narzędzia to zarówno narzędzie do tworzenia własnych zasad i eksperymentowania z interfejsami API Sandbox2, jak i demonstracja jego funkcji.
- sandbox2tool.cc: wykonawca, który pokazuje:
- jak uruchomić inny 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>– aby udostępnić Sandboxee dodatkowe katalogi.--sandbox2tool_keep_env– aby zachować bieżące zmienne środowiskowe.--sandbox2tool_redirect_fd1– aby odbieraćSTDOUT_FILENO (1)Sandboxee i wyświetlać je lokalnie.--sandbox2tool_cpu_timeout– aby ustawić limit czasu procesora w sekundach.--sandbox2tool_walltime_timeout– aby ustawić limit czasu rzeczywistego 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 czekać na żądania fork() pochodzące od wykonawcy nadrzędnego.
Ten tryb może zwiększyć wydajność w porównaniu z innymi typami piaskownicy, ponieważ w tym przypadku tworzenie nowych instancji Sandboxee nie wymaga wykonywania nowych plików binarnych, tylko rozwidlenia istniejących.
- custom_fork_bin.cc: niestandardowy serwer rozwidlenia, który odbiera żądania
fork()(za pomocąForkingClient::EnterForkLoop), aby tworzyć nowe 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 tworzyć (za pomocą
fork()) nowe Sandboxee.
sieć
Przestrzeń nazw sieci, która jest domyślnie włączona, uniemożliwia procesowi działającemu w piaskownicy łączenie się ze światem zewnętrznym. Ten przykład pokazuje, jak rozwiązać ten problem.
Połączenie jest inicjowane w wykonawcy, a wynikowy gniazdo jest przekazywane za pomocą ::sandbox2::Comms::SendFD(). Sandboxee odbiera gniazdo za pomocą ::sandbox2::Comms::RecvFD(), a następnie może używać tego gniazda do wymiany danych jak zwykle.
- 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 radzenia sobie z przestrzenią nazw sieci. Wewnętrznie działa dokładnie tak samo jak powyższy przykład, ale jest udostępniany jako wygodniejszy interfejs API.
Sandboxee może nawiązać połączenie sieciowe na 2 sposoby:
- automatyczny – przez zainstalowanie automatycznego modułu obsługi i wykonywanie regularnych wywołań połączenia.
- ręczny – przez uzyskanie
NetworkProxyClienti bezpośrednie użycieNetworkProxyClient::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 chcemy umieścić w piaskownicy (czyli Sandboxee);
- network_sandbox.cc: program piaskownicy, który będzie go uruchamiać (czyli wykonawca).