Объяснение Sandbox2

Архитектура Sandbox2 основана на хорошо известных и устоявшихся технологиях, фреймворке правил и двух процессах: Sandbox Executor и Sandboxee.

Используемые технологии

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

Пространства имен Linux

Пространства имен Linux – это попытка обеспечить виртуализацию на уровне операционной системы. Несмотря на то что несколько пространств пользователя работают независимо друг от друга, они используют один и тот же экземпляр ядра. Sandbox2 использует следующие типы пространств имен:

  • IPC : межпроцессное взаимодействие : взаимодействие между процессами
  • Сеть (если не отключено явным образом при вызове PolicyBuilder::AllowUnrestrictedNetworking())
  • Подключение (с использованием специального представления дерева файловой системы)
  • PID
  • Пользователь
  • UTS

Подробнее о пространствах имен Linux можно узнать в Википедии или на странице руководства.

IPC : межпроцессное взаимодействие : взаимодействие между процессами

Sandbox2 позволяет обмениваться произвольными данными между исполнителем песочницы и ненадежным процессом песочницы. Он поддерживает сообщения типа "тип-длина-значение" (TLV), передачу дескрипторов файлов и обмен учетными данными с помощью токенов и дескрипторов.

Seccomp-BPF

Sandbox2 использует seccomp-bpf – расширение режима безопасных вычислений (seccomp), которое позволяет фильтровать системные вызовы с помощью правил фильтра пакетов Berkeley (BPF).

seccomp – это функция ядра Linux, которая ограничивает системные вызовы процесса, разрешая только exit, sigreturn, read и write. Если процесс попытается выполнить другой системный вызов, он будет завершен. Расширение seccomp-bpf обеспечивает большую гибкость, чем seccomp. Вместо того чтобы разрешать фиксированный набор системных вызовов, seccomp-bpf запускает программу BPF для данных системного вызова и в зависимости от возвращаемого значения программы может выполнить системный вызов, пропустить его и вернуть фиктивное значение, завершить процесс, сгенерировать сигнал или уведомить трассировщик.

Ptrace

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

Правила изолированной среды

Правила песочницы – это ее самая важная часть, поскольку они определяют, какие действия может и не может выполнять изолированный процесс. Правила песочницы состоят из двух частей:

  • Правила системных вызовов
  • Настройка пространства имен

Правило системных вызовов по умолчанию

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

Расширенные правила системных вызовов

Расширенные правила для системных вызовов можно создать с помощью класса PolicyBuilder. Этот класс определяет ряд удобных правил (например, AllowStaticStartup, AllowDynamicStartup, AllowOpen), которые можно использовать для улучшения читаемости политики.

В большинстве случаев рекомендуется начинать с DefaultPolicyBuilder (sapi::Sandbox2Config::DefaultPolicyBuilder()), который возвращает PolicyBuilder, предварительно настроенный с базовыми правилами для типичных однопоточных библиотек. Его можно дополнительно настроить с помощью дополнительных правил (например, .AllowDynamicStartup() и .AddLibrariesForBinary() при изолировании двоичного файла). В Sandboxed API (SAPI) DefaultPolicyBuilder() используется sapi::SandboxConfig::DefaultConfig() вместе с sapi::SandboxConfig::DefaultFlags(), sapi::SandboxConfig::DefaultEnvironmentVariables() и sapi::Sandbox2Config::DefaultLimits(). Создавать PolicyBuilder напрямую следует только в том случае, если нельзя использовать DefaultPolicyBuilder() или требуется точная конфигурация.

Если вы хотите дополнительно ограничить системные вызовы или задать более сложные правила, вы можете указать необработанные макросы BPF с помощью AddPolicyOnSyscall и AddPolicyOnSyscalls. В примере crc4 этот механизм используется для ограничения аргументов системных вызовов read, write и close.

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

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

Настройка пространства имен

Объект PolicyBuilder также используется для настройки индивидуального представления файловой системы для Sandboxee. В среду Sandboxee можно сопоставить отдельные файлы (AddFile / AddFileAt), целые каталоги (AddDirectory / AddDirectoryAt), а также временное хранилище (AddTmpfs). Кроме того, AddLibrariesForBinary можно использовать для автоматического сопоставления всех библиотек, необходимых для указанного исполняемого файла с динамической компоновкой.

Параметры командной строки

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Исполнитель изолированной среды

Исполнитель песочницы – это процесс, который сам не находится в песочнице. Это процесс трассировки ptrace, который подключается к изолированной среде (процесс трассировки ptrace). Исполнитель песочницы также настраивает и запускает экземпляр монитора, который отслеживает песочницу и предоставляет информацию о ее состоянии.

Sandbox2 поддерживает три режима выполнения: автономный, Sandbox2 Forkserver и пользовательский Forkserver. Если вы используете forkserver, песочница создается как дочерний процесс исполнителя песочницы. Подробное описание этих режимов приведено ниже.

Sandboxee

Изолированный процесс – это процесс, который выполняется в ограниченной изолированной среде, определенной правилами изоляции. Исполнитель изолированной среды отправляет правила в изолированную среду через IPC. Затем Sandboxee применяет правила. Любое нарушение правил приведет к завершению процесса, если не настроено иное (см. правила песочницы).