След откритата в края на януари уязвимост, позволяваща свързване като потребител root без проверка на паролата, в сървъра telnetd от набора GNU InetUtils бяха идентифицирани няколко начина за повишаване на привилегиите, произтичащи от непълното отстраняване на уязвимостта през 1999 година (CVE-1999-0073).
Уязвимостите са причинени от наличието в telnetd на възможността клиентът да предава променливи на средата на сървъра чрез опцията ENVIRON. Такива променливи на средата се задават и обработват в контекста на процеса telnetd и се предават на неговите стартирани дъщерни процеси, включително на процеса /bin/login, стартиран с права root. Уязвимостта 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», активираща вход без парола (аналог на предаването на флага «-f» на процеса login). Настройката важи за всички потребители, включително 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 година.
Източник: opennet.ru
