CVE-2026-89670

CVE-2026-89670

High · published September 12, 2026

CVSS v3.1
7.8
EPSS
0%
Percentile
6.4
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

nfsd: hold rcu across localio cmpxchg retry

nfsd_file objects are freed via call_rcu (filecache.c:296), and

nfsd_file_slab is created without SLAB_TYPESAFE_BY_RCU

(KMEM_CACHE(nfsd_file, 0) at filecache.c:789), so the slab page

backing a freed nfsd_file becomes freely reclaimable once the RCU

grace period elapses.

The again: retry block in nfsd_open_local_fh() loads a pointer with

cmpxchg and then calls nfsd_file_get(new) (which is

refcount_inc_not_zero) without holding rcu_read_lock. The sole caller

nfs_open_local_fh() drops rcu_read_lock before invoking this helper,

so no outer reader-side critical section covers the load.

CPU 0 (nfsd_open_local_fh) CPU 1 (nfsd_file_put_local)

----- -----

new = cmpxchg(pnf, NULL, ...)

nf = xchg(pnf, NULL)

nfsd_file_put(nf)

last ref -> call_rcu()

/* grace period elapses;

slab page recycled */

nfsd_file_get(new)

refcount_inc_not_zero(&new->nf_ref)

/* operates on recycled memory */

A non-zero word at the nf_ref offset of the recycled object makes the

refcount bump appear to succeed, and the caller then dereferences

new->nf_net and new->nf_file out of freed memory.

Fix by taking rcu_read_lock() immediately before the cmpxchg and

releasing it on all three exits of the if (new) block: the goto-again

retry, the lost-race cleanup path, and the install-succeeded path.

nfsd_file_put() and nfsd_net_put() stay outside the RCU section so

they remain free to block.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00173 · 6.4th percentile
Published
2026-09-12T00:19Z
References (3)
EPSS history
Timeline
  • 13 SEP 03:23Z
    EPSS moved — → 0%
    epss
  • 11 SEP 19:45Z
    nfsd: hold rcu across localio cmpxchg retry
    cvelistv5