Для FreeBSD предложена реализация механизма изоляции приложений, напоминающего развиваемые проектом OpenBSD системные вызовы plegde и unveil. Изоляция в plegde осуществляется через запрет обращения к неиспользуемым в приложении системным вызовам, а в unveil через выборочное открытие доступа только для отдельных файловых путей, с которыми может работать приложение. Для приложения формируется подобие белого списка системных вызовов и файловых путей, а все остальные вызовы и пути запрещаются.
Отличие развиваемого для FreeBSD аналога plegde и unveil сводится к предоставлению дополнительной прослойки, позволяющей изолировать приложения без внесения изменений в их код или при минимальных изменениях. Напомним, что в OpenBSD plegde и unveil нацелены на тесную интеграцию с базовым окружением и применяются через добавление специальных аннотаций в код каждого приложения. Для упрощения организации защиты фильтры позволяют обойтись без детализации на уровне отдельных системных вызовов и манипулировать классами системных вызовов (ввод/вывод, чтение файлов, запись файлов, сокеты, ioctl, sysctl, запуск процессов и т.п.). Функции ограничения доступа могут вызываться в коде приложения по мере выполнения тех или иных действий, например, доступ к сокетам и файлам может закрываться после открытия нужных файлов и установки сетевого соединения.
Автор порта plegde и unveil для FreeBSD намерен предоставить возможность изоляции произвольных приложений, для чего предложена утилита curtain, позволяющая применять к приложениям правила, определённые в отдельном файле. Предложенная конфигурация включает файл с базовыми настройками, определяющими классы системных вызовов и типовые файловые пути, специфичные для определённых применений (работа со звуком, сетевое взаимодействие, вывод в лог и т.п.), а также файл с правилами доступа конкретных приложений.
Утилита curtain может применяться для изоляции большинства немодифицированных утилит, серверных процессов, графических приложений и даже целых сеансов рабочего стола. Поддерживается совместное использование curtain с механизмами изоляции, предоставляемыми подсистемами Jail и Capsicum. Также возможна организация вложенной изоляции, когда запускаемые приложения наследуют выставленные родительскому приложению правила, дополняя их отдельными ограничениями. Некоторые операции ядра (средства отладки, POSIX/SysV IPC, PTYs) дополнительно защищаются при помощи механизма барьеров, не позволяющего обращаться к объектам ядра, созданным не текущим или родительским процессом.
Процесс может самостоятельно настроить собственную изоляцию при помощи вызова curtainctl или используя предоставляемые библиотекой libcurtain функции plegde() и unveil(), аналогичные подобным функциям из OpenBSD.
Для отслеживания блокировок в процессе работы приложения предусмотрен sysctl ‘security.curtain.log_level’. Доступ к протоколам X11 и Wayland включается отдельно через указание при запуске curtain опций “-X”/”-Y” и “-W”, но поддержка графических приложений ещё не достаточно стабилизирована и имеет ряд нерешённых проблем (проблемы в основном проявляются при использовании X11, а поддержка Wayland реализована значительно лучше). Пользователи могут добавить дополнительные ограничения через создание локальных файлов с правилами (~/.curtain.conf). Например, для разрешения записи из Firfox только в каталог ~/Downloads/ можно добавить секцию “[firefox]” с правилом “~/Downloads/ : rw +”.
Реализация включает в себя модуль ядра mac_curtain для мандатного контроля доступа (MAC, Mandatory Access Control), набор патчей для ядра FreeBSD с реализацией необходимых обработчиков и фильтров, библиотеку libcurtain для использования функций plegde и unveil в приложениях, утилиту curtain, примеры файлов конфигурации, набор тестов и патчи для некоторых программ в пространстве пользователя (например, для использования $TMPDIR с целью унификации работы с временными файлами). По возможности автор намерен свести к минимуму число изменений, для которых требуется применение патчей к ядру и приложениям.