Thorsten Kukuk, líder del Equipo de Future Technology de SUSE (Equipo de tecnología futura, desarrolla openSUSE MicroOS y SLE Micr ), quien anteriormente dirigió el proyecto SUSE LINUX Enterprise Server durante 10 años, sugirió deshacerse del archivo /var/run/utmp en distribuciones para abordar completamente el problema Y2038 en Glibc.
Con ello se propone mover todas las aplicaciones que usan utmp, wtmp y lastlog para obtener una lista de usuarios que usan systemd-logind.
El 19 de enero de 2038, se desbordarán los contadores de tiempo de época especificados por el tipo time_t de 32 bits. En Glibc, a pesar de la introducción del tipo time_t de 64 bits, para mantener la compatibilidad con aplicaciones de espacio de usuario de 32 bits, el tipo time_t de 32 bits todavía se usa en algunos casos en plataformas de 64 bits.
Hay dos problemas principales con utmp/utmpx con glibc en, por ejemplo, x86-64:
Se utiliza un campo time_t de 32 bits para la hora, que se desbordará en 2038
Hay problemas de diseño que permiten un ataque DoS ( el bloqueo de utmp/wtmp permite que un usuario sin privilegios niegue el servicio )
Un análisis del segundo problema por parte de los desarrolladores de glibc mostró que sería necesario un demonio adicional que maneje el acceso utmp/utmpx.Aun que hay algunos problemas más…
Uno de esos casos es el archivo /var/run/utmp, que almacena datos sobre los usuarios actualmente conectados al sistema. El campo de tiempo en utmp se establece utilizando un valor time_t de 32 bits.
Se menciona que, simplemente cambiar un campo en utmp con el tiempo de un tipo de 32 bits a uno de 64 bits no funcionará, ya que esto cambiará la Glibc ABI (el tipo cambiará en funciones como login(), getutid() y utmpname()) y rompa la compatibilidad con aplicaciones que usan utmp, incluidas w, who, uptime, login, su, sudo, useradd, systemd, sysvinit, tcsh, xterm display managers, emacs, openssh, qemu, samba, rsyslog, etc.
Debido a la abundancia de posibles escollos y laboriosidad, los desarrolladores de Glibc rechazaron la idea de reemplazar la longitud de bits del tipo time_t en utmp. Por la misma razón, se eliminó la opción de usar el espacio disponible en la estructura utmp para agregar un campo de tiempo adicional de 64 bits.
Además, cambiar la profundidad de bits del tipo en utmp no resuelve otros problemas existentes, por ejemplo, escribir en utmp requiere permisos especiales, lo que requiere que se otorguen privilegios adicionales a los procesos. Otro problema es que la arquitectura utmp permite a los usuarios locales realizar ataques DoS que rompen el servicio utmp mediante la manipulación de bloqueos de archivos, lo que hace imposible estar seguro de que el contenido de utmp refleje el estado real del sistema.
Se propuso usar un proceso en segundo plano adicional para manejar el acceso a utmp, pero para tales tareas ya existe un proceso systemd-logind y no es recomendable iniciar otro proceso especializado (las aplicaciones tendrán que transferir datos a dos controladores al mismo tiempo).
Al mismo tiempo, incluso al resolver el problema con los ataques DoS, el contenido de utmp sigue siendo solo informativo, sin garantizar un reflejo de la realidad.
Por ejemplo, diferentes emuladores de terminales y multiplexores reflejan su estado de manera diferente: ejecutar cinco terminales GNOME dará como resultado que un usuario se refleje en utmp, mientras que ejecutar cinco terminales konsole o xterm en KDE dará como resultado seis. Del mismo modo, el comportamiento de screen y tmux difiere, en el primer caso cada sesión se cuenta como un usuario independiente y en el segundo solo se refleja un usuario para todas las sesiones.
Como resultado, como la solución más simple, se propone transferir todas las aplicaciones para usar el servicio systemd-logind alternativo ya existente y, después de que no haya programas reales que accedan a utmp, dejar de escribir en utmp. Para reemplazar wtmp, se propone preparar API para escribir y leer información sobre los usuarios que usan systemd-journald.
Finalmente, cabe mencionar que la base de código para la próxima versión de systemd 254 ya incluye las funciones necesarias para proporcionar datos utmp de reemplazo a través de libsystemd usando la API sd-login.h o a través de DBUS.
Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.