Detectaron una vulnerabilidad en oath-toolkit permitía obtener privilegios root
Hace pocos días se dio a conocer la noticia de que se ha identificado una vulnerabilidad crítica, registrada como CVE-2024-47191, en el módulo pam_oath PAM del paquete oath-toolkit, utilizado para la autenticación de dos factores mediante contraseñas de un solo uso (OTP).
Sobre la vulnerabilidad se menciona que surge debido al modo en el que el módulo pam_oath maneja los archivos de clave OATH. Originalmente, estos archivos se almacenaban en /etc/users.oath, accesibles solo por el usuario root. Sin embargo, con la versión 2.6.7, además de que se agregó la opción de que los usuarios pudieran almacenaran estos archivos en sus propios directorios de inicio.
Este «pequeño cambio» permitió a los usuarios sin privilegios modificar sus propios archivos de claves, pero pam_oath no ajustaba sus privilegios al acceder a estos archivos, continuando con prácticas inseguras que asumían que los archivos estaban en un directorio protegido. Cabe mencionar que esta vulnerabilidad solo afecta las configuraciones que permiten que los archivos de claves se almacenen en directorios de inicio, como cuando se configura PAM.
La vulnerabilidad radica en que pam_oath sobrescribe el archivo de clave después de cada autenticación exitosa para evitar el uso repetido de la misma contraseña de un solo uso. Este proceso involucra la creación de un archivo de bloqueo, la escritura del contenido actualizado en un archivo temporal con la extensión .new, y luego este reemplaza el archivo original con el nuevo. Sin embargo, este archivo .new es creado y escrito por un proceso con privilegios root, pero no se verifica adecuadamente su existencia previa ni su seguridad.
El ataque requiere que la configuración «usersfile» tenga un componente de archivo o ruta que se encuentre en una ubicación vulnerable. La configuración común con una configuración protegida contra escritura y lectura usersfile=/etc/users.oathno es vulnerable.
Se menciona que si los archivos clave están en el directorio del sistema, como tal este proceso no presenta problemas. Pero con el soporte para directorios de inicio de usuarios, se introduce una vulnerabilidad explotable, ya que un atacante puede crear un enlace simbólico llamado oath.secrets.new y apuntarlo a cualquier archivo del sistema. Como resultado, tras una autenticación exitosa, este archivo de sistema puede ser sobrescrito, lo que potencialmente otorga acceso root al atacante
Decidimos desarrollar un parche que tenga en cuenta tantos casos de uso como sea posible, asegurando todas las operaciones y manteniendo la compatibilidad con versiones anteriores. Con el parche, la ruta del archivo de usuarios se recorre de forma segura utilizando la familia*at de llamadas del sistema. Los privilegios se eliminarán para el propietario del archivo de usuarios como medida de seguridad adicional. El mecanismo de bloqueo se ha corregido para cubrir todos los accesos al archivo de usuarios.
En la publicación donde se detalla la vulnerabilidad también se menciona que para explotar la vulnerabilidad, un atacante puede crear un enlace simbólico que apunte al archivo /etc/shadow, que almacena información crítica sobre las contraseñas del sistema. Después de una autenticación exitosa a través de pam_oath, el archivo /etc/shadow será sobrescrito con la lista de claves OATH del atacante. Además, pam_oath sincronizará los permisos y el propietario de /etc/shadow con los del archivo users.oath, lo que significa que el archivo /etc/shadow pasará a ser propiedad del usuario atacante. Con este acceso, el atacante puede modificar /etc/shadow para crear credenciales de acceso root, logrando así el control total del sistema.
El parche emplea características específicas de Linux (por ejemplo, vincular archivos desde /proc/self/fd), por lo que ya no funciona para sistemas que no sean Linux. La descripción del parche y los comentarios del código contienen más pistas sobre las decisiones individuales tomadas en este parche.
Finalmente si estás interesado en poder conocer más al respecto, debes saber que la vulnerabilidad apareció en la versión 2.6.7 y fue solucionada en la versión 2.6.12. En cuanto a los detalles del parche y las actualizaciones de seguridad, pueden seguir el proceso en las diferentes distribuciones como Debian, Ubuntu, RHEL, SUSE/openSUSE y Arch.