Обзор
Мы подготовили несколько примеров, демонстрирующих, как использовать Sandbox2 в различных сценариях и как писать политики.
Вы можете найти их в //sandboxed_api/sandbox2/examples , подробные объяснения см. ниже.
CRC4
Пример CRC4 — это намеренно ошибочный расчет контрольной суммы CRC4, который демонстрирует, как изолировать другую программу и как с ней взаимодействовать.
- crc4bin.cc : Программа, которую мы хотим поместить в песочницу (т.е. Sandboxee)
- crc4sandbox.cc : программа-песочница, которая будет его запускать (т.е. исполнитель).
Как это работает:
- Исполнитель запускает Sandboxee из его файлового пути с помощью
::sandbox2::GetDataDependencyFilePath()
. - Исполнитель отправляет входные данные в Sandboxee по каналу связи
Comms
с помощьюSendBytes()
. - Sandboxee вычисляет CRC4 и отправляет свои ответы обратно исполнителю по каналу связи
Comms
, который получает их с помощьюRecvUint32()
.
Если программа выполняет какой-либо системный вызов, отличный от коммуникационного ( read()
и write()
), она завершается из-за нарушения политики.
статический
В статическом примере показано, как изолировать статически скомпонованный двоичный файл, например, сторонний двоичный файл, исходного кода которого у вас нет, то есть он не знает, что будет помещен в песочницу.
- static_bin.cc : Sandboxee — это статический двоичный файл C, который преобразует текст ASCII из стандартного ввода в верхний регистр.
- static_sandbox.cc : Исполнитель со своей политикой, ограничениями и использованием файлового дескриптора для входных данных Sandboxee.
Как это работает:
- Исполнитель запускает Sandboxee из его файлового пути, используя
GetDataDependencyFilepath
, как и для CRC4. - Он устанавливает ограничения, открывает файловый дескриптор в
/proc/version
и помечает его для отображения в Sandboxee с помощьюMapFd
. - Политика позволяет некоторым системным вызовам (
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
для получения SandboxeeSTDOUT_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 : программа-песочница, которая будет его запускать (исполнитель).