Wyjaśnienie interfejsu API piaskownicy

Interfejs SAPI (Sandboxed API) jest oparty na dobrze znanym projekcie Sandbox2. Na tej stronie opisujemy architekturę SAPI i kluczowe pojęcia.

Przegląd

SAPI ma na celu udostępnienie deweloperom narzędzi do przygotowywania bibliotek C/C++ do piaskownicy, a także interfejsów API niezbędnych do komunikacji z wersją bibliotek C/C++ w piaskownicy.

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

Diagram SAPI

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

Interfejs API transakcji wysokiego poziomu umożliwia monitorowanie bibliotek SAPI i ponowne uruchamianie ich w przypadku awarii (np. z powodu naruszenia zabezpieczeń, awarii lub wyczerpania zasobów).

Sandbox2

Projekt open source Sandbox2 jest rozwijany i utrzymywany przez inżynierów ds. bezpieczeństwa Google. Jest to podstawowa technologia piaskownicy używana przez SAPI. Sandbox2 zawiera 3 główne komponenty: zasady piaskownicy, wykonawcęSandboxee.

Zasady dotyczące piaskownicy

Zasady piaskownicy określają ograniczone środowisko wykonawcze dla biblioteki w piaskownicy. Osiąga się to przez wyjaśnienie, które wywołania systemowe mogą być wykonywane. SAPI korzysta z tego samego mechanizmu co Sandbox2. Więcej informacji o projektowaniu i definiowaniu zasad piaskownicy znajdziesz w sekcji Zasady piaskownicy i na stronie Wprowadzenie dotyczącej Sandbox2.

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

Biblioteka w piaskownicy

Jest to biblioteka C/C++ w piaskownicy, która będzie wykonywana w ograniczonym środowisku piaskownicy udostępnianym przez Sandbox2. Ostatecznie biblioteka w piaskownicy udostępnia wymagane funkcje, z których może korzystać kod hosta.

Biblioteka w piaskownicy jest tworzona za pomocą reguły kompilacji sapi_library, w której możesz określić niestandardowe zasady piaskownicy definiujące ograniczone środowisko wykonawcze. W zależności od biblioteki może być konieczne napisanie kodu otoki lub kodu zastępczego (patrz libcurl), ale podczas przygotowywania wersji SAPI nie musisz zmieniać kodu źródłowego biblioteki C/C++.

Obiekt SAPI i stub RPC

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

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

Kod gospodarza

Kod hosta implementuje logikę dostarczoną przez bibliotekę SAPI. W przeciwnym razie zużywałaby ona wersję biblioteki C/C++ bez piaskownicy. W związku z tym kod hosta wywołuje funkcje wyeksportowane przez bibliotekę SAPI, przekazując dane do piaskownicy i odbierając z niej dane.

Kod hosta musi zostać dostosowany do korzystania z biblioteki SAPI. Przede wszystkim nie można wywoływać funkcji biblioteki, ponieważ znajduje się ona w osobnym procesie w piaskownicy. Dlatego SAPI udostępnia narzędzia, które tworzą obiekt SAPI, który przekazuje wywołania do biblioteki SAPI.

Pojęcia

Reguły kompilacji Bazel

Projekt SAPI udostępnia 2 reguły kompilacji Bazel do umieszczania biblioteki C/C++ w piaskownicy:

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

Szczegółowe wyjaśnienie reguł kompilacji znajdziesz w artykule Reguły kompilacji.

Zmienne

SAPI udostępnia kilka specjalnych typów, zwanych typami SAPI, które zalecamy stosować w kodzie hosta. Głównym powodem, dla którego potrzebne są typy SAPI, jest izolacja procesów, a tym samym pamięci, między kodem hosta a biblioteką w piaskownicy.

Szczegółowe wyjaśnienie tego tematu oraz omówienie niektórych często używanych typów SAPI znajdziesz w artykule Zmienne.

Transakcje

Jak wyjaśniliśmy powyżej, każde wywołanie interfejsu API w bibliotece w piaskownicy jest przekazywane przez warstwę RPC. Aby móc obsłużyć błąd na tej warstwie, musisz wdrożyć odpowiednią obsługę błędów. Moduł SAPI Transaction zapewnia mechanizm, który gwarantuje, że wszystkie wywołania biblioteki w piaskownicy zostaną ukończone bez problemów na poziomie RPC lub zostaną zwrócone z odpowiednim błędem.

Bardziej szczegółowe wyjaśnienie tego tematu znajdziesz w sekcji Transakcje.

Pierwsze kroki

Aby skonfigurować pierwszy projekt interfejsu API w piaskownicy, przeczytaj stronę Wprowadzenie.