Объяснение изолированного API

Sandboxed API (SAPI) создан на основе хорошо зарекомендовавшего себя проекта Sandbox2 . На этой странице объясняется архитектура SAPI и основные концепции.

Обзор

SAPI предназначен для предоставления разработчикам инструментов для подготовки библиотек C/C++ для «песочницы», а также API, необходимых для взаимодействия с изолированной версией библиотек C/C++.

На этой диаграмме показана архитектура изолированной библиотеки SAPI C/C++:

Диаграмма SAPI

SAPI также предоставляет примитивы для ручной и автоматической (на основе пользовательских атрибутов указателей) синхронизации памяти (массивов, структур) между библиотеками SAPI и кодом хоста.

Наконец, API транзакций высокого уровня позволяет осуществлять мониторинг библиотек SAPI и перезапускать их в случае сбоя (например, из-за нарушений безопасности, сбоев или исчерпания ресурсов).

Песочница2

Проект с открытым исходным кодом Sandbox2 разработан и поддерживается инженерами по безопасности Google и является основной технологией «песочницы», используемой SAPI. Sandbox2 состоит из трёх основных компонентов: Sandbox Policy , Executor и Sandboxee .

Политика песочницы

Политика песочницы определяет ограниченную среду выполнения для изолированной библиотеки. Это достигается путём уточнения того, какие системные вызовы могут быть выполнены. SAPI использует тот же механизм, что и Sandbox2. Подробнее о разработке и определении политики песочницы см. в разделе «Политика песочницы» и на странице «Начало работы» для Sandbox2.

SAPI использует политику по умолчанию, или вы можете использовать специальную политику «песочницы», определив ее в заголовочном файле sandbox.h и передав ее в качестве аргумента в правиле сборки sapi_library .

Библиотека в песочнице

Это изолированная библиотека C/C++, которая будет выполняться в ограниченной среде песочницы, предоставляемой Sandbox2. В конечном счёте, изолированная библиотека предоставляет необходимую функциональность, которую может использовать код хоста .

Библиотека Sandboxed собрана с помощью правила сборки sapi_library , в котором можно задать настраиваемую политику песочницы, определяющую ограниченную среду выполнения. В зависимости от библиотеки, вам может потребоваться написать код-обёртку или заглушку (см. libcurl ), но при подготовке версии SAPI от вас не требуется изменять исходный код библиотеки C/C++.

Объект SAPI и заглушка RPC

SAPI-объект — это C++-объект, предоставляющий API библиотеки Sandboxed. Он перенаправляет вызовы из кода хоста в RPC-заглушку, встроенную в библиотеку SAPI вместе с библиотекой Sandboxed.

Эти два элемента автоматически генерируются системой сборки с помощью правила сборки sapi_library() . SAPI поддерживает две системы сборки: Bazel от Google и CMake .

Код хоста

Хост-код реализует логику, предоставляемую библиотекой SAPI. В противном случае он использовал бы неизолированную версию библиотеки C/C++. Таким образом, хост-код вызывает функции, экспортируемые библиотекой SAPI, передавая данные в песочницу и получая их из нее.

Хост-код необходимо адаптировать для использования библиотеки SAPI. В частности, вызов функций библиотеки невозможен, поскольку библиотека находится в отдельном изолированном процессе. Поэтому SAPI предоставляет инструменты для создания объекта SAPI, который перенаправляет вызовы в библиотеку SAPI.

Концепции

Правила сборки Bazel

Проект SAPI предоставляет два правила сборки Bazel для изоляции библиотеки C/C++:

  • sapi_library() – создаёт все выходные данные, необходимые для помещения библиотеки C/C++ в песочницу Sandbox2 Sandboxee. Выходные данные сборки можно использовать в качестве зависимости для правила cc_binary() используемого для сборки двоичного кода хоста.
  • sapi_interface() – автоматически генерирует заголовок, который может быть включен в двоичный код хоста.

Более подробное объяснение правил сборки см. в разделе Правила сборки .

Переменные

SAPI предоставляет ряд специальных типов, называемых типами SAPI , которые мы рекомендуем использовать в коде хоста . Основная причина необходимости типов SAPI — изоляция процессов (и, следовательно, памяти) между кодом хоста и изолированной библиотекой.

Более подробное объяснение этой темы и обзор некоторых часто используемых типов SAPI см. в разделе Переменные .

Транзакции

Как объяснялось выше, любой API-вызов к изолированной библиотеке передаётся через уровень RPC. Для обработки сбоев на этом уровне необходимо реализовать соответствующую обработку ошибок. Модуль SAPI Transaction предоставляет необходимый механизм, гарантирующий, что все вызовы к изолированной библиотеке будут выполнены без проблем на уровне RPC или будут возвращены с соответствующей ошибкой.

Более подробное объяснение этой темы см. в разделе Транзакции .

Начиная

Ознакомьтесь с нашей страницей «Начало работы» , чтобы настроить свой первый проект изолированного API.