CVE-2026-93221 in Linux
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.