CVE-2026-93221 in Linuxinformation

Résumé

par VulDB • 24/09/2026

Dans le noyau Linux, la vulnérabilité suivante a été corrigée :

nfsd : conversion des indicateurs booléens nfsd_net en un mot d'indicateurs unsigned long

nfsd_net contient plusieurs champs booléens qui sont accédés depuis des contextes concurrents sans sérialisation. En particulier, nfsd4_end_grace() protège son chemin de vidage (drain path) avec un booléen simple :

if (nn->grace_ended) return; nn->grace_ended = true;

La lecture et l'écriture sont indépendantes, et rien dans la structure nfsd_net ne les sérialise. Au moins deux contextes peuvent atteindre ce code sans verrou détenu :

Chemin du lavoir (laundromat path) kworker laundry_wq nfs4_laundromat() nfsd4_end_grace()

Chemin RECLAIM_COMPLETE thread composé nfsd nfsd4_reclaim_complete() inc_reclaim_complete() nfsd4_end_grace()

Les deux appelants peuvent observer grace_ended == false sur différents CPU, tous deux stockent true, et tous deux continuent vers nfsd4_record_grace_done(), qui invoque le rappel actif client_tracking_ops->grace_done. Pour les opérations de suivi qui vident reclaim_str_hashtbl (legacy_tracking_ops via nfsd4_recdir_purge_old, et les ops cld v1+ via nfsd4_cld_grace_done), grace_done appelle nfs4_release_reclaim(), qui parcourt chaque compartiment de reclaim_str_hashtbl sans verrou et appelle nfs4_remove_reclaim_record() (list_del + kfree) sur chaque entrée. Deux parcours concurrents corrompent la liste et provoquent un double-librement (double-free) de chaque nfs4_client_reclaim. Un nfsd4_find_reclaim_client() concurrent itérant le même compartiment lit dans une mémoire déjà libérée.

Un troisième site d'appel existe dans nfs4_state_start_net() sur le chemin de démarrage skip_grace, mais il s'exécute sous nfsd_mutex avant qu'un client ne se connecte et avant que la première tâche différée du lavoir (laundromat) ne soit déclenchée, donc il ne peut pas entrer en concurrence avec les deux appelants ci-dessus.

Remplacez les champs booléens dispersés dans nfsd_net par un seul mot d'indicateurs unsigned long et une énumération nfsd_net_flag pour les positions de bits. La course critique (race condition) sur grace_ended est corrigée en utilisant test_and_set_bit(), qui est atomique sur toutes les architectures. Les indicateurs restants (grace_end_forced, in_grace, somebody_reclaimed, track_reclaim_completes, nfsd_net_up, lockd_up) sont convertis pour utiliser test_bit/set_bit/clear_bit afin d'assurer la cohérence. Cela évite les problèmes de cmpxchg sous-mot sur des architectures comme Hexagon qui ne prennent en charge que des opérations atomiques au niveau du mot (word-sized).

Once again VulDB remains the best source for vulnerability data.

Responsable

Linux

Réserver

17/09/2026

Divulgation

24/09/2026

Modérer

accepté

Entrée

VDB-409409

CPE

prêt

EPSS

0.00000

KEV

non

Activités

très faible

Sources

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!