Look up another CVE · open CVE-2026-89664 in the interactive tracker
CVE-2026-89664
nfsd: release OPEN-decoded posix ACLs via op_release
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-89664 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
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | not affected | 6.1.190-1 | Nothing to do. bookworm never shipped the vulnerable code. |
| Debian 13trixie | not affected | 6.12.113-1 | Nothing to do. trixie never shipped the vulnerable code. |
| Debian 14forky | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.6-1 | Update 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
nfsd4_decode_createhow4() calls nfsd4_decode_fattr4(), which allocates refcounted struct posix_acl objects via posix_acl_alloc() and stores them in open->op_pacl and open->op_dpacl. These pointers must be released once the OPEN compound finishes. When nfsd4_decode_open_claim4() returns a non-seqid-mutating error, the dispatcher short-circuits before op_func runs: nfsd4_proc_compound() if (op->status && op->opnum == OP_OPEN) op->status = nfsd4_open_omfg(...) if (!seqid_mutating_err(ntohl(op->status))) return op->status; /* nfsd4_open() never runs */ ... opdesc->op_release(&op->u) /* must still release op_pacl/op_dpacl */ Before this change OP_OPEN had no .op_release in nfsd4_ops[], and the release pair lived inside nfsd4_open() at its out_err: label. On the short-circuit path nfsd4_open() is never invoked, so both posix_acl refs leak on every malformed OPEN compound that carries valid POSIX ACL createhow4 attributes. Add nfsd4_open_release() and wire it as .op_release for OP_OPEN. posix_acl_release() is NULL-safe, so the single release site covers both the normal path and the nfsd4_open_omfg short-circuit. Remove the matching posix_acl_release() pair from nfsd4_open()'s out_err: label to avoid double-releasing. The compound loop has two encoding branches: nfsd4_encode_operation() for normal ops, and nfsd4_encode_replay() for v4.0 replayed ops. op_release was only called from nfsd4_encode_operation(), so resources attached to op->u leak on the replay path. Move the op_release() call out of nfsd4_encode_operation() and the replay branch, placing it after the if-else in nfsd4_proc_compound(). This gives a single call site in a fairly obviously-correct place, covering both the normal encoding and replay paths.
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/nfs4proc.c
fs/nfsd/nfs4xdr.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 -wE 'CONFIG_NFSD|CONFIG_NFSD_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 nfsdPrints 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_NFSD, CONFIG_NFSD_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-11 (37 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.49%, higher than 40.6% 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
| Introduced | Fixed in | Commit |
|---|---|---|
| 7.0 | 7.2.4 | 5b3a7d7c23c0 |
| 7.0 | 7.3 | 8215892993ea |
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
- The leak is in nfsd NFSv4 OPEN XDR decoding (nfsd4_decode_createhow4 → nfsd4_decode_fattr4 → posix_acl_alloc), reached over the network via COMPOUND RPCs on TCP/UDP port 2049 when the in-kernel NFS server is running.
- AC:LAttack complexity, low
- An attacker can deterministically leak the ACLs by sending OPEN with CREATE and valid POSIX ACL attributes, then a non-seqid-mutating decode error such as NFS4ERR_BADXDR on open_claim4, so nfsd4_open() never runs; no race or luck is required.
- PR:NPrivileges required, none
- OPEN decode allocates the posix_acl objects after spoofable RPC AUTH_UNIX and before nfsd4_open(), fh_verify(), export permission checks, or clientid/session validation, so no authenticated NFS identity or local account on the server is required.
- UI:NUser interaction, none
- The attacker triggers the leak solely by sending crafted NFSv4 COMPOUND packets; no victim user must mount a filesystem, open a file, or take any other action.
- S:UScope, unchanged
- Impact is confined to kernel slab consumption on the NFS server host and does not cross a VM, guest, sandbox, or IOMMU security boundary.
- C:NConfidentiality impact, none
- This is a refcount leak of attacker-supplied posix_acl allocations with no out-of-bounds read, use-after-free, or other primitive that could disclose kernel or file data.
- I:NIntegrity impact, none
- The short-circuit path never runs nfsd4_open() or writes file/ACL metadata; the only effect is orphaned kmalloc objects, with no memory corruption or unauthorized modification.
- A:HAvailability impact, high
- Each malformed OPEN permanently leaks up to two posix_acl objects (NFS_ACL_MAX_ENTRIES=1024, about 16KB each) for the server lifetime; repeating the request exhausts kernel memory and can OOM the NFS server and co-hosted workloads.