Примеры

Обзор

Мы подготовили несколько примеров, чтобы продемонстрировать, как использовать 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 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 : программа-песочница, которая будет ее запускать (т. е. исполнитель).

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

  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 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 : программа-песочница, которая будет ее запускать (исполнитель).