Po zjištěné zranitelnosti na konci ledna, která umožňovala přihlášení pod uživatelským jménem root bez kontroly hesla, byly na serveru telnetd z balíku GNU InetUtils odhaleny další způsoby zvýšení privilegií, které byly důsledkem nedostatečného vyřešení zranitelnosti z roku 1999 (CVE-1999-0073).
Zranitelnosti jsou způsobeny tím, že telnetd umožňuje klientovi přenášet proměnné prostředí na server pomocí volby ENVIRON. Tyto proměnné prostředí jsou nastaveny a zpracovávány v kontextu procesu telnetd a předávají se do jím spuštěných podprocesů, včetně procesu /bin/login spuštěného s právy root. Zranitelnost CVE-1999-0073 umožnila telnet klientovi předat proměnnou prostředí LD_LIBRARY_PATH, jejíž nastavení způsobuje načtení uživatelsky zadané sdílené knihovny při spuštění procesu login. Při možnosti nahrávání souborů do systému podporujícího připojení přes protokol telnet může útočník nahrát speciálně vytvořenou knihovnu a zajistit její načtení s právy root.
V telnetd z balíku GNU InetUtils byla zranitelnost odstraněna zakázáním nebezpečných proměnných prostředí filtrováním podle masky „LD_“, „LIBPATH“, „ENV“, „IFS“ a „_RLD_“. Přitom zůstala nezablokována proměnná prostředí „CREDENTIALS_DIRECTORY“, která je zpracovávána při spuštění /usr/bin/login. Pomocí této proměnné prostředí mohl uživatel změnit katalog s nastavením účtů a umístit do nového adresáře soubor login.noauth s hodnotou „yes“, což aktivuje přihlášení bez hesla (analog nastavení příznaku „-f“ procesu login). Toto nastavení platí pro všechny uživatele, včetně root.
Útok spočívá ve vytvoření podadresáře neprivilegovaným uživatelským účtem ve svém domácím adresáři, nahrání souboru login.noauth do něj a pokusu o přihlášení s nastavením proměnné prostředí „CREDENTIALS_DIRECTORY=adresář“ a předáním proměnné prostředí „USER=root“ (v telnetu existuje režim automatického přihlášení, kde se uživatelské jméno nezískává z příkazové řádky, ale je předáváno pomocí proměnné prostředí USER). Příklad exploitů.
Následně byl identifikován další způsob, jak získat root přístup přes telnetd, který souvisí s manipulací s proměnnými prostředí OUTPUT_CHARSET a LANGUAGE zpracovávanými knihovnou GNU gettext, a proměnnou prostředí GCONV_PATH používanou v glibc. Nastavením proměnných prostředí OUTPUT_CHARSET a LANGUAGE může útočník aktivovat v gettext funkčnost převodu znakových sad, která vyvolává funkci iconv_open(). Při provádění funkce iconv_open() při načítání konfiguračního souboru gconv-modules se cesta vypočítává s ohledem na proměnnou prostředí GCONV_PATH. Pomocí podstrčení souboru gconv-modules lze organizovat načítání vlastní sdílené knihovny během výstupu lokalizovaného řetězce procesem login.
CVE identifikátory označeným zranitelnostem zatím nebyly přiděleny. Jako metodou ochrany se zvažuje zavedení whitelistu povolených hodnot („TERM“, „DISPLAY“, „USER“, „LOGNAME“ a „POSIXLY_CORRECT“) s blokováním všech ostatních proměnných prostředí, podobně jako se to provádí s proměnnými prostředí v OpenSSH. Zranitelnosti byly potvrzeny v balíčku GNU InetUtils, implementace serveru telnetd, která se dodává v Debianu, Ubuntu a derivovaných distribucích. Opravy pro GNU InetUtils zatím nejsou k dispozici. V Rocky Linux 9 je dodáván modifikovaný telnetd, který není zranitelný, a místo filtrování nebezpečných proměnných prostředí implementuje kontrolu podle whitelistu. Filtrování podle whitelistu je také implementováno v telnetd ve FreeBSD. V OpenBSD byl telnetd ze systému odstraněn v roce 2005.
Zdroj: opennet.ru
