CVE-2026-98993 in Linux
Résumé
par VulDB • 24/10/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
namespace: ne pas hériter de MNT_UMOUNT dans clone_mnt()
MNT_UMOUNT est défini sur un montage qui a été retiré de son espace de noms par umount_tree() ou umount_one(). Il n'est jamais réinitialisé. __detach_mounts() détache un montage qui le porte au lieu de le démonter.
disconnect_mount() permet à un enfant non monté de rester attaché uniquement si son parent le porte. propagate_umount() l'utilise comme signe qu'un montage va être démouté lorsqu'il décide ce qui d'autre peut être démonté, où une chaîne de montages verrouillés se termine et où un reparentage d'un overmount a lieu.
clone_mnt() copie les indicateurs (flags) de la source et masque uniquement MNT_INTERNAL_FLAGS, qui n'inclut pas MNT_UMOUNT. Un montage qui a été démonté de manière lâche (lazy umount) mais maintenu en vie par un descripteur de fichier peut encore être copié lorsque sa racine est un fichier nsfs ou pidfs car may_copy_tree() accepte ceux-ci avant de vérifier si la source est effectivement montée :
mount --bind /proc/self/ns/net /tmp/x exec 3< /tmp/x umount -l /tmp/x mount --bind /proc/self/fd/3 /tmp/y
Le montage sur /tmp/y est attaché à l'espace de noms de l'appelant avec MNT_UMOUNT déjà défini et chaque copie de celui-ci hérite à nouveau de cet indicateur.
Cela provoque un certain nombre de bogues :
- Supprimer son point de montage d'un espace de noms de montage où il n'en est pas un. __detach_mounts() le considère comme un montage qui a été démonté plus tôt, le détache de son parent et supprime la référence que l'espace de noms conserve sur lui. Il reste dans l'espace de noms avec une référence en moins et en tant que son propre parent, il ne peut donc plus être démonté via le descripteur de fichier et l'espace de noms ne le retrouve jamais. Lorsque l'espace de noms disparaît, il est fuit (leak) et pointe vers un struct mnt_namespace libéré qui may_change_propagation() et anon_ns_root() lisent lors du prochain changement de propagation ou via mount_setattr() à travers le descripteur de fichier.
- Le rendre partagé et démonter un pair. trace_transfers() suit l'indicateur depuis le pair vers celui-ci et le supprime de son groupe de pairs.
- Laisser une umount propagée atteindre cet élément. gather_candidates() le marque avec T_UMOUNT_CANDIDATE mais ne l'ajoute jamais à la liste des candidats, donc la marque n'est jamais effacée et chaque umount propagée ultérieure le saute. S'il s'agit du parent d'un montage verrouillé, handle_locked() le prend comme point de coupure (cutoff) et valide l'enfant verrouillé qui aurait dû rester attaché, et disconnect_mount() laisse cet enfant attaché à lui, démonté sous un parent monté, ce que disconnect_mount() est censé empêcher. Lorsque l'espace de noms disparaît, umount_tree() visite l'enfant une seconde fois. Et une fois que __detach_mounts() en a fait son propre parent, reparent() ne trouve jamais la fin de la chaîne des parents démontés.
Un clone est un nouveau montage qui n'a jamais été démonté. Ajoutez MNT_UMOUNT à MNT_INTERNAL_FLAGS afin que clone_mnt() ne le copie jamais. Et émettez un avertissement lorsque umount_tree() atteint un montage qui l'a déjà défini.
If you want to get best quality of vulnerability data, you may have to visit VulDB.