CVE-2026-89713 PUBLISHED

NFSD: check truncate permission under inode lock

Assigner: Linux
Reserved: 11.09.2026 Published: 11.09.2026 Updated: 13.09.2026

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

NFSD: check truncate permission under inode lock

nfsd_setattr() checks whether a size update needs NFSD_MAY_TRUNC before it takes inode_lock(). The comparison uses the file size sampled by that unlocked read, but the actual ATTR_SIZE update is applied later under inode_lock() by notify_change().

This leaves a TOCTOU window for append-only files. If a client sends a SETATTR that does not shrink the file at the time of the unlocked sample, a concurrent append can extend the file before nfsd_setattr() takes inode_lock(). notify_change() then applies a real truncation without the NFSD_MAY_TRUNC check that rejects IS_APPEND(inode). The VFS truncate syscall paths perform their own append-only checks before calling notify_change(), so NFSD must make this decision against the locked size it is about to change.

Split the write-count acquisition from the truncation permission check. Keep get_write_access() before the locked setattr work, then recheck whether the requested size is below i_size_read(inode) after inode_lock() has been acquired and before notify_change(ATTR_SIZE). This also avoids the plain unlocked inode->i_size load.

Metrics

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

AV:N - nfsd_setattr() is reached from in-kernel nfsd NFSv2/v3 SETATTR and NFSv4 SETATTR (including ONE_STATEID) over TCP/UDP 2049, so a remote client triggers the TOCTOU without local shell access. AC:L - The attacker drives both sides of the race by issuing concurrent SETATTR size RPCs, or racing SETATTR against O_APPEND writes they perform themselves; a non-shrinking unlocked i_size sample then becomes a real truncate under inode_lock. No victim-only layout is required. PR:N - Default nfsd exports accept AUTH_SYS and AUTH_NULL with no cryptographic authentication, so the client asserts uid/gid. ATTR_SIZE uses fh_verify(NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE), which is satisfied by spoofing the file owner's uid. UI:N - The attacking NFS client sends SETATTR itself. No administrator or end-user action on the server is required beyond nfsd already serving a writable export. S:U - The skipped IS_APPEND check and the resulting notify_change(ATTR_SIZE) truncate affect only the exported filesystem in the same kernel security authority as nfsd. This is not a VM, IOMMU, or sandbox escape. C:N - The bug only omits NFSD_MAY_TRUNC for IS_APPEND before a locked size update. It does not read kernel memory, leak pointers, or disclose file contents beyond ordinary authorized NFS access. I:H - Winning the TOCTOU lets notify_change() apply ATTR_SIZE to an IS_APPEND inode, bypassing the append-only truncation ban that VFS truncate/ftruncate enforce, so a remote client can destroy data that chattr +a is meant to keep immutable, including concurrent log and audit appends. A:H - Unauthorized truncation of append-only operational logs, databases, or other files that services depend on can persistently destroy that live content and deny use of it until restored, and the attacker can repeat the race at will against further files.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 783112f7401ff449d979530209b3f6c2594fdb4e to 3afa17d93ba8c925f49370c816c6dae5112d8c24 (excl.)
  • affected from 783112f7401ff449d979530209b3f6c2594fdb4e to d8352da196349182e1afd5a93308256cddc0a97d (excl.)
  • affected from 783112f7401ff449d979530209b3f6c2594fdb4e to 44086254479035de42ca3d286ecf25521d4e6325 (excl.)
  • affected from 783112f7401ff449d979530209b3f6c2594fdb4e to b778e0e0a16759f22a70579c3cf8d254a40d4a7f (excl.)
  • Version 604a3c407026d6162d15300478e63f901e435efc is affected
  • Version cc4d5dc73841b98d33cdfb9822d70b0aac4beca5 is affected
  • Version 3ee4f442e5b37a537297b812557b1163f96b5399 is affected
  • Version a3c6cbc4eac4473ed5461d5faae2794d3e5c0e44 is affected
  • Version 982898d7f97a35447403c3fcecc0d96c646ce101 is affected
  • affected from 3.2.89 to 3.3 (excl.)
  • affected from 3.16.44 to 3.17 (excl.)
  • affected from 4.4.53 to 4.5 (excl.)
  • affected from 4.9.14 to 4.10 (excl.)
  • affected from 4.10.2 to 4.11 (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 4.11 is affected
  • unaffected from 0 to 4.11 (excl.)
  • unaffected from 6.12.109 to 6.12.* (incl.)
  • unaffected from 6.18.50 to 6.18.* (incl.)
  • unaffected from 7.2.4 to 7.2.* (incl.)
  • unaffected from 7.3-rc1 to * (incl.)

References