Уязвимость повышения привилегий в Sudo chroot (CVE-2025-32463)

Переводчик Google

Введение​

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
Примечание: устаревшие версии (<= 1.8.32) не уязвимы, поскольку функция chroot в них отсутствует.

Эксплуатация подтверждена на:​

  • 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
и наличии скомпилированной вредоносной libnss_/woot1337.so.2 возможна загрузка этой библиотеки и выполнение произвольного кода как root.


Пример 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-скрипта​

  1. Создаёт временную директорию и chroot-окружение.
  2. Компилирует вредоносную библиотеку, содержащую функцию woot, устанавливающую uid=0 и запускающую /bin/bash.
  3. Подменяет nsswitch.conf для использования этой библиотеки.
  4. Запускает 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 Тодду Миллеру за сотрудничество в решении данной проблемы.

Источник
 
Назад
Сверху Снизу