Песочница 2: объяснение

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

Задействованные технологии

В следующих разделах рассматриваются технологии, составляющие основу Sandbox2.

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

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

  • МПК
  • Сеть (если она явно не отключена путем вызова PolicyBuilder::AllowUnrestrictedNetworking() )
  • Монтирование (с использованием пользовательского представления дерева файловой системы)
  • ПИД
  • Пользователь (если он явно не отключен путем вызова PolicyBuilder::AllowUnsafeKeepCapabilities() )
  • ОТС

Дополнительную информацию о пространствах имен Linux можно найти в Википедии или на соответствующей странице руководства.

МПК

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

Секкомп-БПФ

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

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

Птраце

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

Политика песочницы

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

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

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

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

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

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

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

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

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

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

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

Флаги командной строки

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Исполнитель песочницы

Sandbox Executor — это процесс, который сам по себе не изолирован в песочнице. Это процесс трассировки ptrace, который подключается к Sandboxee (процесс ptrace трассировки). Sandbox Executor также устанавливает и запускает экземпляр Monitor , который отслеживает Sandboxee и предоставляет информацию о состоянии.

Sandbox2 поддерживает три режима выполнения: автономный, Sandbox2 Forkserver и Custom Forkserver. Если вы используете сервер вилки, Sandboxee создается как дочерний процесс Sandbox Executor. Эти режимы подробно описаны здесь.

Песочница

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

,

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

Задействованные технологии

В следующих разделах рассматриваются технологии, составляющие основу Sandbox2.

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

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

  • МПК
  • Сеть (если она явно не отключена путем вызова PolicyBuilder::AllowUnrestrictedNetworking() )
  • Монтирование (с использованием пользовательского представления дерева файловой системы)
  • ПИД
  • Пользователь (если он явно не отключен путем вызова PolicyBuilder::AllowUnsafeKeepCapabilities() )
  • ОТС

Дополнительную информацию о пространствах имен Linux можно найти в Википедии или на соответствующей странице руководства.

МПК

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

Секкомп-БПФ

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

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

Птраце

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

Политика песочницы

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

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

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

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

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

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

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

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

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

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

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

Флаги командной строки

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Исполнитель песочницы

Sandbox Executor — это процесс, который сам по себе не изолирован в песочнице. Это процесс трассировки ptrace, который подключается к Sandboxee (процесс ptrace трассировки). Sandbox Executor также устанавливает и запускает экземпляр Monitor , который отслеживает Sandboxee и предоставляет информацию о состоянии.

Sandbox2 поддерживает три режима выполнения: автономный, Sandbox2 Forkserver и Custom Forkserver. Если вы используете сервер вилки, Sandboxee создается как дочерний процесс Sandbox Executor. Эти режимы подробно описаны здесь.

Песочница

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