Выявлена возможность обхода ограничений доступа к «user namespace» в Ubuntu

Исследователи безопасности из компании Qualys выявили три способа обхода применяемых в Ubuntu ограничений доступа к пространству имён идентификаторов пользователя (user namespace). Начиная с выпуска 23.10 в Ubuntu применяется дополнительный слой изоляции, не позволяющий обычным непривилегированным пользователям создавать «user namespace». Сам по себе доступ к «user namespace» не является уязвимостью и многие дистрибутивы предоставляют его из коробки, так как он требуется в системах контейнерной изоляции и используется для sendbox-ограничений (например применяется для sandbox-изоляции браузеров).

Пространства имён (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