ZeroHour

CVE-2026-89707

large

Linux Kernel nfsd Reference Leak Lets NFS Clients Trigger Denial of Service

CVSS 3.1
7.5 high
EPSS
Published
()
Modified
AI analysis

The Linux kernel's NFS server contains a reference-count leak in nfsd_cross_mnt(): when follow_down() fails during a cross-mount traversal, the mntget()/dget() references taken on entry are never released because the error path skips path_put(). Any NFS client that can trigger a failed cross-mount lookup — for example a pre-cross d_manage() failure reached through nfsd_lookup_dentry or the NFSv4 READDIR encode path — causes the leak; the CVSS vector (AV:N/AC:L/PR:N) indicates no special privileges are needed beyond the ability to make NFS requests. Each failed attempt permanently increments mnt_count and d_count, pinning mounts so they cannot be unmounted and pinning dentries so the shrinker cannot reclaim them, eventually exhausting memory and degrading or halting the NFS service (availability impact only). Any machine running a kernel with the vulnerable nfsd code and actively exporting NFS filesystems — particularly exports that cross mount points — is affected. No public proof of concept is known and the issue is not in CISA's KEV, so exploitation is currently theoretical.

What to do: Apply kernel updates from your distribution as soon as a release containing the fix (the commit adding path_put(&path) before the goto out in the err < 0 arm of nfsd_cross_mnt()) is available. In the interim, restrict NFS exports and firewall port 2049 to trusted client networks only, and audit exports that use crossmnt or traverse mount points. On long-running NFS servers, watch for steadily growing mount/dentry reference counts or mounts that refuse to unmount, and plan a reboot to clear already-leaked references if symptoms appear.

Affected
Linux kernel
Estimated exposure
large≈ hundreds of thousands (10^5) of internet-reachable NFS servers, plus a larger uncounted internal population — Public internet scan services (Shodan/Censys) consistently show on the order of 10^5 hosts with NFS port 2049 open, while most NFS deployments sit on internal LANs reachable only by local clients, so the true at-risk population is larger.

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

In the Linux kernel, the following vulnerability has been resolved: nfsd: release path refs on follow_down() error nfsd_cross_mnt() initializes a local struct path with mntget() and dget() before calling follow_down(). On a negative return the error arm jumps to out without releasing those references: err = follow_down(&path, follow_flags); if (err < 0) goto out; follow_down() never drops the caller's entry-time refs on any error sub-case; for example a pre-cross d_manage() failure leaves path untouched, so the mntget()/dget() taken on entry survive the call. Every other early-exit arm in nfsd_cross_mnt() (other-namespace return, IS_ERR(exp2), and the success tail after the swap) already calls path_put(&path); the err < 0 arm is the lone omission. The leak inflates mnt_count and d_count on each failed cross-mount, blocking umount and pinning dentries against the shrinker, and is reachable by any authenticated NFS client through nfsd_lookup_dentry or the NFSv4 READDIR encode path. Fix by calling path_put(&path) before the goto out in the err < 0 arm so the entry-time refs are released on all follow_down() error returns.

Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

In the news

No ingested article mentions this CVE yet.