Múltiples problemas de seguridad descubiertos en GNU Screen
(openwall.com)- Una revisión de seguridad de GNU Screen confirmó, con foco en Screen 5.0.0 y las instalaciones setuid-root, escalamiento local de privilegios, secuestro de TTY, exposición de información, condiciones de carrera en el envío de señales y un bloqueo al enviar comandos
- El más grave, CVE-2025-23395, permite que
logfile_reopen()procese rutas proporcionadas por el usuario con privilegios de root, lo que posibilita crear archivos propiedad de root en ubicaciones arbitrarias o agregar logs a archivos existentes - También se revelaron como problemáticos comportamientos antiguos del modo multiusuario:
Attach()cambia temporalmente la TTY a 0666, lo que habilita lectura y escritura por otros usuarios e inyección de entrada - El riesgo por distribución varía según el método de instalación: Arch Linux y NetBSD 10.1 entregan Screen 5.0.0 como setuid-root, por lo que quedan muy expuestas a las principales vulnerabilidades
- La recomendación actual es no instalar Screen como setuid-root; la función multiusuario necesita opt-in basado en grupos de confianza, reducción de privilegios por defecto, elevación limitada de privilegios y limpieza de variables de entorno
Contexto de la divulgación y parches
- En julio de 2024, el mantenedor upstream de Screen solicitó una revisión de la base de código actual, y la revisión de seguridad real comenzó en enero de 2025
- La revisión encontró en la actualización principal Screen 5.0.0 un exploit local de root que afecta a distribuciones con setuid-root
- Además, se confirmaron problemas de menor gravedad, algunos de los cuales también afectan a Screen 4.9.1 y versiones anteriores, todavía presentes en muchas distribuciones
- Los problemas se compartieron en la lista de correo distros el 30 de abril de 2025 y se divulgaron públicamente el 12 de mayo de 2025
- El reporte adjuntó paquetes de parches por versión
Configuración de Screen y modo multiusuario
- Screen 5.0.0 se publicó upstream como release principal en agosto de 2024, y Arch Linux, Fedora 42 y NetBSD 10.1 ofrecen esta versión
- Muchas distribuciones Linux y UNIX seguían usando Screen 4.9.1 al momento de redactar el reporte
- El modo multiusuario de Screen permite, con las credenciales adecuadas, adjuntarse a sesiones de Screen propiedad de otros usuarios
- Esta función solo está disponible cuando Screen está instalado con el bit setuid-root
- Como el complejo código de Screen se ejecuta con privilegios de root, aumenta la superficie de ataque
- Entre los sistemas revisados, Arch Linux, FreeBSD y NetBSD instalan Screen como setuid-root
- En Gentoo Linux, el bit setuid-root se aplica si está configurada la USE flag
"multiuser" - Algunas distribuciones usan setgid en lugar de setuid
- El valor predeterminado de Gentoo Linux es setgid-utmp, lo que permite a Screen crear registros de inicio de sesión en la base de datos
utmpde todo el sistema - Fedora Linux usa setgid-screen, lo que permite a Screen colocar sockets en el directorio de todo el sistema
/run/screen
- El valor predeterminado de Gentoo Linux es setgid-utmp, lo que permite a Screen crear registros de inicio de sesión en la base de datos
CVE-2025-23395: exploit local de root en logfile_reopen()
- CVE-2025-23395 afecta a Screen 5.0.0 cuando se ejecuta con privilegios setuid-root
- La función
logfile_reopen()no reduce privilegios al procesar rutas proporcionadas por el usuario - Un usuario sin privilegios puede crear en ubicaciones arbitrarias archivos con las siguientes propiedades
- Propietario:
root - Grupo: el grupo real del usuario que invoca
- Modo de archivo:
0644
- Propietario:
- Los archivos ya existentes también pueden explotarse
- Los datos escritos en el PTY de Screen se agregan a ese archivo
- El modo y la propiedad del archivo existente no se modifican
- Screen reduce privilegios correctamente cuando abre por primera vez el archivo de log, pero aparece una posibilidad de escalamiento de privilegios en el momento en que decide que debe volver a abrir el archivo de log
- En la comprobación
stolen_logfile(), si el link count del archivo de log original llega a 0 o su tamaño cambia de forma inesperada, se llama alogfile_reopen() - Un usuario sin privilegios puede provocar intencionalmente esta condición
- El patch 0001 para Screen 5.0.0 reintroduce el manejo seguro de archivos durante la reapertura del archivo de log
- Este problema se originó cuando se eliminó
lf_secreopen()en el antiguo commit441bca708bd, y ese cambio se incluyó en el release 5.0.0
CVE-2025-46802: secuestro de TTY durante attach a sesiones multiusuario
- CVE-2025-46802 ocurre en la función
Attach()cuando está configurado el flagmultiattach - Al hacer attach a una sesión multiusuario, Screen cambia con
chmod()el modo de la TTY actual a 0666 - La ruta de la TTY se valida con condiciones como que esté bajo
/devyisatty(), por lo que este comportamiento por sí solo no se convierte en un exploit local de root separado - El problema es que, mientras los permisos de la TTY se relajan temporalmente, se genera una condición de carrera que permite a otros usuarios leer y escribir en esa TTY
- En una prueba simple basada en la API
inotifyde Linux, un script de Python pudo abrir la TTY afectada cada dos o tres intentos - Un atacante puede hacer lo siguiente
- Interceptar datos ingresados en la TTY
- Inyectar datos en la TTY
- Engañar al usuario para que ingrese una contraseña
- Inyectar secuencias de control para confundir a la víctima o apuntar a problemas relacionados en emuladores de terminal
- En algunas rutas de return de
Attach(), el modo original de la TTY no se restaura- Ejemplo: cuando no se encontró la sesión objetivo y el argumento
"quiet"está configurado
- Ejemplo: cuando no se encontró la sesión objetivo y el argumento
- El parche elimina el
chmod()temporal- patch 0001 para Screen 4.9.1
- patch 0004 para Screen 5.0.0
- Poco antes de la divulgación pública se confirmó que este parche podía romper algunos casos de uso de reattach, pero se verificó que esos casos ya estaban rotos también en Screen 4.9.1
- Este problema existía en versiones de Screen al menos desde 2005 y afecta a distribuciones Linux y BSD que ofrecen soporte multiusuario con setuid-root
- Incluso sin setuid-root, en teoría puede afectar porque el usuario tiene permiso para cambiar el modo de su propia TTY, pero Screen no continúa hacia sesiones de otros usuarios sin privilegios de root
CVE-2025-46803: valor predeterminado de PTY world-writable en Screen 5.0.0
- CVE-2025-46803 es el problema por el cual el modo predeterminado de los PTY asignados por Screen cambió de 0620 a 0622 en Screen 5.0.0
- Con este valor predeterminado, cualquiera en el sistema puede escribir en el PTY de Screen
- Desde el punto de vista de seguridad, genera un problema similar a CVE-2025-46802, pero sin el componente de filtración de información
- En Screen 4.9.1, el valor predeterminado a nivel de código era 0622, pero se aplicaba el valor predeterminado 0620 de la configuración autotools, por lo que se usaba un valor seguro
- En Screen 5.0.0,
configure.acfue reescrito, desapareció el valor predeterminado 0620 a nivel de autoconf, y luego el switch de configurepty-modese reintrodujo con 0622 como valor predeterminado - No se encontraron notas de release de 5.0.0 y solo había algunas entradas del ChangeLog, por lo que el cambio del modo PTY predeterminado no parece haber sido una decisión intencional
- El patch 0002 para Screen 5.0.0 restaura en
configure.acel modo PTY predeterminado seguro- Para aplicar el cambio es necesario ejecutar
autoreconf
- Para aplicar el cambio es necesario ejecutar
- Se recomienda a los empaquetadores pasar explícitamente el switch de configure
--with-pty-mode=0620 - Gentoo Linux y Fedora Linux pasan explícitamente el
--with-pty-modeseguro - Arch Linux y NetBSD no pasan ese switch, por lo que se aplica el nuevo valor predeterminado y quedan vulnerables
CVE-2025-46804: exposición de existencia de archivos mediante mensajes de error de rutas de socket
- CVE-2025-46804 es una filtración menor de información que ocurre cuando Screen se ejecuta con privilegios setuid-root
- Se confirmó tanto en versiones antiguas de Screen como en 5.0.0
- Screen verifica
SocketPathcon privilegios de root y expone en mensajes de error información de rutas que un usuario sin privilegios normalmente no podría conocer - Usando la variable de entorno
SCREENDIR, se puede inferir la siguiente información- Si
/root/.lesshstes un archivo regular - Si existe el directorio
/root/.cache - Si la ruta
/root/testno existe
- Si
- El parche cambia el comportamiento para que, en instalaciones setuid-root, solo se muestre un mensaje de error genérico cuando la ruta objetivo no está controlada por el UID real del proceso
- patch 0002 para Screen 4.9.1
- patch 0005 para Screen 5.0.0
- Todas las distribuciones revisadas están afectadas
CVE-2025-46805: condición de carrera TOCTOU en el envío de señales
- CVE-2025-46805 es una condición de carrera TOCTOU que ocurre al enviar señales a un PID proporcionado por el usuario en un contexto setuid-root
CheckPid()baja privilegios al ID de usuario real y luego comprueba si el kernel permite enviar una señal al PID objetivo- La señal real se envía después mediante
Kill(), momento en el que pueden usarse privilegios de root - Entre la comprobación y el envío real, el PID previamente comprobado puede ser reemplazado por otro privileged process
- También podría engañarse a un proceso daemon privilegiado de Screen para que se envíe una señal a sí mismo
- Actualmente solo pueden enviarse SIGCONT y SIGHUP, por lo que es probable que el impacto quede en el ámbito de una denegación de servicio local o una infracción menor de integridad
- Este problema se originó en una corrección incompleta de CVE-2023-24626
- Antes de esa corrección, estas señales podían enviarse a procesos arbitrarios sin condición de carrera
- El parche cambia el envío real de la señal para que también se haga con los privilegios del UID real, igual que
CheckPid()- patch 0003 para Screen 4.9.1
- patch 0006 para Screen 5.0.0
- Todas las distribuciones revisadas están afectadas
Bloqueo al enviar comandos por el uso de strncpy() en Screen 5.0.0
- Screen 5.0.0 tiene un problema relacionado con
strncpy()que no se considera un issue de seguridad, pero que debe corregirse con prioridad - En el commit
0dc67256, varias llamadas astrcpy()fueron reemplazadas porstrncpy() strncpy()no es una función para manejo seguro de strings, sino una función que rellena con ceros un búfer de longitud fija; por eso, incluso después del primer byte\0, escribe ceros hasta el final del búfer de destino- En el bucle de procesamiento de argumentos de línea de comandos de
attacher.c, se pasaMAXPATHLENcomo tamaño de destino incluso después de la primera iteración - Como el puntero
pya fue incrementado pero se sigue pasando el mismo tamaño, las llamadas posteriores astrncpy()escriben bytes\0más allá del final del búfer - En Arch Linux, al enviar más de un argumento de comando a una sesión de Screen en ejecución, se observó el siguiente error en builds con
_FORTIFY_SOURCEhabilitado*** buffer overflow detected***: terminatedAborted (core dumped)
- Sin
_FORTIFY_SOURCE, puede no haber un error visible, y puede que tampoco aparezca un error con-fsanitize=address - El llamador puede sobrescribir con ceros los
MAXPATHLENbytes posteriores al búfercmd, pero como después hay un búferwriteback[MAXPATHLEN]del mismo tamaño, se considera que no habría una forma favorable para que un atacante lo explote - El patch 0003 para Screen 5.0.0 cambia
strncpy()porsnprintf()y pasa correctamente el tamaño restante del búfer de destino - Todas las distribuciones que ofrecen Screen 5.0.0 están afectadas
Alcance del impacto por distribución
| Sistema | Versión de Screen | Privilegios especiales | Impacto |
|---|---|---|---|
| Arch Linux | 5.0.0 | setuid-root | 3.a, 3.b, 3.c, 3.d, 3.e, 3.f |
| Debian 12.10 | 4.9.0 | ninguno | parte de 3.b |
| Ubuntu 24.04.2 | 4.9.1 | ninguno | parte de 3.b |
| Fedora 42 | 5.0.0 | setgid-screen | parte de 3.b, 3.f |
| Gentoo | 4.9.1 | setgid-utmp, setuid-root si está configurada la USE flag multiuser | parte de 3.b |
| openSUSE TW | 4.9.1 | ninguno | parte de 3.b |
| FreeBSD 14.2 | 4.9.1 | setuid-root | 3.b, 3.d, 3.e |
| NetBSD 10.1 | 5.0.0 | setuid-root | 3.a, 3.b, 3.c, 3.d, 3.e, 3.f |
| OpenBSD 7.7 | 4.9.1 | ninguno | parte de 3.b |
Preocupaciones y recomendaciones sobre el diseño setuid-root
- En el modo multiusuario de Screen intervienen tres UID
- effective UID 0 para privileged operation
- UID real del usuario que creó la sesión
- UID real del usuario que se adjunta a la sesión
- La estructura actual del código de Screen parece dificultar reflejar correctamente esta distinción
- Una sesión multiusuario de Screen creada por
root“reduce privilegios” al UID real del creador de la sesión, que es 0, por lo que en la práctica no hay reducción de privilegios - Durante la refactorización de Screen 5.0.0 se rompió lógica de seguridad que existía desde hacía mucho tiempo, y como resultado surgieron CVE-2025-23395 y CVE-2025-46803
- Antes de más refactorizaciones, hace falta una suite de pruebas que pueda verificar las propiedades de seguridad de la implementación
- Los desarrolladores que trabajan con binarios setuid-root deben entender los riesgos de esa área
- Screen sigue ejecutándose con privilegios elevados y solo reduce privilegios de forma selectiva en operaciones que considera riesgosas
- Un programa setuid-root robusto debería bajar privilegios por defecto y elevarlos solo en las operaciones que realmente necesitan privilegios elevados
- En un contexto setuid-root, se necesita lógica para eliminar todas las variables de entorno salvo las permitidas explícitamente
- Variables de entorno como
PATHdeben limpiarse para que solo apunten a directorios de sistema confiables - Actualmente se recomienda no instalar como setuid-root ni Screen 5.0.0 ni la serie 4.9 anterior
- Como alternativa, la función multiusuario podría ofrecerse mediante opt-in y permitir que solo miembros de un grupo confiable ejecuten la versión multiusuario de Screen
Proceso de coordinación de la divulgación y estado upstream
- En febrero de 2025, los problemas se reportaron de forma privada al upstream de Screen y se propuso una divulgación coordinada
- Upstream mostró interés en mantener los problemas en privado para corregir los bugs antes de la publicación, e indicó que necesitaría entre 1 y 2 meses
- Alrededor de un mes después comenzó actividad del lado de upstream y discusión de parches, pero la discusión no fue suficientemente productiva
- Hasta que se acercó el periodo máximo de embargo de 90 días no hubo más comunicación, y mientras tanto distribuciones como NetBSD actualizaron a Screen 5.0.0, quedando plenamente afectadas por CVE-2025-23395
- Se concluyó que upstream no estaba lo bastante familiarizado con la base de código de Screen y no entendía completamente los problemas de seguridad reportados
- Upstream quería una divulgación más temprana aunque algunos problemas seguían sin resolverse, por lo que el borrador se envió rápidamente a la lista de correo distros
- Luego, SUSE desarrolló directamente las correcciones faltantes, y también ajustó y documentó los parches discutidos en forma de borrador con upstream
- Se estima que, con capacidad upstream dedicada, el proceso de divulgación coordinada podría haberse completado en unas 2 semanas
- Screen upstream parece sufrir falta de personal y experiencia, lo que preocupa especialmente por tratarse de una utilidad de código abierto ampliamente usada
Cronología principal
- 2024-07-01: se recibió la solicitud de revisión de upstream
- 2025-01-08: comenzó el trabajo de revisión de seguridad
- 2025-02-07: reporte privado a Screen upstream y propuesta de divulgación coordinada
- 2025-02-11: creación de un bug privado en el bug tracker de GNU Savannah
- 2025-04-30: decisión de asignación de CVE y borrador compartido en la lista de correo distros
- 2025-05-07: versiones finales de los parches para Screen 4.9.1 y 5.0.0 compartidas con la lista de correo distros y upstream
- 2025-05-12: el reporte se publicó en el blog y en la lista de correo oss-security
1 comentarios
Opiniones en Hacker News
No sabía que Screen tenía este modo multiusuario, pero probablemente sea la razón por la que herramientas como tmate son posibles.
Con las credenciales adecuadas, otro usuario puede conectarse a una sesión de Screen propiedad de otro, y dicen que esta función solo es posible cuando Screen está instalado como setuid-root.
Por eso me pregunto si tmux también se ve afectado por el mismo tipo de vulnerabilidad.
No sé por qué screen eligió aquí el enfoque setuid, y no parece necesitar privilegios de root en absoluto.
Más abajo en el artículo aparece una explicación plausible de que los desarrolladores actuales de screen no están del todo familiarizados con la base de código; si es así, puede que setuid-root haya sido la forma más fácil de hacer funcionar la característica.
En sesiones de capacitación, le daba a cada estudiante una cuenta para iniciar sesión en mi laptop, restringía el shell SSH a
screen -xy, con las listas de control de acceso de screen, hacía que cada estudiante solo pudiera usar su propia ventana.Durante la práctica, yo, como propietario de screen, podía proyectar la pantalla de cada estudiante para que toda la clase viera el resultado.
No me sorprendería que tuviera muchos agujeros de seguridad.
screen -x.En Debian, GNU screen no se instala con privilegios setuid-root.
Antes me molestaba que Debian siempre estuviera atrasado en versiones de software, pero ahora uso otras fuentes de paquetes solo para algunas apps en las que no quiero depender de software realmente antiguo, como los navegadores, y para el resto me va bien con paquetes viejos.
/usr/bin/screenapunta ascreen-4.9.0, y el ejecutable tampoco es suid.Aunque en Gentoo tiene SETGID para el grupo
utmp, pero no sé bien qué impacto tiene eso.El artículo renderizado está aquí: https://security.opensuse.org/2025/05/12/screen-security-iss...
Una vez le mandé un email al autor de GNU Screen diciendo que la función de registro en archivo no estaba bien documentada: http://www.zoobab.com/screenrc
GNU necesita un mejor sistema de seguimiento de issues.
https://undeadly.org/cgi?action=article&sid=20090712190402
Es válido criticar a Discord por volver inaccesible este tipo de información, pero el IRC que algunos proyectos todavía usan en la práctica es el doble de peor.
Ojalá estos proyectos se mudaran a lugares como Gitea, Forgejo, Codeberg, GitLab o GitHub para reunir el contenido relacionado y asegurar su descubribilidad.
Zellij es una alternativa moderna bastante buena a screen y tmux, tiene valores por defecto excelentes y una UI diseñada para que sea fácil descubrir sus funciones.
Se lo recomiendo a quienes sienten que la relación esfuerzo/beneficio de los multiplexores de terminal es dudosa.
https://zellij.dev
https://github.com/zellij-org/zellij
Pero, en comparación con tmux, la latencia era notable, y sigo usando tmux.
En ese momento ya estaba usando una conexión con latencia, así que tal vez yo estaba algo sensible al tema.
Uso muchísimo esa función, así que no puedo usarlo sin ella, y hasta que la agreguen no me queda otra que usar tmux.
Lo he usado por más de 20 años.
Me sorprende que upstream haya participado en esto.
Hace unos 5 años llegué tristemente a la conclusión de que el desarrollo de GNU screen se había detenido por completo, y me pregunto si acaso ya no es así.
No sé si screen todavía tiene la función de agregar una ventana nueva sin conectarse a una screen existente.
Parece que les falta personal de desarrollo, y quizá upstream no tenga la experiencia necesaria para mantenerlo bien.
Si es cierto, es triste. Sé que existen tmux y otras alternativas, pero mucha gente ha usado Screen durante muchísimo tiempo, y da pena ver cómo una herramienta se va pudriendo lentamente.
Aunque pidieron una revisión de seguridad, parece que fue difícil mantener el contacto, y no conozco toda la situación.
Las distribuciones configuradas así son vulnerables, y las que no, no lo son.
Yo lo veo como una participación muy superficial. Si upstream es demasiado lento, la distribución parchea.
Básicamente puede tomarse como señal de que es una herramienta terminada.
No hay un incentivo inmediato para cambiarse, porque no es una actualización sino una migración.
Por otro lado, también es malo que alguien compre la marca de un software existente y lo transforme en algo completamente distinto, como pasó con Audacity.
Así que no parece haber una buena solución.
Versión renderizada: https://security.opensuse.org/2025/05/12/screen-security-iss...
Si no recuerdo mal, tmux entró en el sistema base desde OpenBSD 4.6 y es una herramienta que fue, o ha sido, auditada.
Es buena para quienes quieren una alternativa un poco más segura.
El comportamiento observado estaba en versiones de Screen al menos desde 2005, ya era un antipatrón desde hace todo ese tiempo, y herramientas como rkhunter también lo trataban.
Aun así, creo que screen ya era setuid root en los 90.
¿Cuántos desarrolladores mantienen realmente las herramientas open source más populares?
¿Cuánto dinero hay en las industrias que usan esas herramientas?