Примеры

Обзор

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

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

CRC4

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

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

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

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

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

статический

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

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

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

  1. Исполнитель запускает Sandboxee из его файлового пути, используя GetDataDependencyFilepath , как и для CRC4.
  2. Он устанавливает ограничения, открывает файловый дескриптор в /proc/version и помечает его для отображения в Sandboxee с помощью 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 + Ниндзя

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> чтобы сделать дополнительные каталоги доступными для Sandboxee
  • --sandbox2tool_keep_env для сохранения текущих переменных среды
  • --sandbox2tool_redirect_fd1 для получения Sandboxee STDOUT_FILENO (1) и его локального вывода
  • --sandbox2tool_cpu_timeout для установки тайм-аута ЦП в секундах
  • --sandbox2tool_walltime_timeout для установки тайм-аута в секундах
  • --sandbox2tool_file_size_creation_limit для установки максимального размера создаваемых файлов
  • --sandbox2tool_cwd для установки текущего рабочего каталога песочницы

custom_fork

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

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

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

сеть

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

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

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

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

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

Sandboxee может установить сетевое соединение двумя разными способами:

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

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

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