{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-90103","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-11T19:38:34.786Z","datePublished":"2026-09-17T16:06:13.519Z","dateUpdated":"2026-09-18T17:53:02.167Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-09-18T17:53:02.167Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nNFSv4.2: fix LAYOUTSTATS send buffer exhaustion\n\nencode_layoutstats_maxsz budgets XDR_QUADLEN(PNFS_LAYOUTSTATS_MAXSIZE),\ni.e. 256 bytes, for the layoutupdate4 body written by the layout driver.\nThe flexfiles record can exceed that.\n\nff_layout_encode_ff_layoutupdate() emits, per data server, a netaddr4,\nan nfs_fh4, two ff_io_latency4, an nfstime4 and a bool.  A data server\nwhose filehandle is NFS_MAXFHSIZE bytes long already accounts for 132 of\nthose bytes, and the two ff_io_latency4 at 64 bytes each, the nfstime4\nand the bool add a further 144, so the body passes 256 bytes before the\nnetaddr4 is encoded at all.  encode_layoutstats() additionally writes\nthe deviceid4 and the layoutupdate4 lou_type word, neither of which the\nmacro accounts for.\n\nThe filehandle and the address are both chosen by the server, through\nLAYOUTGET and GETDEVICEINFO, so it can drive the encoder past the\nend of the send buffer.  xdr_reserve_space() returns NULL once that\nhappens, and the two ff_layout_encode_io_latency() calls run with\ndss_info->mirror->lock held, so a NULL return there leaves the lock\npermanently held.\n\nRaise PNFS_LAYOUTSTATS_MAXSIZE to 384 so that the record fits inside the\nreservation."}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","baseScore":7.5,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:N - The oversized nfs_fh4 and netaddr4 that exhaust the LAYOUTSTATS send buffer are taken from the MDS LAYOUTGET flexfiles blob (decode_nfs_fh in ff_layout_alloc_lseg) and GETDEVICEINFO body (nfs4_decode_mp_ds_addr via nfs4_ff_alloc_deviceid_node), delivered over NFSv4 RPC/TCP.\nAC:L - decode_nfs_fh accepts a server-chosen fh->size up to NFS_MAXFHSIZE, and ff_layout_mirror_prepare_stats encodes up to PNFS_LAYOUTSTATS_MAXDEV mirrors, so a hostile MDS can make nfs4_xdr_enc_layoutstats exceed encode_layoutstats_maxsz with no race or rare config.\nPR:N - The attacker is the NFSv4.2 pNFS metadata server that returns the LAYOUTGET/GETDEVICEINFO bodies; no local account, capability, or user-namespace privilege on the victim client is required once the flexfiles session exists.\nUI:N - On a pre-mounted NFSv4.2 flexfiles share (fstab, autofs, HPC/NAS), ordinary I/O hits nfs4_ff_layout_stat_io_start_read/write, and the MDS also sets report_interval in the LAYOUTGET blob so pnfs_report_layoutstat runs without further interactive victim action.\nS:U - The NULL dereference and stuck dss_info->mirror->lock occur in the NFS client LAYOUTSTATS encoder on the same host; this is not a VM escape, container breakout, or IOMMU/DMA boundary crossing.\nC:N - Once the send buffer is exhausted, xdr_reserve_space() returns NULL and ff_layout_encode_io_latency/xdr_encode_opaque dereference it; that is a fault, not an out-of-bounds read or use-after-free that would disclose kernel memory.\nI:N - xdr_get_next_encode_buffer refuses reservations that would exceed rq_snd_buf.buflen, so the encoder does not write past the RPC send buffer into adjacent objects; the subsequent NULL stores fault rather than providing a kernel write primitive.\nA:H - nfs4_xdr_enc_layoutstats then either BUG_ONs in reserve_space() or NULL-dereferences in ff_layout_encode_io_latency while holding dss_info->mirror->lock, oopsing the client and leaving that spinlock permanently taken so further flexfiles I/O hangs."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["include/linux/nfs_xdr.h"],"versions":[{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"842ac26615424577f24f0486b9d3bf97f28fad9c","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"397aa7000bbf6b6a0d32e66a544e978fb478c8e4","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"e82d7d999fe9f893f84bf332fd39cb5d9de7128f","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"5aca000630c0fd0da102ae1abf9245dd74f2ce36","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"cb11590c7ddc6883a1b1d70b1f98b2779fe626f2","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"3815b894b922e9b4f40b8b6f6d67bf80d44141c9","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"a973622da0c62c34043ddbbf382cd761b03e5136","status":"affected","versionType":"git"},{"version":"27c430644369ccd9a2272492ba6d0e85e2e4800b","lessThan":"c75ef2137e749f2673f0617cfdaae53b2bb7195a","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["include/linux/nfs_xdr.h"],"versions":[{"version":"4.2","status":"affected"},{"version":"0","lessThan":"4.2","status":"unaffected","versionType":"semver"},{"version":"5.10.270","lessThanOrEqual":"5.10.*","status":"unaffected","versionType":"semver"},{"version":"5.15.221","lessThanOrEqual":"5.15.*","status":"unaffected","versionType":"semver"},{"version":"6.1.188","lessThanOrEqual":"6.1.*","status":"unaffected","versionType":"semver"},{"version":"6.6.157","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.12.110","lessThanOrEqual":"6.12.*","status":"unaffected","versionType":"semver"},{"version":"6.18.52","lessThanOrEqual":"6.18.*","status":"unaffected","versionType":"semver"},{"version":"7.2.6","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":"4.2","versionEndExcluding":"5.10.270"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"5.15.221"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"6.1.188"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"6.6.157"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"6.12.110"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"6.18.52"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"7.2.6"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.2","versionEndExcluding":"7.3-rc1"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/842ac26615424577f24f0486b9d3bf97f28fad9c"},{"url":"https://git.kernel.org/stable/c/397aa7000bbf6b6a0d32e66a544e978fb478c8e4"},{"url":"https://git.kernel.org/stable/c/e82d7d999fe9f893f84bf332fd39cb5d9de7128f"},{"url":"https://git.kernel.org/stable/c/5aca000630c0fd0da102ae1abf9245dd74f2ce36"},{"url":"https://git.kernel.org/stable/c/cb11590c7ddc6883a1b1d70b1f98b2779fe626f2"},{"url":"https://git.kernel.org/stable/c/3815b894b922e9b4f40b8b6f6d67bf80d44141c9"},{"url":"https://git.kernel.org/stable/c/a973622da0c62c34043ddbbf382cd761b03e5136"},{"url":"https://git.kernel.org/stable/c/c75ef2137e749f2673f0617cfdaae53b2bb7195a"}],"title":"NFSv4.2: fix LAYOUTSTATS send buffer exhaustion","x_generator":{"engine":"bippy-1.2.0"}}}}