Пространства имён (namespace) в ядре Linux позволяют привязать к разным процессам разные представления ресурсов, например, процесс может быть помещён в окружение со своими точками монтирования, IPC, PID и сетевым стеком, которые не пересекаются с окружением других процессов. При помощи «user namespace» непривилегированный процесс в контексте изолированного контейнера может обращаться к подсистемам ядра, в обычных условиях требующих повышенных привилегий, но оставаться при этом непривилегированным вне контейнера.
Проблема в том, что изначально многие подсистемы ядра были написаны с расчётом на то, что работать с ними может только пользователь root, и проблемы в подобных подсистемах не рассматривались как уязвимость, так как непривилегированные пользователи не могли к ним обращаться. После того, как появился «user namespace» ошибки в подобных подсистемах стали иметь иное значение — эксплуатация уязвимости в ядре из изолированного окружения приводила к выполнению кода на уровне ядра и позволяла получить привилегированный доступ ко всей системе.
В Ubuntu в качестве дополнительного уровня защиты была реализована гибридная схема, выборочно оставляющая некоторым программам возможность создавать «user namespace» при наличии профиля AppArmor с правилом «allow userns create» или прав CAP_SYS_ADMIN. Подобная защита позволяла уменьшить риск эксплуатации уязвимостей в подсистемах ядра (сократить поверхность атаки), но при этом сохранить возможность полноценной sendbox-изоляции в избранных приложениях.
Создание «user namespace» с привилегированным доступом внутри контейнера представляет угрозу только если в системе не установлены все доступные обновления и в ядре присутствует известная неисправленная уязвимость. Выявлено три способа обхода механизма ограничения доступа к «user namespace», позволяющих непривилегированному локальному пользователю создать «user namespace» c привилегиями администратора внутри, достаточными для выполнения эксплоитов, требующих прав CAP_SYS_ADMIN или CAP_NET_ADMIN:
- Атакующий может использовать утилиту aa-exec, входящую в базовую поставку, для применения к себе имеющихся в системе профилей AppArmor, среди прочего и тех, что разрешают доступ к «user namespace». Например, можно применить к своему процессу профили от chrome, flatpak и trinity.
$ aa-exec -p trinity -- unshare -U -r -m /bin/sh
- Атакующий может запустить командную оболочку из пакета busybox, поставляемого по умолчанию и снабжённого профилем AppArmor, допускающим создание «user namespace».
$ busybox sh ~$ /usr/bin/unshare -U -r -m /bin/sh
- Атакущий может использовать переменную окружения LD_PRELOAD для загрузки своей библиотеки в контексте любой программы, имеющей AppArmor-профиль для доступа к «user namespace». Например, подобные права имеет файловый менеджер nautilus в Ubuntu Desktop.
LD_PRELOAD=./shell.so /usr/bin/nautilus
Для блокирования найденных лазеек разработчики Ubuntu рекомендуют отключить возможность изменения профилей AppArmor утилитой aa-exec, выставив настройку «sysctl kernel.apparmor_restrict_unprivileged_unconfined=1». Также рекомендовано деактивировать профили AppArmor у приложений, имеющих доступ к «user namespace». В поставке по умолчанию подобные профили присутствуют у busybox и nautilus, а для проверки наличия отдельно установленных программ с подобными правами можно использовать команду «sudo aa-status —filter.mode=unconfined». Для отключения AppArmor-профилей busybox и nautilus (если не требуется использование утилит busybox с «user namespace» и можно обойтись без генерации миниатюр в nautilus) следует использовать команды:
sudo ln -s /etc/apparmor.d/busybox /etc/apparmor.d/disable sudo apparmor_parser -R /etc/apparmor.d/busybox sudo ln -s /etc/apparmor.d/nautilus /etc/apparmor.d/disable sudo apparmor_parser -R /etc/apparmor.d/nautilus
Дополнительно можно отметить раскрытие сведений об уязвимости (CVE-2025-0927) в драйвере HFS+, позволяющей получить root-привилегии в системе. Проблема вызвана переполнением буфера, возникающем при обработке специально сформированных образов ФС. Для эксплуатации уязвимости требуется доступ к созданию «user namespace» или монтированию дисковых образов (например, пользователям Ubuntu с активным локальным сеансом polkit предоставляет право создания loop-устройств и монтирования блочных устройств, применяемые для автоподключения USB Flash). Проблема проявляется только в ядрах Linux до версии 6.12. Опубликован рабочий эксплоит, использование которого продемонстрировано в Ubuntu 22.04 с ядром 6.5.0-18-generic.
Источник: http://www.opennet.ru/opennews/art.shtml?num=62970