Недавно они опубликовали новость о том, что была обнаружена уязвимость (уже указан в CVE-2022-31214) в песочнице приложения Firejail, подробно описано, что обнаруженная уязвимость может позволить локальному пользователю стать пользователем root в хост-системе.
Firejail использует механизм пространств имен, AppArmor и фильтрацию системных вызовов (seccomp-bpf) в Linux для изоляции, но требует повышенных привилегий для настройки изолированного выпуска, который он получает путем привязки к утилите suid root flag или запуска с помощью sudo.
Уязвимость связана с ошибкой в логике опции «–join=». », предназначен для подключения к уже запущенной изолированной среде (аналогично команде входа в систему для среды песочницы) со средой, определяемой идентификатором запущенного в ней процесса. На этапе перед запуском firejail определяет привилегии указанного процесса и применяет их к новому процессу, который присоединяется к среде с параметром «–join».
Перед подключением, проверяет, запущен ли указанный процесс в среде firejail. Эта проверка оценивает наличие файла /run/firejail/mnt/join. Чтобы воспользоваться уязвимостью, злоумышленник может имитировать фиктивную неизолированную среду firejail используя пространство имен монтирования, а затем подключаясь к нему с помощью параметра «--join».
Если в конфигурации не включен режим запрета получения дополнительных привилегий в новых процессах (prctl NO_NEW_PRIVS), то firejail подключит пользователя к фиктивной среде и попытается применить пользовательскую конфигурацию namespace идентификаторов пользователей (namespace user) процесса init ( ПИД 1).
Большая часть логики функции соединения находится в исходном коде. из файла `src/firejail/join.c`. Критические участки кода выполняются с повышенные привилегии (действующий UID 0). Идентификатор процесса, переданного в виде команды аргумент строки проверяется, чтобы определить, является ли он rконтейнера и определить некоторые его свойства, которые Это также относится к новому процессу входа.
Основные критерии принятия решения о присоединении к целевому процессу удачным является наличие файла в пространстве имён монтирования таргета, процесс находится в /run/firejail/mnt/join. Эта проверка выполняется на fФункция `is_ready_for_join()`. Файл открывается с помощью lФлаги `O_RDONLY|O_CLOEXEC` и результат трассировки `fstat()` должны соответствовать следующим требованиям:
– файл должен быть обычным файлом.
– файл должен принадлежать пользователю с идентификатором 0 (как видно из начального пользователя
пространство имен).
– размер файла должен быть 1 байт.
В результате процесс, подключенный через «firejail --join», окажется в пространстве имен исходный идентификатор пользователя пользователя с неизменными привилегиями, но в другом месте точки монтирования, полностью контролируемом атакующим.
Полученная «присоединенная» оболочка теперь будет жить у начального пользователя.
пространство имен, сохраняя исходные привилегии обычного пользователя, однако пространство имен монтирования будет контролироваться злоумышленником. В качестве
конфигурация nonewprivs не применялась, теперь злоумышленник может
запускать программы setuid-root в этом пространстве имен монтирования
В частности, злоумышленник может запускать программы setuid-root в пространстве созданной им точки монтирования, что позволяет ему, например, изменить конфигурацию /etc/sudoers или параметры PAM в своей файловой иерархии и получить возможность запускать команды от имени пользователя root. используя sudo или его утилиты.
Напоследок стоит отметить, что разработан функциональный эксплойт, протестированный на актуальных версиях openSUSE, Debian, Arch, Gentoo и Fedora с установленной утилитой firejail.
Проблема была исправлена в версии firejail 0.9.70. В качестве исправления безопасности вы можете установить для конфигурации (/etc/firejail/firejail.config) значение «no join» и «force-nonewprivs yes».
В конце концов если вам интересно узнать об этом больше, вы можете проверить подробности в по следующей ссылке.