{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89668","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-11T19:38:34.745Z","datePublished":"2026-09-11T19:45:54.354Z","dateUpdated":"2026-09-13T06:32:50.192Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-09-13T06:32:50.192Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()\n\nnfsd_debugfs_init() runs before nfsd4_init_slabs() in init_nfsd().\nIf the slab allocation fails, the bare \"return retval\" bypasses\nnfsd_debugfs_exit(), leaving orphan debugfs files with stale fops\npointers into the freed module text.\n\nMove nfsd_debugfs_init() to after the slab init succeeds, so the\nearly return has no debugfs state to clean up.\n\nSince debugfs is now the more recently initialized of the two, also\nupdate the unwind paths to match reverse-initialization (LIFO) order:\nrun nfsd_debugfs_exit() before nfsd4_free_slabs() in both the\ninit_nfsd() error path and exit_nfsd(). The nfsd debugfs files only\nreference module-global state and have no dependency on the slab\ncaches, so that reordering is a cleanup with no functional change."}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - 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.\nAC:L - 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.\nPR:L - 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.\nUI:N - 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.\nS:U - 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.\nC:H - 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.\nI:H - 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.\nA:H - 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."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/nfsd/nfsctl.c"],"versions":[{"version":"9fe5ea760e64f04412dbed51645a0dac7220d40a","lessThan":"4ae5d7490ae6a7b83b3d607f88c499f4f85e753a","status":"affected","versionType":"git"},{"version":"9fe5ea760e64f04412dbed51645a0dac7220d40a","lessThan":"ab43ff94f5dfc2b6a080b167b69855eb7655c98b","status":"affected","versionType":"git"},{"version":"9fe5ea760e64f04412dbed51645a0dac7220d40a","lessThan":"2c390c8a1764d67095fe444401861fac4c049362","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/nfsd/nfsctl.c"],"versions":[{"version":"6.16","status":"affected"},{"version":"0","lessThan":"6.16","status":"unaffected","versionType":"semver"},{"version":"6.18.50","lessThanOrEqual":"6.18.*","status":"unaffected","versionType":"semver"},{"version":"7.2.4","lessThanOrEqual":"7.2.*","status":"unaffected","versionType":"semver"},{"version":"7.3-rc1","lessThanOrEqual":"*","status":"unaffected","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.16","versionEndExcluding":"6.18.50"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.16","versionEndExcluding":"7.2.4"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.16","versionEndExcluding":"7.3-rc1"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/4ae5d7490ae6a7b83b3d607f88c499f4f85e753a"},{"url":"https://git.kernel.org/stable/c/ab43ff94f5dfc2b6a080b167b69855eb7655c98b"},{"url":"https://git.kernel.org/stable/c/2c390c8a1764d67095fe444401861fac4c049362"}],"title":"nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()","x_generator":{"engine":"bippy-1.2.0"}}}}