Обзор
Мы подготовили несколько примеров, чтобы продемонстрировать, как использовать 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 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
для получения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()
(черезClient::WaitAndFork
) для создания новых песочниц. - custom_fork_sandbox.cc : исполнитель, который запускает собственный сервер разветвления. Затем он отправляет ему запросы (через новые исполнители) на создание (через
fork()
) новых песочниц.
сеть
Сетевое пространство имен, включенное по умолчанию, не позволяет изолированному процессу подключаться к внешнему миру. Этот пример демонстрирует, как справиться с этой проблемой.
Соединение инициализируется внутри исполнителя, а полученный сокет передается через ::sandbox2::Comms::SendFD()
. Sandboxee получает сокет с помощью ::sandbox2::Comms::RecvFD()
а затем может использовать этот сокет для обычного обмена данными.
- network_bin.cc : программа, которую мы хотим поместить в песочницу (т. е. Sandboxee).
- network_sandbox.cc : программа-песочница, которая будет ее запускать (т. е. исполнитель).
network_proxy
Этот пример демонстрирует альтернативный способ работы с сетевым пространством имен. Внутренне он работает точно так же, как приведенный выше пример, но представлен как более удобный API.
Sandboxee может установить сетевое соединение двумя разными способами:
- автоматический — путем установки автоматического обработчика и последующего выполнения регулярных вызовов подключения.
- руководство — путем получения
NetworkProxyClient
и непосредственного использованияNetworkProxyClient::Connect
.
В этом примере показаны оба метода. Автоматический режим используется, когда установлен флаг connect_with_handler
, в противном случае используется ручной режим.
- network_bin.cc : программа, которую мы хотим поместить в песочницу (т. е. Sandboxee).
- network_sandbox.cc : программа-песочница, которая будет ее запускать (исполнитель).
Обзор
Мы подготовили несколько примеров, чтобы продемонстрировать, как использовать 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 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
для получения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()
(черезClient::WaitAndFork
) для создания новых песочниц. - custom_fork_sandbox.cc : исполнитель, который запускает собственный сервер разветвления. Затем он отправляет ему запросы (через новые исполнители) на создание (через
fork()
) новых песочниц.
сеть
Сетевое пространство имен, включенное по умолчанию, не позволяет изолированному процессу подключаться к внешнему миру. Этот пример демонстрирует, как справиться с этой проблемой.
Соединение инициализируется внутри исполнителя, а полученный сокет передается через ::sandbox2::Comms::SendFD()
. Sandboxee получает сокет с помощью ::sandbox2::Comms::RecvFD()
а затем может использовать этот сокет для обычного обмена данными.
- network_bin.cc : программа, которую мы хотим поместить в песочницу (т. е. Sandboxee).
- network_sandbox.cc : программа-песочница, которая будет ее запускать (т. е. исполнитель).
network_proxy
Этот пример демонстрирует альтернативный способ работы с сетевым пространством имен. Внутренне он работает точно так же, как приведенный выше пример, но представлен как более удобный API.
Sandboxee может установить сетевое соединение двумя разными способами:
- автоматический — путем установки автоматического обработчика и последующего выполнения регулярных вызовов подключения.
- руководство — путем получения
NetworkProxyClient
и непосредственного использованияNetworkProxyClient::Connect
.
В этом примере показаны оба метода. Автоматический режим используется, когда установлен флаг connect_with_handler
, в противном случае используется ручной режим.
- network_bin.cc : программа, которую мы хотим поместить в песочницу (т. е. Sandboxee).
- network_sandbox.cc : программа-песочница, которая будет ее запускать (исполнитель).