CVE-2026-89671

CVE-2026-89671

Critical · published September 12, 2026

CVSS v3.1
9.1
EPSS
1%
Percentile
42.0
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

nfsd: gate nfs3 setacl by argp->mask

nfsd3_proc_setacl() calls set_posix_acl() unconditionally for both

ACL_TYPE_ACCESS and ACL_TYPE_DEFAULT, passing argp->acl_access and

argp->acl_default verbatim. The NFSv3 ACL decoder only populates

those pointers when the corresponding mask bit is set:

nfs3svc_decode_setaclargs()

if (args->mask & NFS_ACL) decode into acl_access

if (args->mask & NFS_DFACL) decode into acl_default

/* otherwise the pointer stays NULL (pc_argzero) */

nfsd3_proc_setacl()

set_posix_acl(.., ACL_TYPE_ACCESS, argp->acl_access)

set_posix_acl(.., ACL_TYPE_DEFAULT, argp->acl_default)

set_posix_acl(idmap, dentry, type, NULL) is the VFS "remove this

ACL type" operation. A NULL pointer that means "the client did not

send this arm" is therefore indistinguishable from "the client

asked to remove this ACL". A SETACL with mask=NFS_ACL silently

drops the directory's default ACL; mask=0 drops both.

The sibling nfsd3_proc_getacl() already consults argp->mask before

touching each arm; mirror that in setacl.

Fix by wrapping each set_posix_acl() call in the matching mask bit

check and initializing error to 0 before inode_lock so that a

request with neither bit set leaves the on-disk ACLs untouched and

returns nfs_ok. The out_drop_lock path and the unconditional

posix_acl_release() at out: are preserved; both NULL-tolerate the

skipped arms.

The record
Technical detail
CVSS v3.1
9.1 · CRITICAL
Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
CVSS v4.0
Not supplied
EPSS
0.00501 · 42.0th percentile
Published
2026-09-12T00:19Z
References (5)
EPSS history
Timeline
  • 13 SEP 03:23Z
    EPSS moved — → 0%
    epss
  • 11 SEP 19:45Z
    nfsd: gate nfs3 setacl by argp->mask
    cvelistv5