CVE-2026-74610: tls: don't leave a full plaintext sk_msg ring unpushed
In the Linux kernel, the following vulnerability has been resolved:
tls: don't leave a full plaintext skmsg ring unpushed
When the copy path in tlsswsendmsglocked() adds the fragment that fills the plaintext skmsg ring, it does not set fullrecord, so the record is left full and unpushed. A later splice() then adds to an already full ring: skmsgpageadd() has no fullness check of its own, so sg.end wraps onto sg.start and the ring appears empty. Fragments added after that overwrite live entries, and sg.size no longer matches what is reachable between sg.start and sg.end, so pushing the record runs the scatterwalk off the end of the scatterlist.
An unprivileged user can trigger this on a loopback TCP socket with the "tls" ULP attached:
BUG: kernel NULL pointer dereference, address: 0000000000000008 RIP: 0010:memcpyfromscatterwalk+0x32/0xc0 Call Trace: skcipherwalknext+0x1d1/0x2c0 gcmencryptaesniavx+0x1e9/0x220 bpfexectxverdict+0x3bb/0x860 tlsswsendmsg+0xa1a/0xca0 syssendto+0x1da/0x1f0
Set fullrecord in the copy path when the ring becomes full, and push a record that is already full on entry to the sendmsg loop.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 6.6.152.1-1
Event History
Frequently Asked Questions
Who can trigger the issue?
An unprivileged user can trigger it using a loopback TCP socket with the "tls" ULP attached.
What conditions lead to the failure?
The copy path must fill the plaintext sk_msg ring without marking the record full, followed by a later splice() that adds data to the already full ring. This can wrap the scatter-gather ring indices, overwrite live entries, and leave the recorded size inconsistent with reachable entries.
What symptoms may indicate the system has encountered this bug?
The described trigger causes a kernel NULL pointer dereference at address 0x8 in memcpy_from_scatterwalk(), with calls including skcipher_walk_next, gcm_encrypt_aesni_avx, bpf_exec_tx_verdict, tls_sw_sendmsg, and __sys_sendto.
What does the fix change?
The fix marks full_record when the copy path fills the ring and pushes a record that is already full when entering the sendmsg loop. This prevents subsequent data from being added to a full plaintext sk_msg ring.