Sandboxed API (SAPI) создан на основе хорошо зарекомендовавшего себя проекта Sandbox2 . На этой странице объясняется архитектура SAPI и основные концепции.
Обзор
SAPI предназначен для предоставления разработчикам инструментов для подготовки библиотек C/C++ для «песочницы», а также API, необходимых для взаимодействия с изолированной версией библиотек C/C++.
На этой диаграмме показана архитектура изолированной библиотеки SAPI C/C++:
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.