CVE-2026-93221 in Linuxinformazioni

Riassunto

di VulDB • 24/09/2026

Nel kernel Linux è stata risolta la seguente vulnerabilità:

nfsd: conversione dei flag booleani di nfsd_net in una parola di flags unsigned long

nfsd_net contiene diversi campi booleani che vengono accessibili da contesti concorrenti senza serializzazione. In particolare, nfsd4_end_grace() protegge il suo percorso di drain con un semplice bool:

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

La lettura e la scrittura sono indipendenti e nulla in struct nfsd_net le serializza. Almeno due contesti possono raggiungere questo codice senza alcun lock detenuto:

percorso del laundromat kworker laundry_wq nfs4_laundromat() nfsd4_end_grace()

percorso RECLAIM_COMPLETE kthread compound di nfsd nfsd4_reclaim_complete() inc_reclaim_complete() nfsd4_end_grace()

Entrambi i chiamanti possono osservare grace_ended == false su CPU diverse, entrambi impostano true e procedono verso nfsd4_record_grace_done(), che invoca il callback active client_tracking_ops->grace_done. Per le tracking ops che effettuano il drain di reclaim_str_hashtbl (legacy_tracking_ops tramite nfsd4_recdir_purge_old e le cld v1+ ops tramite nfsd4_cld_grace_done), grace_done chiama nfs4_release_reclaim(), che attraversa ogni bucket di reclaim_str_hashtbl senza lock e chiama nfs4_remove_reclaim_record() (list_del + kfree) su ciascuna voce. Due walker concorrenti corrompono la lista e causano un double-free di ogni nfs4_client_reclaim. Un concurrente nfsd4_find_reclaim_client() che itera lo stesso bucket legge attraverso memoria già liberata.

Esiste un terzo sito di chiamata in nfs4_state_start_net() sul percorso skip_grace dell'avvio, ma viene eseguito sotto nfsd_mutex prima che qualsiasi client si connetta e prima che il primo lavoro ritardato del laundromat venga attivato, quindi non può andare in race con i due chiamanti sopra.

Sostituire i campi booleani sparsi in nfsd_net con una singola parola di flags unsigned long e un enum nfsd_net_flag per le posizioni dei bit. La race su grace_ended è risolta utilizzando test_and_set_bit(), che è atomico su tutte le architetture. I flag rimanenti (grace_end_forced, in_grace, somebody_reclaimed, track_reclaim_completes, nfsd_net_up, lockd_up) sono convertiti per utilizzare test_bit/set_bit/clear_bit per coerenza. Questo evita problemi di cmpxchg sub-word su architetture come Hexagon che supportano solo operazioni atomiche a livello di parola (word-sized).

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Responsabile

Linux

Prenotare

17/09/2026

Divulgazione

24/09/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Do you know our Splunk app?

Download it now for free!