Tras la vulnerabilidad detectada a finales de enero que permitía conectarse como usuario root sin verificar la contraseña, se identificaron varios métodos de elevación de privilegios en el servidor telnetd del conjunto GNU InetUtils, resultado de la solución incompleta de la vulnerabilidad en 1999 (CVE-1999-0073).
Las vulnerabilidades se deben a la capacidad del telnetd para transmitir variables de entorno desde el cliente al servidor a través de la opción ENVIRON. Estas variables de entorno se establecen y procesan en el contexto del proceso telnetd y se transmiten a sus procesos hijos, incluido el proceso /bin/login que se ejecuta con privilegios de root. La vulnerabilidad CVE-1999-0073 permitía al cliente telnet transmitir la variable de entorno LD_LIBRARY_PATH, cuya configuración lleva a la carga de la biblioteca compartida especificada por el usuario al iniciar el proceso login. Si se permite cargar archivos en un sistema que soporte la conexión por el protocolo telnet, un atacante puede cargar una biblioteca diseñada específicamente y organizar su carga con privilegios de root.
En telnetd del conjunto GNU InetUtils, la vulnerabilidad fue corregida prohibiendo las variables de entorno peligrosas mediante filtrado por máscaras 'LD_', 'LIBPATH', 'ENV', 'IFS' y '_RLD_'. No obstante, la variable de entorno 'CREDENTIALS_DIRECTORY', procesada al iniciar /usr/bin/login, no fue bloqueada. Mediante esta variable de entorno, un usuario podía cambiar el directorio de configuración de credenciales y colocar en el nuevo directorio un archivo login.noauth con el valor 'yes', que activa el inicio de sesión sin contraseña (equivalente a pasar la bandera '-f' al proceso login). Esta configuración aplica a todos los usuarios, incluido root.
El ataque consiste en que un usuario sin privilegios cree un subdirectorio en su directorio personal, cargue un archivo login.noauth en él y trate de iniciar sesión estableciendo la variable de entorno 'CREDENTIALS_DIRECTORY=directorio creado' y pasando la variable de entorno 'USER=root' (en telnet hay un modo de conexión automática, en el cual el nombre de usuario no se toma de la línea de comandos, sino que se pasa a través de la variable de entorno USER). Ejemplo de exploit.
Se ha identificado otro método para obtener acceso root a través de telnetd, relacionado con la manipulación de las variables de entorno OUTPUT_CHARSET y LANGUAGE, procesadas por la biblioteca GNU gettext, así como la variable de entorno GCONV_PATH, utilizada en glibc. Al establecer las variables de entorno OUTPUT_CHARSET y LANGUAGE, el atacante puede activar en gettext la funcionalidad de conversión de juegos de caracteres que llama a la función iconv_open(). A su vez, al ejecutar la función iconv_open() al cargar el archivo de configuración gconv-modules, la ruta se calcula teniendo en cuenta la variable de entorno GCONV_PATH. Mediante la sustitución del archivo gconv-modules, se puede organizar la carga de una biblioteca compartida personalizada durante la salida de una cadena localizada del proceso login.
Los identificadores CVE para las vulnerabilidades señaladas aún no se han asignado. Como método de protección se está considerando la implementación de una lista blanca de valores permitidos («TERM», «DISPLAY», «USER», «LOGNAME» y «POSIXLY_CORRECT»), bloqueando todas las demás variables de entorno, de manera similar a cómo funciona con las variables de entorno en OpenSSH. Las vulnerabilidades han sido confirmadas en el paquete GNU InetUtils, específicamente en telnetd que se distribuye en Debian, Ubuntu y sus derivadas. Las correcciones para GNU InetUtils aún están ausentes. servidores En Rocky Linux 9 se distribuye una versión modificada de telnetd que no es vulnerable, en la que, en lugar de filtrar las variables de entorno peligrosas, se ha implementado una comprobación mediante la lista blanca. La filtración mediante la lista blanca también se ha implementado en el telnetd que forma parte de FreeBSD. En OpenBSD, telnetd fue excluido del sistema en 2005.
Fuente: opennet.ru
