Выпуск Bubblewrap 0.9, прослойки для создания изолированных окружений

После года разработки опубликована новая версия инструментария для организации работы изолированных окружений Bubblewrap 0.9, используемого для ограничения отдельных приложений непривилегированных пользователей. На практике Bubblewrap применяется проектом Flatpak в качестве прослойки для изоляции запускаемых из пакетов приложений. Код проекта написан на языке Си и распространяется под лицензией LGPLv2+.

Для изоляции используются традиционные для Linux технологии контейнерной виртуализации, основанные на использовании cgroups, пространств имён (namespaces), Seccomp и SELinux. Для выполнения привилегированных операций по настройке контейнера Bubblewrap запускается с правами root (исполняемый файл c suid-флагом) с последующим сбросом привилегий после завершения инициализации контейнера.

Активация в системе пространств имён идентификаторов пользователя (user namespaces), позволяющих использовать в контейнерах собственный отдельный набор идентификаторов, для работы не требуется, так как по умолчанию не работает во многих дистрибутивах (Bubblewrap позиционируется как ограниченная suid-реализация подмножества возможностей user namespaces – для исключения всех идентификаторов пользователей и процессов из окружения, кроме текущего, используются режимы CLONE_NEWUSER и CLONE_NEWPID). Для дополнительной защиты исполняемые под управлением Bubblewrap программы запускаются в режиме PR_SET_NO_NEW_PRIVS, запрещающем получение новых привилегий, например, при наличии флага setuid.

Изоляция на уровне файловой системы производится через создание по умолчанию нового пространства имён точек монтирования (mount namespace), в котором при помощи tmpfs создаётся пустой корневой раздел. В данный раздел при необходимости прикрепляются разделы внешней ФС в режиме “mount –bind” (например, при запуске c опцией “bwrap –ro-bind /usr /usr” раздел /usr пробрасывается из основной системы в режиме только для чтения). Сетевые возможности ограничиваются доступом к loopback-интерфейсу с изоляцией сетевого стека через флаги CLONE_NEWNET и CLONE_NEWUTS.

Ключевым отличием от похожего проекта Firejail, который также использует модель запуска с применением setuid, является то, что в Bubblewrap прослойка для создания контейнеров включает только необходимый минимум возможностей, а все расширенные функции, необходимые для запуска графических приложений, взаимодействия с рабочим столом и фильтрации обращений к Pulseaudio, вынесены на сторону Flatpak и выполняются уже после сброса привилегий. Firejail же объединяет в одном исполняемом файле все сопутствующие функции, что усложняет его аудит и поддержание безопасности на должном уровне.

В новом выпуске:

  • Из пакета с исходными текстами удалены файлы, сгенерированные в Autotools. Для сборки теперь рекомендуется использовать сборочную систему Meson. Опциональная поддержка Autotools пока сохранена, но в будущих выпусках её планируется удалить.
  • Добавлена опция “–argv0” для выставления значения нулевого аргумента командной строки (argv[0] – имя исполняемого файла, например “–argv0 /usr/bin/test”).
  • Опция “–symlink” теперь срабатывает только когда символическая ссылка уже существует и указывает на нужный целевой файл.
  • Документирована опция “–cap-add”, применяемая для выставления capability-флагов, например, “CAP_DAC_READ_SEARCH”.
  • Повышена информативность ошибок, выводимых при сбое монтирования.
  • Упрощён процесс создания unit-тестов.
  • В примерах использования прекращена поддержка старых версий Python.
  • Улучшены операции выделения памяти.

Release. Ссылка here.