Архитектура 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 применяет правила. Любое нарушение правил приведет к завершению процесса, если не настроено иное (см. правила песочницы).