CVE-2026-89702

nfsd: size fh_verify server sockaddr slot by xpt_locallen

State
Published
Severity
9.8 Critical
Published
Sep 11, 2026
Updated
Oct 30, 2026
Reserved
Sep 11, 2026

Read the record on cve.org

Description

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

nfsd: size fh_verify server sockaddr slot by xpt_locallen

The nfsd_fh_verify and nfsd_fh_verify_err tracepoints declare the server sockaddr slot sized by xpt_remotelen but fill it from xpt_local using xpt_locallen:

TP_STRUCT__entry( ... __sockaddr(server, rqstp->rq_xprt->xpt_remotelen) ... ) TP_fast_assign( ... __assign_sockaddr(server, &rqstp->rq_xprt->xpt_local, rqstp->rq_xprt->xpt_locallen); ... )

When xpt_locallen exceeds xpt_remotelen, __assign_sockaddr's memcpy writes past the reserved ring-buffer slot. In the reverse direction (xpt_locallen < xpt_remotelen) the slot is oversized and the unwritten tail leaks prior ring-buffer contents to trace consumers.

The write-past-end case is reachable on NFS/UDP. svc_xprt_set_remote() is only called from svc_tcp_accept() (net/sunrpc/svcsock.c) and from the RDMA connect path; svc_create_socket() for UDP calls only svc_xprt_set_local(), so xpt_remotelen stays 0 for the xprt's lifetime. Every fh_verify trace for an NFSv2/v3-over-UDP request then copies 16 or 28 bytes from xpt_local into a zero-byte slot.

The other NFSD tracepoints that record the server address (NFSD_TRACE_PROC_CALL_FIELDS, NFSD_TRACE_PROC_RES_FIELDS, SVC_RQST_ENDPOINT_FIELDS) already size the server slot by xpt_locallen; nfsd_fh_verify and nfsd_fh_verify_err were the only exceptions.

Fix by sizing the server slot with xpt_locallen so the declared slot matches the copy length. The client slot and its assignment already agree on xpt_remotelen and are left untouched.

Scores

CVSSScoreVectorSource
3.19.8 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HLinux

Weaknesses

The record names no weakness.

Affected Products

ProductVersions
LinuxLinux
  • dcbebc86850324fbe0a993ce352f0539cd98038a to before 4c7569ad68fc8b86ca40c7e56ef21460c0344955Affected
  • 051382885552e12541cc0ebf82092be374a9ed2a to before 50d9d581d2af80799125ee62617d37e9b6b476a7Affected
  • 051382885552e12541cc0ebf82092be374a9ed2a to before 1c6a4d6c20fd42552ffc2c3dfaed2139c9477ee5Affected
  • 051382885552e12541cc0ebf82092be374a9ed2a to before 95d064f9828a20ccca5ae90a17be3e2076f25272Affected
  • 051382885552e12541cc0ebf82092be374a9ed2a to before 7ff8d6363cffff45654ea85e319f7c0c54226012Affected
  • 051382885552e12541cc0ebf82092be374a9ed2a to before 719a10e3f5f868c3c4ac3cf3648c5775d12034bdAffected
  • 051382885552e12541cc0ebf82092be374a9ed2a to before 71d068490098b1d23c63b2345e40675d3a1ca763Affected
  • 62980365d6e894234b29f44fb2bfad4f7f8bb824Affected
  • 5.15.154 to before 5.15.224Affected
LinuxLinux
  • 6.0Affected
  • before 6.0Not affected
  • 5.15.224 through 5.15.*Not affected
  • 6.1.191 through 6.1.*Not affected
  • 6.6.160 through 6.6.*Not affected
  • 6.12.109 through 6.12.*Not affected
  • 6.18.50 through 6.18.*Not affected
  • 7.2.4 through 7.2.*Not affected
  • 7.3 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.