Примеры

Обзор

Мы подготовили несколько примеров, чтобы продемонстрировать, как использовать Sandbox2 в различных сценариях и как писать политики.

Вы можете найти их в //sandboxed_api/sandbox2/examples , подробные пояснения см. ниже.

CRC4

Пример с CRC4 — это намеренно ошибочный расчет контрольной суммы CRC4, демонстрирующий, как изолировать другую программу и как с ней взаимодействовать.

  • crc4bin.cc : Программа, которую мы хотим изолировать (т.е., программа, которую мы хотим изолировать).
  • crc4sandbox.cc : Программа-песочница, которая будет её запускать (т.е. исполнитель).

Как это работает:

  1. Исполнитель запускает Sandboxee из указанного пути к файлу, используя ::sandbox2::GetDataDependencyFilePath() .
  2. Исполнитель отправляет входные данные в песочницу по каналу связи Comms используя SendBytes() .
  3. Участник песочницы вычисляет CRC4 и отправляет свой ответ обратно исполнителю по каналу связи Comms , который принимает его с помощью RecvUint32() .

Если программа выполняет какие-либо системные вызовы, кроме обмена данными ( read() и write() ), она завершается с ошибкой из-за нарушения правил.

статический

В статическом примере показано, как изолировать статически скомпилированный исполняемый файл, например, сторонний исполняемый файл, исходный код которого вам недоступен, то есть он не знает о том, что будет изолирован.

  • static_bin.cc : Sandboxee — это статический исполняемый файл на языке C, который преобразует текст ASCII из стандартного ввода в верхний регистр.
  • static_sandbox.cc : Исполнитель с указанием политики, ограничений и использованием файлового дескриптора для ввода данных в Sandboxee.

Как это работает:

  1. Исполнитель запускает Sandboxee, используя путь к файлу с помощью GetDataDependencyFilepath , аналогично тому, как это делается для CRC4.
  2. Он устанавливает ограничения, открывает файловый дескриптор в /proc/version и помечает его для сопоставления в песочнице с помощью MapFd .
  3. Данная политика позволяет некоторым системным вызовам (например open ) возвращать ошибку ( ENOENT ) вместо того, чтобы завершаться принудительно из-за нарушения политики. Это может быть полезно при изоляции сторонней программы, где мы не можем изменять, какие системные вызовы выполняются, поэтому мы можем обеспечить их корректное завершение.

инструмент

Приведенный пример инструмента служит одновременно средством для разработки собственных политик и экспериментирования с API Sandbox2, а также демонстрацией его возможностей.

  • sandbox2tool.cc : Исполнитель демонстрирует:
    • как запустить другой исполняемый файл в изолированной среде
    • как настроить проверку файловой системы и
    • Как исполнитель может запускать Sandboxee асинхронно, чтобы постепенно считывать его выходные данные.

Попробуйте сами:

Базель

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

Флаги:

  • --sandbox2tool_resolve_and_add_libraries для разрешения и монтирования необходимых библиотек для Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> чтобы предоставить доступ к дополнительным каталогам для пользователя, работающего в песочнице.
  • --sandbox2tool_keep_env для сохранения текущих переменных окружения
  • --sandbox2tool_redirect_fd1 для получения STDOUT_FILENO (1) Sandboxee и вывода его локально
  • --sandbox2tool_cpu_timeout установить время ожидания ЦП в секундах
  • --sandbox2tool_walltime_timeout — установить время ожидания в секундах
  • --sandbox2tool_file_size_creation_limit — установить максимальный размер создаваемых файлов
  • --sandbox2tool_cwd — установить текущий рабочий каталог песочницы

custom_fork

Пример custom_fork демонстрирует, как создать песочницу, которая инициализирует исполняемый файл, а затем ожидает запросов fork() от родительского исполнителя.

Этот режим потенциально обеспечивает повышенную производительность по сравнению с другими типами песочницы, поскольку здесь для создания новых экземпляров объектов, находящихся в песочнице, не требуется запускать новые исполняемые файлы, а достаточно лишь создать форк существующих.

  • custom_fork_bin.cc : Пользовательский форк-сервер, принимающий запросы на создание fork() (через ForkingClient::EnterForkLoop ) для запуска новых объектов в песочнице.
  • custom_fork_sandbox.cc : Исполнитель, который запускает пользовательский сервер форков. Затем он отправляет ему запросы (через новые исполнители) на создание (через fork() ) новых объектов Sandboxee.

сеть

Пространство имен сети, включенное по умолчанию, препятствует подключению изолированного процесса к внешнему миру. В этом примере показано, как решить эту проблему.

Внутри исполнителя инициализируется соединение, и полученный сокет передается через ::sandbox2::Comms::SendFD() . Участник, находящийся в песочнице, получает сокет с помощью ::sandbox2::Comms::RecvFD() , после чего может использовать этот сокет для обмена данными обычным способом.

  • network_bin.cc : Программа, которую мы хотим изолировать (т.е., программа, которую мы хотим изолировать).
  • network_sandbox.cc : Программа-песочница, которая будет её запускать (т.е. исполнитель).

сетевой_прокси

Этот пример демонстрирует альтернативный способ работы с сетевым пространством имен. Внутри он работает точно так же, как и в приведенном выше примере, но представлен в виде более удобного API.

Пользователь, находящийся в песочнице, может установить сетевое соединение двумя различными способами:

  • автоматический режим – Путем установки автоматического обработчика и последующего выполнения регулярных вызовов для установления соединения.
  • вручную – Получив объект NetworkProxyClient и напрямую используя NetworkProxyClient::Connect .

В этом примере показаны оба метода. Автоматический режим используется, если установлен флаг connect_with_handler , в противном случае используется ручной режим.

  • network_bin.cc : Программа, которую мы хотим изолировать (т.е., программа, которую мы хотим изолировать).
  • network_sandbox.cc : Программа-песочница, которая будет её запускать (исполнитель).