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

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

CVE-2026-89668

nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()

7.8 EPSS 0.2% AV:L

Published 2026-09-11 (37 days ago) by the Linux kernel CNA. Subsystem fs/nfsd. Debian urgency: unimportant.

What to do, per Debian release

Debian's own status for CVE-2026-89668 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 12bookwormnot affected6.1.190-1Nothing to do. bookworm never shipped the vulnerable code.
Debian 13trixienot affected6.12.113-1Nothing to do. trixie never shipped the vulnerable code.
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

nfsd_debugfs_init() runs before nfsd4_init_slabs() in init_nfsd(). If the slab allocation fails, the bare "return retval" bypasses nfsd_debugfs_exit(), leaving orphan debugfs files with stale fops pointers into the freed module text. Move nfsd_debugfs_init() to after the slab init succeeds, so the early return has no debugfs state to clean up. Since debugfs is now the more recently initialized of the two, also update the unwind paths to match reverse-initialization (LIFO) order: run nfsd_debugfs_exit() before nfsd4_free_slabs() in both the init_nfsd() error path and exit_nfsd(). The nfsd debugfs files only reference module-global state and have no dependency on the slab caches, so that reordering is a cleanup with no functional change.

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/nfsd/nfsctl.c

What this is
KERNEL NFSD, SUNRPC, AND LOCKD SERVERSMAINTAINERS section matched on fs/nfsd/ · linux-nfs@vger.kernel.org · Supported
Kernel module
nfsd

Check it on the machine

grep -w CONFIG_NFSD /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 nfsd

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 switch
CONFIG_NFSD

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-11 (37 days ago)source
CVSS
7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.18%, higher than 7.4% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
fs/nfsd

Upstream fixes

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

IntroducedFixed inCommit
6.166.18.504ae5d7490ae6
6.167.2.4ab43ff94f5df
6.167.32c390c8a1764

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:LAttack vector, local
The stale fops are reached only by a local open of leftover /sys/kernel/debug/nfsd files after a failed nfsd.ko load; init_nfsd() is module init, not NFS RPC dispatch, so a remote NFS peer cannot dereference the orphan debugfs inodes.
AC:LAttack complexity, low
An attacker can force nfsd autoload via mount -t nfsd (get_fs_type() calls request_module("fs-nfsd") before mount_capable()) while applying memory pressure so nfsd4_init_slabs() KMEM_CACHE allocations fail; once the module is freed, opening the orphan debugfs files hits the stale fops deterministically.
PR:LPrivileges required, low
request_module("fs-nfsd") runs in get_fs_type() before any capability check, so an unprivileged user namespace can trigger the failed init; leftover files are created 0644/S_IRUGO, and on common debugfs deployments (embedded/Android, mode=755) any local user can open them without capabilities.
UI:NUser interaction, none
The attacker performs the autoload, memory-pressure, and debugfs open sequence from their own process; no separate victim must start nfsd, mount a filesystem, or otherwise interact.
S:UScope, unchanged
The leftover debugfs inodes and the use-after-free of nfsd module text stay inside the host kernel's address space; this is a local privilege-escalation primitive and does not cross a VM, IOMMU, or sandbox boundary.
C:HConfidentiality impact, high
Opening the orphan files is a use-after-free of module text: __debugfs_file_get() and open_proxy_open() dereference DEBUGFS_I()->real_fops in the unloaded nfsd image, and reclaiming that memory lets the attacker disclose arbitrary kernel contents through the reused fops object.
I:HIntegrity impact, high
The leftover inodes hold pointers to nfsd_dsr_fops and nfsd_io_cache_*_fops in freed module memory; after reclaim the attacker controls those file_operations, so open_proxy_open()'s replace_fops() and ->open install attacker-controlled callbacks and yield arbitrary write and code execution.
A:HAvailability impact, high
Any open of leftover /sys/kernel/debug/nfsd files dereferences unmapped or reused module text (ops->llseek/read/owner in __debugfs_file_get/open_proxy_open), which oopses or panics the kernel even when the UAF is not fully turned into a write primitive.