Wyjaśnienie interfejsu API piaskownicy

Interfejs Sandboxed API (SAPI) opiera się na dobrze znanym projekcie Sandbox2. Na tej stronie opisujemy architekturę projektową SAPI i najważniejsze koncepcje.

Opis

Interfejs SAPI został opracowany z myślą o udostępnianiu programistom narzędzi do przygotowania bibliotek C/C++ do piaskownicy, a także interfejsów API niezbędnych do komunikacji z bibliotekami C/C++ w wersji piaskownicy.

Ten diagram przedstawia architekturę biblioteki C/C++ w piaskownicy SAPI:

Diagram SAPI

Interfejs SAPI udostępnia też elementy podstawowe do ręcznej i automatycznej (na podstawie niestandardowych atrybutów wskaźnika) synchronizacji pamięci (tablic, struktur) między bibliotekami SAPI a kodem hosta.

I wreszcie, ogólny interfejs Transaction API umożliwia monitorowanie bibliotek SAPI i uruchamianie ich ponownie w przypadku niepowodzenia (np. z powodu naruszeń zabezpieczeń, awarii lub wyczerpania zasobów).

Sandbox2

Projekt open source Sandbox2 jest opracowywany i zarządzany przez inżynierów Google ds. bezpieczeństwa. Jest on podstawową technologią piaskownicy wykorzystywaną przez SAPI. Pakiet Sandbox2 zawiera 3 główne komponenty: zasady piaskownicy, wykonawcę i środowisko piaskownicy.

Zasady piaskownicy

Zasada piaskownicy definiuje ograniczone środowisko wykonawcze biblioteki w trybie piaskownicy. Jest to możliwe dzięki określeniu, które wywołania syscalls mogą być wykonywane. Interfejs SAPI korzysta z tego samego mechanizmu co piaskownica2. Więcej informacji na temat projektowania i definiowania zasad piaskownicy znajdziesz w sekcjach zasad piaskownicy i stronie Pierwsze kroki dotyczącej piaskownicy Sandbox2.

Interfejs SAPI używa zasady domyślnej. Możesz też użyć dedykowanej zasady piaskownicy, definiując ją w pliku nagłówka sandbox.h i przekazując ją jako argument w regule kompilacji sapi_library.

Biblioteka w trybie piaskownicy

To jest biblioteka C/C++ w trybie piaskownicy, która zostanie uruchomiona w ograniczonym środowisku piaskownicy udostępnionej przez Sandbox2. W ten sposób biblioteka w trybie piaskownicy ujawnia wymagane funkcje, z których może korzystać kod hosta.

Biblioteka w trybie piaskownicy jest tworzona za pomocą reguły kompilacji sapi_library, w której możesz określić niestandardową zasadę piaskownicy, która definiuje ograniczone środowisko wykonawcze. W zależności od biblioteki może być konieczne napisanie kodu towarzyszącego lub skróconego kodu (patrz libcurl), ale podczas przygotowywania wersji SAPI nie należy zmieniać kodu źródłowego biblioteki C/C++.

Obiekt SAPI i kod RPC

Obiekt SAPI to obiekt C++, który udostępnia interfejs API biblioteki piaskownicy. Przekazuje on wywołania z kodu hosta do elementu Stub RPC, który jest umieszczony w bibliotece SAPI razem z biblioteką w trybie piaskownicy.

Te 2 elementy są automatycznie generowane przez system kompilacji za pomocą reguły kompilacji sapi_library(). SAPI obsługuje 2 systemy kompilacji: Bazel i CMake od Google.

Kod hosta

Kod hosta jest tym, który implementuje logikę udostępnioną przez bibliotekę SAPI. W przeciwnym razie korzystałaby z biblioteki C/C++ znajdującej się poza piaskownicą. W związku z tym kod hosta wywołuje funkcje wyeksportowane przez bibliotekę SAPI, przekazując dane do piaskownicy i odbierając je z piaskownicy.

Musisz dostosować kod hosta tak, aby używał biblioteki SAPI. W szczególności nie można wywoływać funkcji biblioteki, ponieważ biblioteka znajduje się w osobnym procesie w trybie piaskownicy. Dlatego interfejs SAPI udostępnia narzędzia tworzące obiekt SAPI, który przekierowuje wywołania do biblioteki SAPI.

Pojęcia

Reguły kompilacji Bazel

Projekt SAPI udostępnia 2 reguły kompilacji Bazel dotyczące piaskownicy biblioteki C/C++:

  • sapi_library() – tworzy wszystkie dane wyjściowe niezbędne do umieszczenia biblioteki C/C++ w piaskownicy jako piaskownicy Sandbox2. Dane wyjściowe kompilacji mogą być używane jako zależność od reguły cc_binary() używanej do skompilowania pliku binarnego kodu hosta.
  • sapi_interface() – automatycznie generuje nagłówek, który można dołączyć do pliku binarnego kodu hosta.

Bardziej szczegółowe objaśnienie reguł tworzenia znajdziesz w artykule Reguły tworzenia.

Zmienne

Interfejs SAPI udostępnia wiele specjalnych typów nazywanych typami SAPI, które zalecamy w kodzie hosta. Typy SAPI są potrzebne przede wszystkim ze względu na proces, a tym samym – izolację pamięci między kodem hosta a biblioteką w trybie piaskownicy.

Bardziej wyczerpujące objaśnienie tego tematu i omówienie niektórych często używanych typów SAPI znajdziesz w sekcji Zmienne.

Transakcje

Jak wyjaśniliśmy powyżej, każde wywołanie interfejsu API biblioteki w trybie piaskownicy jest przekazywane przez warstwę RPC. Aby obsłużyć awarie w tej warstwie, musisz wdrożyć odpowiednią obsługę błędów. Moduł transakcji SAPI udostępnia niezbędny mechanizm do sprawdzania, czy wszystkie wywołania biblioteki w trybie piaskownicy są ukończone bez problemów na poziomie RPC lub są zwracane z odpowiednim błędem.

Bardziej szczegółowe objaśnienie tego tematu znajdziesz w artykule Transakcje.

Pierwsze kroki

Przeczytaj informacje na stronie Pierwsze kroki, aby skonfigurować swój pierwszy projekt interfejsu API w trybie piaskownicy.