data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-90234 in the interactive tracker

CVE-2026-90234

NFS: Return a delegation the client fails to record

7.5 EPSS 0.6% AV:N

Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem fs/nfs. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2026-90234 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormvulnerable6.1.190-1No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication.
Debian 13trixievulnerable6.12.113-1No fix published anywhere yet, neither in Debian nor upstream for the series trixie tracks. Watch the Debian tracker page for this CVE. Advisories for trixie have historically landed a median of 11 days after publication.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

When an NFS server grants a delegation in an OPEN reply, nfs_inode_set_delegation() records it on the client. However, three of its error flows return without sending DELEGRETURN. A delegation can be relinquished only by DELEGRETURN (RFC 8881 Section 20.2.4), so dropping one silently leaves the server believing the client still holds it. If the server happens to recall that delegation, the client answers CB_RECALL with NFS4ERR_BADHANDLE because it has no record of the stateid. The server revokes the delegation and moves it onto its cl_revoked list, because the client never sends the FREE_STATEID that would drain it. Every subsequent SEQUENCE reply then carries SEQ4_STATUS_RECALLABLE_STATE_REVOKED, and the client's state manager loops issuing TEST_STATEID across its delegations without ever clearing the condition. The window is easy to reach now that a server offers a write delegation on any write OPEN: a delegation recalled for one opener races a re-open that the server answers with a fresh write delegation. Instead of dropping it, hand the delegation back during these error flows.

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

fs/nfs/delegation.c

What this is
NFS, SUNRPC, AND LOCKD CLIENTSMAINTAINERS section matched on fs/nfs/ · linux-nfs@vger.kernel.org · Maintained
Kernel module
nfsv4

Check it on the machine

grep -wE 'CONFIG_NFS_FS|CONFIG_NFS_V4' /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

lsmod | grep -w nfsv4

Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.

Show whether Debian builds this, per release

Debian builds this as a loadable module. Every release below compiles it as a module on every flavour, so whether the code is in the running kernel depends on whether that module is loaded.

  • bookworm, trixie, forky, sidm
m
a loadable module on every flavour - check lsmod, can be blacklisted
Build switches
CONFIG_NFS_FS, CONFIG_NFS_V4
Reads as
all on means the file is compiled; any one off means it is not.

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-17 (31 days ago)source
CVSS
7.5 high
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:Hsource recompute it
Attack vector
network (AV:N)source
EPSS
0.61%, higher than 48.1% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
fs/nfs

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
4.06.18.576822ba1ae9b6
4.07.2.692533e49fe3c
4.07.3220af23d8639

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:NAttack vector, network
nfs_inode_set_delegation() is reached from nfs4_process_delegation() after _nfs4_opendata_to_nfs4_state() consumes an NFSv4 OPEN reply; decode_rw_delegation() takes the WRITE open_delegation4 (stateid, want_recall) off that TCP ONC RPC reply, so the remote NFS server supplies the delegation the client then drops without DELEGRETURN.
AC:LAttack complexity, low
When the inode's old delegation has NFS_DELEGATION_RETURNING set, a concurrent write OPEN whose reply carries a different write stateid hits test_and_set_bit(NFS_DELEGATION_RETURNING) or a failed nfs_detach_delegations_locked() and is freed without nfs_do_return_delegation(); nfs4_callback_recall() queues that return and the server can delay DELEGRETURN, so it times both RPCs.
PR:NPrivileges required, none
nfs4_process_delegation() and nfs4_callback_recall() run on the established NFSv4 session with no capable() or local uid check; the attacker is the NFS server peer that authored the OPEN reply and CB_RECALL and needs no account or mount privilege on the client.
UI:NUser interaction, none
On an already-mounted NFSv4 share, ordinary open() through nfs4_atomic_open()/nfs4_file_open() drives the OPEN RPC; the server plants the unrecorded WRITE delegation in that reply and sends CB_RECALL, with no further victim action such as mounting a new image.
S:UScope, unchanged
The nfs4_state_manager() recovery loop and nfs4_begin_drain_session() of cl_session stay inside the NFS client kernel; this does not cross a VM, IOMMU, or sandbox boundary.
C:NConfidentiality impact, none
The dropped object is a kmalloc'd nfs_delegation that was never published on nfsi->delegation; __nfs_free_delegation() frees it immediately, with no use-after-free, out-of-bounds read, or leftover pointer that could disclose kernel memory.
I:NIntegrity impact, none
The same unused nfs_delegation is only kfree_rcu'd; nfs_inode_set_delegation() does not write through a dangling pointer or overflow a buffer, so there is no arbitrary write or control-flow hijack.
A:HAvailability impact, high
After CB_RECALL of the orphaned stateid, nfs_delegation_find_inode() misses it so nfs4_callback_recall() returns NFS4ERR_BADHANDLE; SEQ4_STATUS_RECALLABLE_STATE_REVOKED then makes nfs41_handle_recallable_state_revoked() reschedule nfs_test_expired_all_delegations() forever, and nfs4_begin_drain_session() hangs subsequent NFSv4 RPCs.