Hace poco se dio a conocer el descubrimiento de una vulnerabilidad (ya catalogada bajo CVE-2024-28085) bastante particular, y es que el fallo que se encuentra en la utilidad wall del paquete util-linux, permite a un atacante manipular secuencias de escape para afectar las terminales de otros usuarios.
Esta vulnerabilidad llama la atención de muchos, ya que básicamente permite realizar phishing, dado que la utilidad está diseñada para enviar mensajes a terminales, esta vulnerabilidad se aprovecha para engañar y obtener información de otros terminales.
El problema radica en que la utilidad wall bloquea las secuencias de escape en el flujo de entrada, pero no en los argumentos de la línea de comando, lo que posibilita que un atacante utilice secuencias de escape en las terminales de otros usuarios.
Por ejemplo, al ejecutar wall utilizando secuencias de escape que permiten mover el cursor, borrar y reemplazar contenido en la pantalla, un atacante puede simular una solicitud de contraseña de sudo en la terminal de otro usuario. Si el usuario no detecta esta manipulación y proporciona su contraseña, esta aparecerá en el historial de comandos como un comando inexistente (debido a que la contraseña se ingresó directamente en la línea de comandos en lugar de un comando válido).
Cuando se emite una advertencia de que no se encontró el comando ingresado, muchas distribuciones ejecutan el controlador /usr/lib/command-not-found. Este controlador intenta identificar el paquete que contiene el comando faltante y proporciona una pista sobre si se puede instalar. Sin embargo, hay un problema: al iniciar el controlador de command-not-found, se le pasa un comando inexistente como parámetro de la línea de comando. Esto es visible al visualizar los procesos en el sistema, lo que podría ser aprovechado por un atacante para monitorear los procesos en ejecución y determinar la contraseña ingresada por la víctima en la línea de comandos.
Para inducir a un usuario a ingresar una contraseña en respuesta a un mensaje sudo falso, se ha propuesto un truco. Este truco implica rastrear el inicio real de la utilidad sudo en la lista de procesos, esperar a que se complete y realizar un ataque a través de «wall» inmediatamente después. Al manipular las secuencias de escape, un atacante puede reemplazar el mensaje después de la ejecución real de sudo con un mensaje falso de reingreso de contraseña. La víctima podría pensar que cometió un error al ingresar la contraseña y volver a ingresarla, revelando así la contraseña en los argumentos del controlador de «command-not-found».
Algunas personas no han entendido bien en qué escenarios esto podría usarse para atacar a otro usuario. No necesitamos atacar sudo, podemos atacar en cualquier lugar donde el usuario ingrese su contraseña, un ejemplo basico es después de que un usuario inicia sesión usando OpenSSH.
Para llevar a cabo un ataque exitoso, es necesario configurar el modo «mesg» en «y», que viene configurado de forma predeterminada en sistemas como Ubuntu, Debian y CentOS/RHEL. El ataque se ha demostrado con éxito en Ubuntu 22.04 utilizando gnome-terminal en su configuración predeterminada. Sin embargo, en Debian, el ataque es más difícil debido a que el controlador «command-not-found» no está habilitado por defecto. En cuanto a CentOS/RHEL, el ataque no funciona, ya que la utilidad wall se instala sin el indicador setgid y no tiene acceso a las terminales de otros usuarios. Si se utiliza Windows-Terminal, el ataque se puede modificar para cambiar el contenido del portapapeles.
Esta vulnerabilidad ha estado presente en el paquete util-linux desde 2013, luego de que la versión 2.24 introdujera la capacidad de especificar un mensaje en la línea de comando del muro, pero olvidó limpiar las secuencias de escape. Una solución para esta vulnerabilidad se ha incluido en el lanzamiento más reciente de util-linux 2.40, que se publicó ayer. Es importante mencionar que al intentar corregir la vulnerabilidad en la versión util-linux 2.39, se identificó otra vulnerabilidad similar que permite la sustitución de caracteres de control mediante la manipulación de las configuraciones regionales.
Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.