{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-63979","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-07-19T07:54:57.025Z","datePublished":"2026-07-19T14:56:03.177Z","dateUpdated":"2026-08-09T18:34:56.283Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-08-09T18:34:56.283Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet/handshake: hand off the pinned file reference to accept_doit\n\nhandshake_req_next() removes the request from the per-net\npending list and drops hn_lock before handshake_nl_accept_doit()\nreads req->hr_sk->sk_socket and dereferences sock->file (once in\nFD_PREPARE() and again in get_file()).  In that window a\nconsumer running tls_handshake_cancel() followed by sockfd_put()\n(svc_sock_free) or __fput_sync() (xs_reset_transport) releases\nsock->file.  sock_release() then runs sock_orphan(), zeroing\nsk_socket, and frees the struct socket.  The accept-side code\neither reads NULL through sk_socket or chases freed memory.\n\nThe submit-side sock_hold() does not prevent this.  sk_refcnt\nprotects struct sock, but struct socket and sock->file are\nindependently refcounted via the file descriptor the consumer\nowns.  Pinning sk leaves sock and sock->file unprotected.\n\nRetarget the accept-side dereferences at req->hr_file, which was\npinned at submit time, instead of req->hr_sk->sk_socket->file.\nPinning on its own is not sufficient: a consumer that cancels\nbetween handshake_req_next() returning and accept_doit reaching\nFD_PREPARE() takes the !remove_pending() branch in\nhandshake_req_cancel() and drops hr_file before the accept side\ntakes its own reference.  Hand off an additional file reference\ninside handshake_req_next(), under hn_lock, so the accept side\noperates on a reference that no concurrent handshake_req_cancel()\ncan revoke.  FD_PREPARE() consumes that handed-off reference,\neither by transferring it to the new fd in fd_publish() or by\ndropping it in the cleanup destructor on error; the explicit\nget_file() that previously balanced FD_PREPARE() is therefore\nredundant and goes away.\n\nUpdate handshake_req_cancel_test2 and _test3 to simulate the\nFD_PREPARE() consumption with an fput() so the kunit file-count\nassertions stay balanced."}],"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 race is triggered by remote TLS handshake activity on network-facing kernel consumers (nfsd RPC-over-TLS STARTTLS probe, NVMe-oTCP TLS13 connections). A remote peer can initiate handshake_req_submit() and force cancellation via disconnect, while tlshd automatically issues HANDSHAKE_CMD_ACCEPT in response to kernel notifications.\nAC:L - The attacker controls both sides of the race by opening TLS connections and timing disconnects or aborts against tlshd accept processing. Repeated parallel connection attempts make winning the window between handshake_req_next() and FD_PREPARE() practical without conditions outside attacker control.\nPR:N - Exploitation requires no credentials on the target server. NFS RPC_AUTH_TLS uses a NULL-procedure STARTTLS probe before any RPC authentication, and NVMe-oTCP TLS handshakes run at initial connection setup prior to namespace authentication.\nUI:N - No victim interaction is required. The tlshd daemon automatically accepts pending handshake requests upon receiving HANDSHAKE_CMD_READY multicast notifications; the attacker only needs to manipulate connection timing over the network.\nS:U - The vulnerability corrupts kernel heap memory (struct socket/file UAF or NULL dereference through sk_socket) within the kernel's security authority. It does not cross a VM, container, or IOMMU security boundary.\nC:H - The accept path dereferences sock->file after sock_release() may free the struct socket and sock_orphan() zeroes sk_socket, constituting a use-after-free. UAF of socket/file structures can be leveraged for arbitrary kernel memory disclosure via heap grooming.\nI:H - Use-after-free of the pinned socket file object provides a foundation for heap spraying and arbitrary write primitives to hijack kernel control flow, not merely a bounded or transient modification.\nA:H - The bug manifests as either a NULL pointer dereference through zeroed sk_socket or chasing freed socket memory in FD_PREPARE()/get_file(), both of which cause kernel oops or panic and deny service to the affected host."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/handshake/handshake-test.c","net/handshake/netlink.c","net/handshake/request.c"],"versions":[{"version":"3b3009ea8abb713b022d94fba95ec270cf6e7eae","lessThan":"68eba6519cbd6359fb554a9720f3a3b6b2eba23f","status":"affected","versionType":"git"},{"version":"3b3009ea8abb713b022d94fba95ec270cf6e7eae","lessThan":"c06876d4fac38f35820946ee3b1be7d7da799cd4","status":"affected","versionType":"git"},{"version":"3b3009ea8abb713b022d94fba95ec270cf6e7eae","lessThan":"f4251190e58b209999c1ba9e6d2976136a1be055","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/handshake/handshake-test.c","net/handshake/netlink.c","net/handshake/request.c"],"versions":[{"version":"6.4","status":"affected"},{"version":"0","lessThan":"6.4","status":"unaffected","versionType":"semver"},{"version":"6.18.44","lessThanOrEqual":"6.18.*","status":"unaffected","versionType":"semver"},{"version":"7.0.12","lessThanOrEqual":"7.0.*","status":"unaffected","versionType":"semver"},{"version":"7.1","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":"6.4","versionEndExcluding":"6.18.44"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.4","versionEndExcluding":"7.0.12"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.4","versionEndExcluding":"7.1"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/68eba6519cbd6359fb554a9720f3a3b6b2eba23f"},{"url":"https://git.kernel.org/stable/c/c06876d4fac38f35820946ee3b1be7d7da799cd4"},{"url":"https://git.kernel.org/stable/c/f4251190e58b209999c1ba9e6d2976136a1be055"}],"title":"net/handshake: hand off the pinned file reference to accept_doit","x_generator":{"engine":"bippy-1.2.0"}}}}