Следизицата на уязвимостта, открита в края на януари, позволяваща свързване като потребител 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», който активира вход без парола (аналогично на предаването на флага «-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
