Plusieurs failles de sécurité découvertes dans GNU Screen
(openwall.com)- Un audit de sécurité de GNU Screen, centré sur Screen 5.0.0 et les installations setuid-root, a mis au jour une élévation de privilèges locale, un détournement de TTY, des fuites d’informations, une condition de concurrence lors de l’envoi de signaux et un crash lors de l’envoi de commandes
- La plus grave, CVE-2025-23395, permet à
logfile_reopen()de traiter un chemin fourni par l’utilisateur avec les privilèges root, ce qui autorise la création de fichiers possédés par root à des emplacements arbitraires ou l’ajout de logs à des fichiers existants - L’ancien fonctionnement du mode multi-utilisateur s’est également révélé problématique :
Attach()bascule temporairement le TTY en 0666, ce qui permet à d’autres utilisateurs de le lire, d’y écrire et d’y injecter des entrées - Le niveau de risque varie selon les distributions et leur mode d’installation : Arch Linux et NetBSD 10.1 fournissent Screen 5.0.0 en setuid-root et sont fortement touchés par les principales vulnérabilités
- La recommandation actuelle est de ne pas installer Screen en setuid-root ; la fonction multi-utilisateur devrait reposer sur un opt-in par groupe de confiance, avec baisse des privilèges par défaut, élévation limitée et nettoyage des variables d’environnement
Contexte de publication et correctifs
- En juillet 2024, le mainteneur upstream de Screen a demandé une revue de la base de code actuelle, et l’audit de sécurité effectif a commencé en janvier 2025
- L’audit a révélé, dans la mise à jour majeure Screen 5.0.0, un exploit local root affectant les distributions qui le livrent en setuid-root
- D’autres problèmes de gravité plus faible ont aussi été identifiés, dont certains affectent encore Screen 4.9.1 et les versions antérieures, présentes dans de nombreuses distributions
- Les problèmes ont été partagés sur la liste de diffusion distros le 30 avril 2025, puis rendus publics le 12 mai 2025
- Le signalement inclut des lots de correctifs par version
Configuration de Screen et mode multi-utilisateur
- Screen 5.0.0 a été publié upstream en août 2024 comme version majeure, et Arch Linux, Fedora 42 et NetBSD 10.1 la proposent
- De nombreuses distributions Linux et UNIX utilisent encore Screen 4.9.1 au moment de la rédaction
- Le mode multi-utilisateur de Screen permet d’attacher une session Screen appartenant à un autre utilisateur si les identifiants adéquats sont disponibles
- Cette fonctionnalité n’est utilisable que si Screen est installé avec le bit setuid-root
- Comme du code Screen complexe s’exécute alors avec les privilèges root, la surface d’attaque s’élargit
- Parmi les systèmes examinés, Arch Linux, FreeBSD et NetBSD installent Screen en setuid-root
- Gentoo Linux applique le bit setuid-root lorsque l’option USE
"multiuser"est activée - Certaines distributions utilisent setgid au lieu de setuid
- La valeur par défaut de Gentoo Linux est setgid-utmp, ce qui permet à Screen d’écrire des enregistrements de connexion dans la base système
utmp - Fedora Linux utilise setgid-screen, ce qui permet à Screen de placer des sockets dans le répertoire système
/run/screen
- La valeur par défaut de Gentoo Linux est setgid-utmp, ce qui permet à Screen d’écrire des enregistrements de connexion dans la base système
CVE-2025-23395 : exploit local root via logfile_reopen()
- CVE-2025-23395 affecte Screen 5.0.0 lorsqu’il s’exécute avec les privilèges setuid-root
- La fonction
logfile_reopen()traite un chemin fourni par l’utilisateur sans abaisser les privilèges - Un utilisateur non privilégié peut créer des fichiers arbitraires avec les propriétés suivantes
- propriétaire :
root - groupe : groupe réel de l’utilisateur appelant
- mode de fichier :
0644
- propriétaire :
- Les fichiers déjà existants peuvent aussi être exploités
- Les données écrites sur le PTY Screen sont ajoutées à ce fichier
- Le mode et le propriétaire du fichier existant ne sont pas modifiés
- Screen abaisse correctement les privilèges lors de l’ouverture initiale du fichier de log, mais une élévation de privilèges devient possible lorsqu’il décide qu’il faut rouvrir ce fichier
- Dans le contrôle
stolen_logfile(),logfile_reopen()est appelé si le nombre de liens du fichier de log d’origine devient 0 ou si sa taille change de manière inattendue - Un utilisateur non privilégié peut provoquer intentionnellement cette condition
- Le patch 0001 pour Screen 5.0.0 réintroduit une gestion sûre des fichiers lors de la réouverture du fichier de log
- Le problème provient d’un ancien commit
441bca708bdqui a supprimélf_secreopen(), changement inclus dans la version 5.0.0
CVE-2025-46802 : détournement de TTY lors de l’attachement à une session multi-utilisateur
- CVE-2025-46802 se produit dans la fonction
Attach()lorsque l’indicateurmultiattachest défini - Lors de l’attachement à une session multi-utilisateur, Screen modifie via
chmod()le mode du TTY courant en 0666 - Le chemin du TTY est vérifié, notamment pour s’assurer qu’il se trouve sous
/devet queisatty()est vrai ; ce comportement seul ne constitue donc pas un exploit root local distinct - Le problème est qu’une condition de concurrence apparaît pendant l’assouplissement temporaire des permissions du TTY, permettant à d’autres utilisateurs de lire et d’écrire sur ce TTY
- Lors d’un test simple basé sur l’API Linux
inotify, un script Python parvenait à ouvrir le TTY affecté toutes les deux ou trois tentatives - Un attaquant peut alors
- intercepter les données saisies sur le TTY
- injecter des données dans le TTY
- tromper l’utilisateur pour lui faire saisir un mot de passe
- injecter des séquences de contrôle afin de perturber la victime ou de viser des problèmes propres à l’émulateur de terminal utilisé
- Dans certains chemins de retour de
Attach(), le mode initial du TTY n’est pas restauré- Exemple : si la session cible est introuvable et que l’argument
"quiet"est défini
- Exemple : si la session cible est introuvable et que l’argument
- Le correctif supprime le
chmod()temporaire- patch 0001 pour Screen 4.9.1
- patch 0004 pour Screen 5.0.0
- Peu avant la publication, il a été constaté que ce correctif pouvait casser certains cas de reattach, mais il s’est avéré que ces cas étaient déjà cassés dans Screen 4.9.1
- Le problème existe au moins depuis les versions de Screen publiées après 2005 et affecte les distributions Linux et les BSD qui proposent le support multi-utilisateur en setuid-root
- Même sans setuid-root, le problème peut théoriquement exister puisqu’un utilisateur peut modifier le mode de son propre TTY, mais Screen ne peut pas poursuivre vers la session d’un autre utilisateur sans privilèges root
CVE-2025-46803 : valeur par défaut world-writable pour les PTY dans Screen 5.0.0
- CVE-2025-46803 correspond au changement, dans Screen 5.0.0, du mode par défaut des PTY alloués par Screen, passé de 0620 à 0622
- Avec cette valeur par défaut, n’importe quel utilisateur du système peut écrire sur un PTY Screen
- Cela entraîne des problèmes de sécurité similaires à CVE-2025-46802, mais sans l’aspect fuite d’informations
- Dans Screen 4.9.1, la valeur par défaut au niveau du code était 0622, mais la valeur par défaut 0620 fournie par la configuration autotools prévalait, ce qui donnait un réglage sûr par défaut
- Dans Screen 5.0.0,
configure.aca été réécrit, la valeur par défaut 0620 au niveau autoconf a disparu, puis l’option de configurationpty-modea été réintroduite avec 0622 comme valeur par défaut - Les notes de version de 5.0.0 n’ont pas été retrouvées, seuls quelques éléments du ChangeLog étaient disponibles, et ce changement de mode PTY par défaut ne semble pas avoir été intentionnel
- Le patch 0002 pour Screen 5.0.0 rétablit un mode PTY sûr par défaut dans
configure.ac- L’application de ce changement nécessite d’exécuter
autoreconf
- L’application de ce changement nécessite d’exécuter
- Il est recommandé aux packageurs de passer explicitement l’option de configuration
--with-pty-mode=0620 - Gentoo Linux et Fedora Linux passent explicitement une valeur sûre pour
--with-pty-mode - Arch Linux et NetBSD ne passent pas cette option, héritent donc de la nouvelle valeur par défaut et sont vulnérables
CVE-2025-46804 : divulgation de l’existence de fichiers via les messages d’erreur sur le chemin du socket
- CVE-2025-46804 est une fuite d’informations mineure lorsque Screen s’exécute avec les privilèges setuid-root
- Le problème est présent à la fois dans les anciennes versions de Screen et dans la 5.0.0
- Screen vérifie
SocketPathavec les privilèges root et divulgue dans ses messages d’erreur des informations de chemin qu’un utilisateur non privilégié ne devrait normalement pas connaître - En utilisant la variable d’environnement
SCREENDIR, on peut inférer par exemple- si
/root/.lesshstest un fichier ordinaire - si le répertoire
/root/.cacheexiste - si le chemin
/root/testn’existe pas
- si
- Le correctif modifie le comportement sur les installations setuid-root pour n’afficher qu’un message d’erreur générique lorsque le chemin cible n’est pas contrôlé par l’UID réel du processus
- patch 0002 pour Screen 4.9.1
- patch 0005 pour Screen 5.0.0
- Toutes les distributions examinées sont affectées
CVE-2025-46805 : condition de concurrence TOCTOU lors de l’envoi de signaux
- CVE-2025-46805 est une condition de concurrence TOCTOU lors de l’envoi d’un signal à un PID fourni par l’utilisateur dans un contexte setuid-root
CheckPid()abaisse les privilèges vers l’UID réel afin de vérifier si le noyau autorise l’envoi d’un signal au PID visé- Le signal effectif est envoyé plus tard via
Kill(), et peut alors utiliser les privilèges root - Entre la vérification et l’envoi réel, le PID contrôlé peut être remplacé par un autre processus privilégié
- Il pourrait aussi être possible de tromper un processus démon Screen privilégié pour qu’il s’envoie un signal à lui-même
- Actuellement, seuls SIGCONT et SIGHUP peuvent être envoyés, ce qui limite vraisemblablement l’impact à un déni de service local ou à une atteinte mineure à l’intégrité
- Le problème résulte d’une correction incomplète de CVE-2023-24626
- Avant cette correction, ces signaux pouvaient être envoyés à des processus arbitraires même sans condition de concurrence
- Le correctif fait en sorte que l’envoi réel du signal s’effectue lui aussi avec les privilèges de l’UID réel, comme dans
CheckPid()- patch 0003 pour Screen 4.9.1
- patch 0006 pour Screen 5.0.0
- Toutes les distributions examinées sont affectées
Crash lors de l’envoi de commandes à cause de l’usage de strncpy() dans Screen 5.0.0
- Screen 5.0.0 contient aussi un problème lié à
strncpy()qui n’est pas considéré comme une faille de sécurité, mais qui doit être corrigé en priorité - Dans le commit
0dc67256, plusieurs appels àstrcpy()ont été remplacés parstrncpy() strncpy()n’est pas une fonction de manipulation sûre des chaînes, mais une fonction qui remplit de0un tampon de taille fixe ; elle écrit donc des0jusqu’à la fin du tampon cible même après le premier octet\0- Dans la boucle de traitement des arguments de ligne de commande de
attacher.c,MAXPATHLENest encore passé comme taille de destination après la première itération - Comme le pointeur
pa déjà été incrémenté, transmettre toujours la même taille fait que les appels suivants àstrncpy()écrivent des octets\0au-delà de la fin du tampon - Sur Arch Linux, l’envoi de plus d’un argument de commande à une session Screen en cours a produit, sur des builds avec
_FORTIFY_SOURCE, les erreurs suivantes*** buffer overflow detected***: terminatedAborted (core dumped)
- Sans
_FORTIFY_SOURCE, il peut ne pas y avoir d’erreur visible, et même avec-fsanitize=address, aucune erreur peut ne se manifester - L’appelant peut écraser de
0lesMAXPATHLENoctets situés après le tamponcmd, mais comme il existe juste après un tamponwriteback[MAXPATHLEN]de même taille, il est jugé peu probable qu’un attaquant puisse en tirer un avantage exploitable - Le patch 0003 pour Screen 5.0.0 remplace
strncpy()parsnprintf()et transmet correctement la taille restante du tampon de destination - Toutes les distributions qui fournissent Screen 5.0.0 sont affectées
Impact selon les distributions
| Système | Version de Screen | Privilège spécial | Impact |
|---|---|---|---|
| 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 | aucun | 3.b partiel |
| Ubuntu 24.04.2 | 4.9.1 | aucun | 3.b partiel |
| Fedora 42 | 5.0.0 | setgid-screen | 3.b partiel, 3.f |
| Gentoo | 4.9.1 | setgid-utmp, setuid-root si l’option USE multiuser est activée | 3.b partiel |
| openSUSE TW | 4.9.1 | aucun | 3.b partiel |
| 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 | aucun | 3.b partiel |
Inquiétudes sur la conception setuid-root et recommandations
- Le mode multi-utilisateur de Screen implique trois UID distincts
- l’effective UID 0 pour les opérations privilégiées
- l’UID réel de l’utilisateur qui a créé la session
- l’UID réel de l’utilisateur qui s’attache à la session
- Le code actuel de Screen semble difficile à structurer de façon à refléter correctement cette distinction
- Une session Screen multi-utilisateur créée par
root“abaisse ses privilèges” vers l’UID réel du créateur de session, c’est-à-dire 0, ce qui revient en pratique à ne pas abaisser les privilèges du tout - Lors du refactoring de Screen 5.0.0, une logique de sécurité présente depuis longtemps a été cassée, entraînant CVE-2025-23395 et CVE-2025-46803
- Avant d’autres refactorings, une suite de tests capable de valider les propriétés de sécurité de l’implémentation est nécessaire
- Les développeurs qui manipulent des binaires setuid-root doivent comprendre les risques propres à ce domaine
- Screen continue à s’exécuter avec des privilèges élevés, puis n’abaisse ses privilèges que de façon sélective pour certaines opérations jugées dangereuses
- Un programme setuid-root robuste devrait au contraire abaisser ses privilèges par défaut, puis ne les réélever que pour les opérations qui en ont réellement besoin
- En contexte setuid-root, il faut une logique qui supprime toutes les variables d’environnement sauf celles explicitement autorisées
- Des variables comme
PATHdevraient être nettoyées pour ne pointer que vers des répertoires système de confiance - Pour l’instant, il est recommandé de ne pas installer Screen en setuid-root, non seulement en 5.0.0 mais aussi dans les versions précédentes de la série 4.9
- Une alternative consiste à proposer la fonctionnalité multi-utilisateur en mode opt-in et à réserver l’exécution d’une version multi-utilisateur de Screen aux membres d’un groupe de confiance
Coordination de la divulgation et état de l’upstream
- En février 2025, les problèmes ont été signalés en privé à l’upstream de Screen, avec une proposition de divulgation coordonnée
- L’upstream s’est montré favorable au maintien de la confidentialité avant publication afin de corriger les bugs, et a indiqué avoir besoin d’un à deux mois
- Environ un mois plus tard, des échanges sur les correctifs et une certaine activité côté upstream ont commencé, mais les discussions n’ont pas été assez productives
- À l’approche de la limite d’embargo de 90 jours, il n’y avait toujours pas eu de communication supplémentaire ; entre-temps, des distributions comme NetBSD avaient migré vers Screen 5.0.0 et se retrouvaient alors pleinement affectées par CVE-2025-23395
- Il a été estimé que l’upstream n’était pas suffisamment familier avec la base de code Screen et ne comprenait pas totalement les problèmes de sécurité signalés
- L’upstream souhaitait une publication plus rapide alors que certains problèmes restaient non résolus, ce qui a conduit à l’envoi rapide d’un brouillon sur la liste de diffusion distros
- SUSE a ensuite développé directement les correctifs manquants, puis ajusté et documenté des patchs qui n’avaient été discutés qu’à l’état de brouillon côté upstream
- Il est estimé qu’avec une capacité upstream dédiée, la procédure de divulgation coordonnée aurait pu être bouclée en environ deux semaines
- L’upstream de Screen semble souffrir d’un manque de ressources et d’expertise, ce qui est préoccupant pour un utilitaire open source largement utilisé
Principales dates
- 2024-07-01 : transmission de la demande de revue par l’upstream
- 2025-01-08 : début de l’audit de sécurité
- 2025-02-07 : signalement privé à l’upstream de Screen et proposition de divulgation coordonnée
- 2025-02-11 : création d’un bug privé dans le bug tracker GNU Savannah
- 2025-04-30 : décision d’attribution des CVE et partage d’un brouillon sur la liste de diffusion distros
- 2025-05-07 : partage, avec la liste distros et l’upstream, des versions finales des correctifs pour Screen 4.9.1 et 5.0.0
- 2025-05-12 : publication du rapport sur le blog et la liste de diffusion oss-security
1 commentaires
Commentaires sur Hacker News
Je ne savais pas que Screen avait ce mode multi-utilisateur, mais c’est probablement ce qui rend possibles des outils comme tmate
Avec les identifiants appropriés, on peut s’attacher à une session Screen appartenant à un autre utilisateur, et cette fonctionnalité ne serait possible que si Screen est installé en setuid-root
Du coup, je me demande si tmux est concerné par le même type de vulnérabilité
Je ne sais pas pourquoi screen a choisi ici l’approche setuid, et les droits root ne semblent pas du tout nécessaires
Plus bas dans l’article, il y a une explication plausible selon laquelle les développeurs actuels de screen ne connaissent pas parfaitement la base de code ; si c’est le cas, il est possible que setuid-root ait été la façon la plus simple de faire fonctionner la fonctionnalité
Lors de sessions de formation, j’ai déjà donné à chaque étudiant un compte de connexion sur mon ordinateur portable, limité leur shell SSH à
screen -x, puis utilisé les listes de contrôle d’accès de screen pour que chaque étudiant ne puisse utiliser que sa propre fenêtrePendant les travaux pratiques, en tant que propriétaire de screen, je pouvais afficher l’écran de chaque étudiant au projecteur pour que toute la classe voie le résultat
Ça ne m’étonnerait pas qu’il y ait beaucoup de failles de sécurité
screen -xSur Debian, GNU screen n’est pas installé avec les droits setuid-root
Avant, je n’aimais pas que Debian soit toujours en retard sur les versions des logiciels, mais maintenant j’utilise d’autres sources de paquets seulement pour quelques applis pour lesquelles je ne veux vraiment pas dépendre de logiciels très anciens, comme les navigateurs, et je vis très bien avec les vieux paquets pour le reste
/usr/bin/screenpointe versscreen-4.9.0, et l’exécutable n’est pas suid non plusEn revanche, sur Gentoo, SETGID est activé pour le groupe
utmp, mais je ne sais pas vraiment quelles en sont les conséquencesL’article de blog rendu est ici : https://security.opensuse.org/2025/05/12/screen-security-iss...
J’avais déjà envoyé un e-mail à l’auteur de GNU Screen pour lui signaler que la fonctionnalité de journalisation dans un fichier n’était pas correctement documentée : http://www.zoobab.com/screenrc
GNU a besoin d’un meilleur système de suivi des tickets
https://undeadly.org/cgi?action=article&sid=20090712190402
Les critiques contre Discord, accusé de rendre ce genre d’informations inaccessible, sont justifiées, mais l’IRC que certains projets utilisent encore est en pratique deux fois pire
J’aimerais que ces projets migrent vers des plateformes comme Gitea, Forgejo, Codeberg, GitLab ou GitHub, afin de regrouper les informations pertinentes et de garantir leur découvrabilité
Zellij est une très bonne alternative moderne à screen et tmux ; ses valeurs par défaut sont excellentes et son UI est bien conçue pour être facile à découvrir
Je le recommande à ceux qui trouvaient que le rapport effort/bénéfice des multiplexeurs de terminaux était ambigu
https://zellij.dev
https://github.com/zellij-org/zellij
Mais par rapport à tmux, la latence était perceptible, et j’utilise toujours tmux
J’étais déjà sur une connexion avec de la latence à l’époque, donc j’étais peut-être un peu sensible à ce point
J’utilise énormément cette fonctionnalité, donc je ne peux pas m’en passer, et tant qu’elle ne sera pas ajoutée, je suis obligé d’utiliser tmux
Je l’utilise depuis plus de 20 ans
Je suis surpris que l’amont ait été impliqué là-dedans
Il y a environ cinq ans, j’avais tristement conclu que le développement de GNU screen s’était complètement arrêté ; je me demande donc si ce n’est finalement pas le cas
Je ne sais pas si screen a encore une fonctionnalité permettant d’ajouter une nouvelle fenêtre sans s’attacher à un screen existant
Ils manquent de développeurs, et il se pourrait que l’amont n’ait pas l’expertise nécessaire pour assurer correctement la maintenance
Si c’est vrai, c’est triste. Je sais qu’il existe tmux et d’autres alternatives, mais beaucoup de gens utilisent Screen depuis très longtemps, et c’est dommage de voir un outil se dégrader lentement
Ils ont bien demandé un audit de sécurité, mais il semble qu’il ait été difficile de garder le contact, et je ne connais pas toute l’histoire
Les distributions configurées ainsi sont vulnérables, celles qui ne le sont pas ne le sont pas
Je vois ça comme une implication très superficielle. Si l’amont est trop lent, les distributions patchent
On peut surtout y voir le signe d’un outil achevé
Il n’y a pas d’incitation à basculer immédiatement, car ce n’est pas une mise à jour mais une migration
À l’inverse, il est aussi mauvais que quelqu’un rachète la marque d’un logiciel existant et le transforme en quelque chose de complètement différent, comme avec Audacity
Je ne vois donc pas de bonne solution
Version rendue : https://security.opensuse.org/2025/05/12/screen-security-iss...
Si ma mémoire est bonne, tmux est entré dans le système de base à partir d’OpenBSD 4.6, et c’est un outil qui a été audité, ou qui l’est régulièrement
C’est une bonne option pour ceux qui veulent une alternative un peu plus sûre
Le comportement observé existait dans les versions de Screen au moins depuis 2005 ; c’était déjà un anti-pattern depuis aussi longtemps, et des outils comme rkhunter le prenaient aussi en compte
Cela dit, il me semble que screen était déjà setuid root dans les années 90
Combien de développeurs font réellement tourner les outils open source les plus populaires ?
Et combien d’argent y a-t-il dans les industries qui les utilisent ?