Введение
Sudo — это консольная утилита, установленная на Linux-системах, позволяющая разрешённым пользователям выполнять команды от имени суперпользователя (root) или другого пользователя, согласно политике безопасности.Она широко применяется для реализации модели минимально необходимых привилегий, позволяя делегировать задачи, требующие повышенных прав, без разглашения пароля root, а также создаёт журнал действий в системном логе.
Команда Stratascale Cyber Research Unit (CRU) обнаружила две локальные уязвимости повышения привилегий в Sudo. Эти уязвимости могут привести к получению прав root на затронутой системе.
Исследование фокусировалось на редко используемых опциях командной строки. В этой публикации рассматривается, как опция chroot в Sudo может быть использована любым локальным пользователем для повышения привилегий до root, даже если для этого пользователя в системе не определены правила Sudo.
Устранение
Установите sudo версии 1.9.17p1 или выше.Подробности доступны на странице advisories.
Влияние
По умолчанию конфигурация Sudo уязвима. Хотя проблема связана с функцией chroot, для её эксплуатации не требуется наличие правил Sudo для пользователя.Таким образом, любой локальный непривилегированный пользователь может потенциально повысить свои права до root, если используется уязвимая версия.
Затронутые версии (не все протестированы):
- Stable 1.9.14 – 1.9.17
Эксплуатация подтверждена на:
- Ubuntu 24.04.1: Sudo 1.9.15p5, 1.9.16p2
- Fedora 41 Server: Sudo 1.9.15p5
Рекомендации для администраторов и синих команд (Blue Team)
- Установите последние пакеты sudo для вашей системы.
- Обходных решений не существует.
- Опция chroot теперь объявлена устаревшей начиная с 1.9.17p1. Рекомендуется избегать её использования, поскольку при неправильной реализации она может снизить безопасность.
- Проверьте, используется ли chroot в вашей среде:
- Просмотрите все правила Sudo в /etc/sudoers и файлы в /etc/sudoers.d.
- Если правила хранятся в LDAP, используйте ldapsearch для их выгрузки.
- Ищите использование опции runchroot= или директивы CHROOT= в индивидуальных правилах.
- Анализируйте логи syslog на наличие записей Sudo с использованием chroot (они будут содержать строку CHROOT=).
Введение в chroot в Sudo
Системный вызов chroot(2) и команда chroot(8) ограничивают доступ процесса только тем файлам и каталогам, которые находятся в новом корневом каталоге.Например, на SFTP/FTP-серверах chroot используется для ограничения доступа пользователей их домашними директориями.
Однако, chroot не является надёжной границей безопасности. В man-странице Linux по chroot(2) прямо говорится:
В Sudo chroot реализован через опции -R <директория> или –chroot=<директория>, чтобы сменить корневой каталог перед запуском команды. Это малораспространённая функция, необходимая в отдельных сценариях."Этот вызов меняет лишь один элемент в процессе разрешения путей и больше ничего. Он не предназначен для обеспечения безопасности, полной изоляции процессов или ограничения системных вызовов."
Пример правила Sudo с chroot
В тесте учётной записи lowpriv разрешено выполнять /bin/bash в окружении /web без передачи пути через командную строку. Sudo само применяет chroot к /web перед запуском bash.
Bash:
lowpriv ALL = CHROOT=/web /bin/bash
При запуске через Sudo:
Код:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 160095 root cwd DIR 252,0 4096 1048596 /web
bash 160095 root rtd DIR 252,0 4096 1048596 /web
bash 160095 root txt REG 252,0 1446024 1048604 /web/bin/bash
bash 160095 root mem REG 252,0 2125328 1048600 /web/lib/x86…gnu/libc.so.6
bash 160095 root mem REG 252,0 208328 1048601 /web/lib/x86…libtinfo.so.6
bash 160095 root mem REG 252,0 236616 1048602 /web/lib64/ld-…64.so.2
При этом базовые команды (например, ls, find) отсутствуют, если их не скопировать в chroot-среду.
Bash:
lowpriv@prod:~$ sudo /bin/bash
bash-5.2# cd /
bash-5.2# ls
bash: ls: command not found
bash-5.2# find .
bash: find: command not found
bash-5.2# echo *
bin lib lib64
bash-5.2# echo bin/*
bin/bash
Если в конфигурации sudoers используется runchroot=*, пользователь может сам указать директорию через -R.
CVE-2025-32463: повышение привилегий через chroot
Уязвимость была внедрена в Sudo v1.9.14 (июнь 2023) при обновлении логики сопоставления команд с chroot.Суть проблемы:
Позволяя непривилегированному пользователю вызывать chroot() на доступный для записи и недоверенный путь, Sudo создаёт риск выполнения произвольного кода с правами root. Многие приложения (например, SSH) специально блокируют chroot в директории, не принадлежащей root.
В процессе Sudo вызывает chroot() несколько раз, даже если у пользователя нет соответствующего правила. Это происходит через функции pivot_root() и unpivot_root(), которые в процессе инициируют NSS-запросы (Name Service Switch), в результате чего загружаются библиотеки из файлов /etc/nsswitch.conf внутри chroot-среды.
Пример эксплуатации
При подмене nsswitch.conf в chroot-среде на:
Bash:
passwd: /woot1337
Пример PoC (Ubuntu 24.04.2 LTS, Sudo v1.9.15p5)
Bash:
lowpriv@prod:~/CVE-2025-32463$ id
uid=1001(lowpriv) gid=1001(lowpriv) groups=1001(lowpriv)
lowpriv@prod:~/CVE-2025-32463$ sudo -l
[sudo] password for lowpriv:
Sorry, user lowpriv may not run sudo on prod.
lowpriv@prod:~/CVE-2025-32463$ ./sudo-chwoot.sh
woot!
root@prod:/# id
uid=0(root) gid=0(root) groups=0(root),1001(lowpriv)
Суть PoC-скрипта
- Создаёт временную директорию и chroot-окружение.
- Компилирует вредоносную библиотеку, содержащую функцию woot, устанавливающую uid=0 и запускающую /bin/bash.
- Подменяет nsswitch.conf для использования этой библиотеки.
- Запускает sudo -R woot woot, что вызывает загрузку библиотеки и открытие root-shell.
Исправление
Патч удаляет вызовы pivot_root() и unpivot_root(), возвращая логику до изменений 1.9.14. Теперь chroot() не вызывается при сопоставлении команд.При установленном патче эксплуатация PoC завершается с ошибкой, поскольку chroot больше не используется в этой фазе.
Хронология раскрытия
- 01.04.2025: отправка отчёта мейнтейнеру Sudo (Todd Miller).
- 03.04.2025: подтверждение получения, начало обсуждения.
- 06.04.2025: предложен патч для CVE-2025-32462.
- 07-08.04.2025: запрошены и получены CVE-идентификаторы.
- 09.06.2025: предложен патч для CVE-2025-32463.
- 10.06.2025: подтверждение работоспособности патча и согласование срока раскрытия.
- 30.06.2025: публичное раскрытие и публикация блога.
Благодарность
Уязвимость CVE-2025-32463 была обнаружена Ричем Мирчем (Rich Mirch) из Stratascale Cyber Research Unit. Команда CRU выражает благодарность мейнтейнеру Sudo Тодду Миллеру за сотрудничество в решении данной проблемы.Источник