CVE-2026-72222

CVE-2026-72222

Critical · published August 15, 2026

CVSS v3.1
9.8
EPSS
1%
Percentile
49.8
In the wild
Unconfirmed
What it is

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

sunrpc: pin svc_xprt across the asynchronous TLS handshake callback

svc_tcp_handshake() stores the raw svc_xprt pointer in

tls_handshake_args.ta_data and submits the request through

tls_server_hello_x509(). The handshake core takes only

sock_hold(req->hr_sk); nothing references the embedding struct

svc_sock that svc_tcp_handshake_done() reaches via container_of().

Two close races leave the in-flight callback writing through a freed

svc_sock. svc_sock_free() calls tls_handshake_cancel() and discards

its return value: a false return means handshake_complete() has

already set HANDSHAKE_F_REQ_COMPLETED but hp_done() may not have

finished, yet svc_sock_free() proceeds to kfree(svsk). The

cancel-loser fall-through inside svc_tcp_handshake() itself produces

the same window: when wait_for_completion_interruptible_timeout()

returns <= 0 (timeout or signal) and tls_handshake_cancel() returns

false, the function does not drain, returns, and svc_handle_xprt()

calls svc_xprt_received(), which clears XPT_BUSY and can drop the

last reference. A concurrent close then runs svc_sock_free() while

svc_tcp_handshake_done() is still updating xpt_flags and walking

svsk->sk_handshake_done.

The corruption surfaces as set_bit/clear_bit RMW into the freed

xpt_flags slab slot and as complete_all() walking and writing the

freed wait_queue_head_t list embedded in sk_handshake_done -- a

slab-corruption primitive, not a benign read. The path is reachable

on any TLS-enabled NFS server whenever a connection close overlaps

the tlshd downcall delivery window; the interruptible wait means

signal delivery suffices, not just SVC_HANDSHAKE_TO expiry.

Take svc_xprt_get(xprt) immediately before tls_server_hello_x509()

so the in-flight callback owns its own reference. Release it on the

two edges where the callback is guaranteed not to fire -- submission

failure from tls_server_hello_x509() and a successful

tls_handshake_cancel() -- and at the tail of

svc_tcp_handshake_done() after complete_all().

[cel: rewrote commit message to describe the actual change]

The record
Technical detail
CVSS v3.1
9.8 · CRITICAL
Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00635 · 49.8th percentile
Published
2026-08-15T10:21Z
References (5)
EPSS history
Timeline
  • 15 AUG 05:54Z
    sunrpc: pin svc_xprt across the asynchronous TLS handshake callback
    cvelistv5