Следом за выявленной в конце января уязвимостью, позволявшей подключиться под пользователем root без проверки пароля, в сервере telnetd из набора GNU InetUtils выявлено несколько способов повышения своих привилегий, ставших следствием неполного устранения уязвимости в 1999 году (CVE-1999-0073).
Уязвимости вызваны наличием в telnetd возможности передачи клиентом переменных окружения на сервер при помощи опции ENVIRON. Подобные переменные окружения выставляются и обрабатываются в контексте процесса telnetd и передаются в запущенные им дочерние процессы, включая запускаемый с правами root процесс /bin/login. Уязвимость CVE-1999-0073 позволяла telnet-клиенту передать переменную окружения LD_LIBRARY_PATH, выставление которой приводит к загрузке указанной пользователем разделяемой библиотеки при запуске процесса login. При возможности загрузки файлов в систему, поддерживающую подключение по протоколу telnet, атакующий может загрузить специально оформленную библиотеку и организовать её загрузку с правами root.
В telnetd из набора GNU InetUtils уязвимость была устранена путём запрета опасных переменных окружения через фильтрацию по маскам "LD_", "LIBPATH", "ENV", "IFS" и "_RLD_". При этом незаблокированной оказалась переменная окружения "CREDENTIALS_DIRECTORY", обрабатываемая при запуске /usr/bin/login. При помощи данной переменной окружения пользователь мог изменить каталог с настройками учётных данных и разместить в новом каталоге файл login.noauth со значением "yes", активирующим вход без пароля (аналог передачи процессу login флага "-f"). Настройка действует для всех пользователей, включая root.
Атака сводится к созданию непривилегированным пользователем подкаталога в своём домашнем каталоге, загрузки в него файла login.noauth и попытки входа с выставлением переменной окружения "CREDENTIALS_DIRECTORY=созданный каталог" и передачей переменной окружения "USER=root" (в telnet имеется режим автоматического подключения, в котором имя пользователя берётся не из командной строки, а передаётся через переменную окружения USER). Пример эксплоита.
Следом выявлен ещё один способ получения root-доступа через telnetd, связанный с манипуляцией переменными окружения OUTPUT_CHARSET и LANGUAGE, обрабатываемыми библиотекой GNU gettext, и переменной окружения GCONV_PATH, используемой в glibc. Через выставление переменных окружения OUTPUT_CHARSET и LANGUAGE атакующий может активировать в gettext функциональность преобразования кодировки символов, вызывающей функцию iconv_open(). В свою очередь, при выполнении функции iconv_open() при загрузке конфигурационного файла gconv-modules, путь вычисляется с учётом переменной окружения GCONV_PATH. Через подстановку файла gconv-modules можно организовать загрузку собственной разделяемой библиотеки во время вывода локализированной строки процессом login.
CVE-идентификаторы отмеченным уязвимостям пока не присвоены. В качестве метода защиты рассматривается задействование белого списка допустимых значений ("TERM", "DISPLAY", "USER", "LOGNAME" и "POSIXLY_CORRECT") с блокированием всех остальных переменных окружения, по аналогии с тем как осуществляется работа с переменными окружения в OpenSSH. Уязвимости подтверждены в пакете GNU InetUtils, реализация сервера telnetd из которого поставляется в Debian, Ubuntu и производных дистрибутивах. Исправления для GNU InetUtils пока отсутствуют. В Rocky Linux 9 поставляется не подверженный уязвимости модифицированный telnetd, в котором вместо фильтрации опасных переменных окружения включена проверка по белому списку. Фильтрация по белому списку также реализована в telnetd из состава FreeBSD. В OpenBSD telnetd исключён из системы в 2005 году.
Источник: https://www.opennet.ru/opennews/art.shtml?num=64869





