Конструкция Sandbox2 основана на известных и проверенных технологиях, структуре политик и двух процессах: Sandbox Executor и Sandboxee.
Используемые технологии
В следующих разделах рассматриваются технологии, составляющие фундамент Sandbox2.
Пространства имен Linux
Пространства имён Linux — это попытка обеспечить виртуализацию на уровне операционной системы. Хотя несколько пользовательских пространств работают, казалось бы, независимо друг от друга, они используют один экземпляр ядра. Sandbox2 использует следующие типы пространств имён:
- МПК
- Сеть (если явно не отключено вызовом
PolicyBuilder::AllowUnrestrictedNetworking()
) - Монтирование (с использованием пользовательского представления дерева файловой системы)
- ПИД
- Пользователь
- УТС
Подробнее о пространствах имен Linux читайте в Википедии или на соответствующей странице руководства.
МПК
Sandbox2 позволяет обмениваться произвольными данными между исполнителем песочницы и недоверенным песочником Sandboxee. Он поддерживает сообщения типа «тип-длина-значение» (TLV), передачу файловых дескрипторов и обмен учётными данными через токены и дескрипторы.
Seccomp-BPF
Sandbox2 использует seccomp-bpf , который является расширением Secure Computing Mode (seccomp), позволяющим использовать правила Berkeley Packet Filter (BPF) для фильтрации системных вызовов.
seccomp — это функция ядра Linux, которая ограничивает системные вызовы процесса, разрешая только exit
, sigreturn
, read
и write
. Если процесс попытается выполнить другой системный вызов, он будет завершён. Расширение seccomp-bpf обеспечивает большую гибкость, чем seccomp. Вместо того, чтобы разрешать фиксированный набор системных вызовов, seccomp-bpf запускает программу BPF на основе данных системного вызова и, в зависимости от возвращаемого программой значения, может выполнить системный вызов, пропустить его и вернуть фиктивное значение, завершить процесс, сгенерировать сигнал или уведомить трассировщик.
Ptrace
Системный вызов ptrace (трассировка процесса) предоставляет функциональность, позволяющую процессу-трассировщику наблюдать за выполнением трассируемого процесса и управлять им. После подключения к трассируемому процессу он получает полный контроль над ним. Подробнее о ptrace читайте в Википедии или на соответствующей странице руководства.
Политика песочницы
Политика песочницы — важнейшая часть песочницы, поскольку она определяет действия, которые может и не может выполнять объект песочницы. Политика песочницы состоит из двух частей:
- Политика системных вызовов
- Настройка пространства имен
Политика системных вызовов по умолчанию
Политика по умолчанию блокирует системные вызовы, которые всегда опасны, и имеет приоритет над расширенной политикой, предоставленной пользователем.
Расширенная политика системных вызовов
Расширенную политику системных вызовов можно создать с помощью нашего класса PolicyBuilder . Этот класс определяет ряд удобных правил (например, AllowStaticStartup
, AllowDynamicStartup
, AllowOpen
), которые можно использовать для улучшения читаемости политики.
Если вы хотите дополнительно ограничить системные вызовы или использовать более сложные правила, вы можете указать необработанные макросы BPF с помощью AddPolicyOnSyscall
и AddPolicyOnSyscalls
. В примере crc4 этот механизм используется для ограничения аргументов для системных вызовов read
, write
и close
.
В целом, чем строже политика «песочницы», тем лучше, поскольку эксплуатация любой уязвимости, присутствующей в коде, будет ограничена этой политикой. Если вы можете точно указать, какие системные вызовы и аргументы необходимы для нормальной работы программы, то любой злоумышленник, эксплуатирующий уязвимость выполнения кода, также будет ограничен теми же ограничениями.
Действительно строгая политика «песочницы» могла бы запрещать все системные вызовы, кроме чтения и записи на стандартных файловых дескрипторах ввода и вывода. Внутри этой «песочницы» программа могла бы принимать входные данные, обрабатывать их и возвращать выходные данные. Однако, если процесс попытается выполнить любой другой системный вызов, он будет завершён из-за нарушения политики. Следовательно, если процесс будет скомпрометирован (выполнение кода злоумышленником), он не сможет сделать ничего более опасного, чем создать некорректный вывод (который исполнителю и другим участникам программы всё равно необходимо корректно обработать).
Настройка пространства имен
Объект PolicyBuilder также используется для настройки индивидуального представления файловой системы в Sandboxee. Отдельные файлы ( AddFile
/ AddFileAt
), целые каталоги ( AddDirectory
/ AddDirectoryAt
), а также временное хранилище ( AddTmpfs
) могут быть отображены в среде Sandboxee. Кроме того, AddLibrariesForBinary
можно использовать для автоматического отображения всех библиотек, необходимых указанному динамически скомпонованному исполняемому файлу.
Флаги командной строки
Любую политику Sandbox2 можно отключить, указав один из следующих флагов командной строки. Эти флаги предназначены для тестирования (например, при доработке политики расширенных системных вызовов).
-
--sandbox2_danger_danger_permit_all
-
--sandbox2_danger_danger_permit_all_and_log
Исполнитель песочницы
Исполняющий процесс песочницы (Sandbox Executor) — это процесс, который сам по себе не изолирован. Это процесс трассировки ptrace, который подключается к песочнице (процесс ptrace tracee). Исполняющий процесс песочницы также настраивает и запускает экземпляр монитора (Monitor) , который отслеживает песочницу и предоставляет информацию о её состоянии.
Sandbox2 поддерживает три режима выполнения: автономный, Sandbox2 Forkserver и Custom Forkserver. При использовании forkserver процесс Sandboxee создаётся как дочерний процесс Sandbox Executor. Эти режимы подробно описаны здесь.
Песочница
Процесс Sandboxee — это процесс, работающий в ограниченной изолированной среде, определяемой политикой Sandboxee. Исполняющий процесс Sandbox отправляет политику Sandboxee через IPC. Затем Sandboxee применяет её. Любое нарушение политики приведёт к завершению процесса, если не задано иное (см. Политика Sandboxee ).