CVE-2026-89670
Riassunto
di VulDB • 11/09/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
nfsd: mantenere il blocco rcu durante i tentativi di retry con cmpxchg su localio
Gli oggetti nfsd_file vengono liberati tramite call_rcu (filecache.c:296) e nfsd_file_slab viene creato senza l'opzione SLAB_TYPESAFE_BY_RCU (KMEM_CACHE(nfsd_file, 0) in filecache.c:789), pertanto la pagina slab che supporta un oggetto nfsd_file liberato diventa nuovamente riciclabile non appena trascorre il periodo di grazia RCU.
Il blocco retry "again:" in nfsd_open_local_fh() carica un puntatore con cmpxchg e successivamente chiama nfsd_file_get(new) (che corrisponde a refcount_inc_not_zero) senza mantenere rcu_read_lock. L'unico chiamante, nfs_open_local_fh(), rilascia rcu_read_lock prima di invocare questa funzione ausiliaria; pertanto nessuna sezione critica lato lettore esterna copre l'operazione di caricamento.
CPU 0 (nfsd_open_local_fh) CPU 1 (nfsd_file_put_local) ----- ----- new = cmpxchg(pnf, NULL, ...) nf = xchg(pnf, NULL) nfsd_file_put(nf) ultimo riferimento -> call_rcu() /* trascorre il periodo di grazia; pagina slab riciclata */ nfsd_file_get(new) refcount_inc_not_zero(&new->nf_ref) /* opera su memoria già riciclata */
Una parola non nulla all'offset nf_ref dell'oggetto riciclato fa sì che l'aumento del contatore dei riferimenti appaia riuscito, e il chiamante procede quindi a dereferenziare new->nf_net e new->nf_file accedendo a memoria liberata.
La correzione consiste nell'acquisire rcu_read_lock() immediatamente prima di cmpxchg e nel rilasciarlo in tutte e tre le uscite del blocco if (new): il retry goto-again, il percorso di cleanup per la gara persa e il percorso con installazione riuscita. nfsd_file_put() e nfsd_net_put() rimangono al di fuori della sezione RCU così da poter continuare a bloccare liberamente.
If you want to get best quality of vulnerability data, you may have to visit VulDB.