{"id":"CVE-2026-74315","state":"PUBLISHED","title":"lockd: Avoid hashing uninitialized bytes in nlm4svc_lookup_file()","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nlockd: Avoid hashing uninitialized bytes in nlm4svc_lookup_file()\n\nfile_hash() digests the first LOCKD_FH_HASH_SIZE bytes of\nnfs_fh.data when bucketing nlm_files[], independent of fh.size.\nCommit 3de744ee4e45 (\"lockd: Use xdrgen XDR functions for the\nNLMv4 TEST procedure\") set .pc_argzero to zero for the converted\nprocedures and moved file-handle population into\nnlm4svc_lookup_file(), which copies only xdr_lock->fh.len bytes\ninto lock->fh.data.\n\nWhen an NLMv4 client presents a file handle shorter than\nLOCKD_FH_HASH_SIZE, bytes fh.len..31 retain whatever the argument\nbuffer held from an earlier request.  The same wire handle then\nhashes to different buckets across calls; nlm_lookup_file() misses\nthe existing nlm_file entry, and lock-state lookups fail.\n\nZero only the tail bytes that file_hash() would otherwise consume.\nHandles of LOCKD_FH_HASH_SIZE or larger already populate every byte\nthat file_hash() reads.","publishedAt":"2026-08-15T05:58:13.504Z","updatedAt":"2026-08-17T05:45:48.282Z","severity":{"score":9.8,"label":"Critical","version":"3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"3de744ee4e4557da0d63be8a97ad44b4dad58912","status":"affected","lessThan":"686c2434f9f16b87aeed18d76cc562df9f2695ab","versionType":"git"},{"version":"3de744ee4e4557da0d63be8a97ad44b4dad58912","status":"affected","lessThan":"6e4c62caecf792e8a15ad9bc7f371e57c17e3302","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/lockd/lockd.h","fs/lockd/svc4proc.c","fs/lockd/svcsubs.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"7.1","status":"affected"},{"version":"0","status":"unaffected","lessThan":"7.1","versionType":"semver"},{"version":"7.1.5","status":"unaffected","lessThanOrEqual":"7.1.*","versionType":"semver"},{"version":"7.2","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/lockd/lockd.h","fs/lockd/svc4proc.c","fs/lockd/svcsubs.c"]}],"references":["https://git.kernel.org/stable/c/686c2434f9f16b87aeed18d76cc562df9f2695ab","https://git.kernel.org/stable/c/6e4c62caecf792e8a15ad9bc7f371e57c17e3302"],"weaknesses":[],"ingestedAt":"2026-10-29T20:12:58.252Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/74xxx/CVE-2026-74315.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-74315","state":"PUBLISHED","datePublished":"2026-08-15T05:58:13.504Z","dateUpdated":"2026-08-17T05:45:48.282Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-08-15T05:44:03.883Z"},"containers":{"cna":{"title":"lockd: Avoid hashing uninitialized bytes in nlm4svc_lookup_file()","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nlockd: Avoid hashing uninitialized bytes in nlm4svc_lookup_file()\n\nfile_hash() digests the first LOCKD_FH_HASH_SIZE bytes of\nnfs_fh.data when bucketing nlm_files[], independent of fh.size.\nCommit 3de744ee4e45 (\"lockd: Use xdrgen XDR functions for the\nNLMv4 TEST procedure\") set .pc_argzero to zero for the converted\nprocedures and moved file-handle population into\nnlm4svc_lookup_file(), which copies only xdr_lock->fh.len bytes\ninto lock->fh.data.\n\nWhen an NLMv4 client presents a file handle shorter than\nLOCKD_FH_HASH_SIZE, bytes fh.len..31 retain whatever the argument\nbuffer held from an earlier request.  The same wire handle then\nhashes to different buckets across calls; nlm_lookup_file() misses\nthe existing nlm_file entry, and lock-state lookups fail.\n\nZero only the tail bytes that file_hash() would otherwise consume.\nHandles of LOCKD_FH_HASH_SIZE or larger already populate every byte\nthat file_hash() reads."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"3de744ee4e4557da0d63be8a97ad44b4dad58912","status":"affected","lessThan":"686c2434f9f16b87aeed18d76cc562df9f2695ab","versionType":"git"},{"version":"3de744ee4e4557da0d63be8a97ad44b4dad58912","status":"affected","lessThan":"6e4c62caecf792e8a15ad9bc7f371e57c17e3302","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/lockd/lockd.h","fs/lockd/svc4proc.c","fs/lockd/svcsubs.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"7.1","status":"affected"},{"version":"0","status":"unaffected","lessThan":"7.1","versionType":"semver"},{"version":"7.1.5","status":"unaffected","lessThanOrEqual":"7.1.*","versionType":"semver"},{"version":"7.2","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/lockd/lockd.h","fs/lockd/svc4proc.c","fs/lockd/svcsubs.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/686c2434f9f16b87aeed18d76cc562df9f2695ab"},{"url":"https://git.kernel.org/stable/c/6e4c62caecf792e8a15ad9bc7f371e57c17e3302"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","baseScore":9.8,"baseSeverity":"CRITICAL"},"scenarios":[{"lang":"en","value":"AV:N - The bug is reached via remote NLMv4 RPC to in-kernel lockd (TCP/UDP SunRPC, typically alongside nfsd), from svc_process() through nlm4svc_proc_* handlers into nlm4svc_lookup_file() and nlm_lookup_file().\nAC:L - An NFS client can reliably trigger this by sending NLMv4 LOCK/TEST/SHARE/etc. with a file handle shorter than 32 bytes; stale tail bytes come from the same worker's prior RPC argument buffer, which the attacker can influence with earlier requests.\nPR:N - lockd_authenticate() accepts RPC_AUTH_NULL/RPC_AUTH_UNIX and, for normal procedures, svc_set_client(); no local UID, capabilities, or root in the host namespace is required—only network reachability as an NFS export client (AUTH_NULL is explicitly supported for NLM).\nUI:N - Exploitation requires only crafted NLMv4 RPC traffic to a running lockd/nfsd instance; no victim mount, file open, or other interactive action beyond normal NFS client participation.\nS:U - Impact is confined to the NFS server's kernel lockd/nfsd authority (file-lock and DOS-share state on exported files); it does not cross VM, container, or IOMMU security boundaries.\nC:H - file_hash() sums the first 32 bytes of nfs_fh.data regardless of fh.size; when fh.len<32, bytes fh.len..31 are stale prior-request buffer contents, so each lookup performs an out-of-bounds read of up to 31 bytes used in security-relevant file-table indexing.\nI:H - Inconsistent hashing creates duplicate nlm_file entries for the same wire handle; per-entry f_shares and nlm_block state diverge while both open the same inode, enabling DOS share-mode bypass and incorrect lock/block bookkeeping despite VFS-level enforcement.\nA:H - Missed nlm_file lookups cause lock-state lookup failures, incorrect NLM responses, hung or failing NFS lock clients, and unbounded duplicate nlm_file/VFS opens that can exhaust server lock-manager resources on production NFS file servers."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-08-17T05:45:48.282Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.1","versionEndExcluding":"7.1.5"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.1","versionEndExcluding":"7.2"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}