Po wykryciu na koniec stycznia luki, która pozwalała na zalogowanie się jako użytkownik root bez weryfikacji hasła, w serwerze telnetd z pakietu GNU InetUtils ujawniono kilka sposobów na podniesienie swoich uprawnień, będących rezultatem niepełnego usunięcia tej luki w 1999 roku (CVE-1999-0073).
Luki są spowodowane obecnością w telnetd możliwości przesyłania zmiennych środowiskowych z klienta na serwer za pomocą opcji ENVIRON. Takie zmienne są ustawiane i przetwarzane w kontekście procesu telnetd oraz przesyłane do uruchamianych przez niego procesów potomnych, w tym uruchamianego z prawami root procesu /bin/login. Luka CVE-1999-0073 umożliwiała klientowi telnet przesłanie zmiennej środowiskowej LD_LIBRARY_PATH, której ustawienie prowadzi do załadowania wskazanej przez użytkownika biblioteki współdzielonej podczas uruchamiania procesu login. W przypadku możliwości ładowania plików w systemie wspierającym połączenia za pomocą protokołu telnet, atakujący może załadować specjalnie przygotowaną bibliotekę i zorganizować jej ładowanie z prawami root.
W telnetd z pakietu GNU InetUtils luka została usunięta poprzez zablokowanie niebezpiecznych zmiennych środowiskowych poprzez filtrację według masek "LD_", "LIBPATH", "ENV", "IFS" oraz "_RLD_". Zablokowana nie została natomiast zmienna środowiskowa "CREDENTIALS_DIRECTORY", przetwarzana podczas uruchamiania /usr/bin/login. Dzięki tej zmiennej użytkownik mógł zmienić katalog z ustawieniami poświadczeń i umieścić w nowym katalogu plik login.noauth o wartości "yes", aktywującym logowanie bez hasła (analogiczne do przesłania do procesu login flagi "-f"). Ustawienie to działa dla wszystkich użytkowników, w tym root.
Atak polega na stworzeniu przez nieuprzywilejowanego użytkownika podkatalogu w swoim katalogu domowym, załadowaniu do niego pliku login.noauth oraz próbie zalogowania się z ustawieniem zmiennej środowiskowej "CREDENTIALS_DIRECTORY=utworzony katalog" oraz przesłaniu zmiennej środowiskowej "USER=root" (w telnet istnieje tryb automatycznego połączenia, w którym nazwa użytkownika jest pobierana nie z wiersza poleceń, lecz przesyłana przez zmienną środowiskową USER). Przykład exploita.
Następnie zidentyfikowano jeszcze jeden sposób uzyskania dostępu do konta root przez telnetd, związany z manipulacją zmiennymi środowiskowymi OUTPUT_CHARSET i LANGUAGE, obsługiwanymi przez bibliotekę GNU gettext, oraz zmienną środowiskową GCONV_PATH, używaną w glibc. Poprzez ustawienie zmiennych środowiskowych OUTPUT_CHARSET i LANGUAGE atakujący może aktywować w gettext funkcjonalność konwersji kodowania znaków, wywołując funkcję iconv_open(). Z kolei, podczas wykonywania funkcji iconv_open() przy ładowaniu pliku konfiguracyjnego gconv-modules, ścieżka jest obliczana z uwzględnieniem zmiennej środowiskowej GCONV_PATH. Poprzez podstawienie pliku gconv-modules można zorganizować ładowanie własnej współdzielonej biblioteki podczas wyjścia z lokalizowanego łańcucha przez proces logowania.
CVE identyfikatory do oznaczonych luk bezpieczeństwa jeszcze nie zostały przypisane. Jako metodę ochrony rozważa się użycie białej listy dozwolonych wartości ("TERM", "DISPLAY", "USER", "LOGNAME" i "POSIXLY_CORRECT") z blokowaniem wszystkich innych zmiennych środowiskowych, podobnie jak ma to miejsce w przypadku zmiennych środowiskowych w OpenSSH. Luki zostały potwierdzone w pakiecie GNU InetUtils, realizacja serwera telnetd, który jest dostarczany w Debianie, Ubuntu i pochodnych dystrybucjach. Poprawki dla GNU InetUtils wciąż nie są dostępne. W Rocky Linux 9 dostarczany jest zmodyfikowany telnetd, który nie jest podatny na te luki, w którym zamiast filtrowania niebezpiecznych zmiennych środowiskowych zastosowano kontrolę przez białą listę. Filtrowanie przez białą listę zostało również zrealizowane w telnetd z pakietu FreeBSD. W OpenBSD telnetd został usunięty z systemu w 2005 roku.
Źródło: opennet.ru
