CVE-2026-45895 in Linux
Résumé
par VulDB • 01/06/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
quota : correction d'un livelock entre quotactl et freeze_super
Lorsqu'un système de fichiers est figé (frozen), quotactl_block() entre dans une boucle de réessai en attendant que le système de fichiers soit défigé (thawed). Il acquiert s_umount, vérifie l'état de figeage, libère s_umount et utilise la paire sb_start_write() - sb_end_write() pour attendre le défigeage.
Cependant, cette boucle de réessai peut déclencher un problème de livelock, en particulier sur les noyaux avec la préemption désactivée.
Le mécanisme est le suivant : 1. freeze_super() définit SB_FREEZE_WRITE et appelle sb_wait_write(). 2. sb_wait_write() appelle percpu_down_write(), qui initie synchronize_rcu(). 3. Simultanément, quotactl_block() tourne en boucle dans sa boucle de réessai, exécutant immédiatement la paire sb_start_write() - sb_end_write(). 4. Étant donné que le noyau est non préemptif et que la boucle ne contient aucun point de planification (scheduling points), quotactl_block() ne cède jamais le CPU. Cela empêche ce CPU d'atteindre un état quiescent RCU. 5. synchronize_rcu() dans le thread de figeage (freezer) attend indéfiniment que le CPU de quotactl_block() signale un état quiescent. 6. quotactl_block() tourne en boucle indéfiniment en attendant que le freezer progresse, ce qu'il ne peut pas faire car il est bloqué sur la synchronisation RCU.
Cela entraîne un blocage du processus de figeage et une utilisation du CPU à 100 % par le processus de quota.
Bien que cela puisse se produire de manière intermittente sur les systèmes multi-cœurs, il est reproductible de manière fiable sur un nœud avec le script suivant, exécutant à la fois le freezer et la bascule de quota sur le même CPU :
# mkfs.ext4 -O quota /dev/sda 2g && mkdir a_mount # mount /dev/sda -o quota,usrquota,grpquota a_mount # taskset -c 3 bash -c "while true; do xfs_freeze -f a_mount; \ xfs_freeze -u a_mount; done" & # taskset -c 3 bash -c "while true; do quotaon a_mount; \ quotaoff a_mount; done" &
L'ajout de cond_resched() dans la boucle de réessai corrige le problème. Il agit comme un état quiescent RCU, permettant à synchronize_rcu() dans percpu_down_write() de se terminer.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.