HIGH Introduced in 5.19
tls SpliceRead Bypass
CVE-2026-80904
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
01Description
In the Linux kernel, the following vulnerability has been resolved: net/tls: Fail tls_sw_splice_read() after a failed async decrypt When an async decrypt fails, tls_decrypt_done() records the error in ctx->async_wait.err and calls tls_err_abort(), which stores it in sk_err. tls_sw_recvmsg() and tls_sw_read_sock() each read async_wait.err once they hold the reader lock and fail the call: a record that did not authenticate breaks the connection. tls_sw_splice_read() has no such check, and sk_err does not stand in for one. tls_rx_rec_wait() tests sk_err only inside the loop it skips whenever a record is already parsed, and the first reader to reach sock_error() clears it, while async_wait.err persists. A splice therefore keeps delivering records on a connection that recvmsg() and read_sock() refuse to read. Read async_wait.err in tls_sw_splice_read() as the other two readers do.
02KernelScan AI Analysis
Risk summary
A remote peer or man-in-the-middle on a kernel TLS connection can send a corrupted TLS record that fails async decryption. The splice read path does not check the resulting error and continues delivering data, bypassing TLS integrity guarantees. Any application using kTLS with splice reads on a network-exposed TCP socket is at risk of receiving unauthenticated data.
Vulnerability analysis
When an asynchronous TLS record decryption fails, the error is recorded in a persistent connection-level field that the regular receive and read-sock paths check before delivering data. The splice read path omits this check, so it keeps delivering records on a connection that the other two readers refuse to touch. A remote peer or network-level attacker who sends a tampered TLS record can therefore inject unauthenticated data into an application that uses kernel TLS with splice reads, defeating the integrity guarantee TLS is supposed to provide. The fix adds the same error-status check to the splice path that the other readers already perform, causing splice to fail the call and break the connection when a decrypt error is pending.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 6.1 | 5.19 | 6.1.184 | a808aadff634 |
| 6.12 | 5.19 | 6.12.105 | 18ae1e95f208 |
| 6.18 | 5.19 | 6.18.46 | 82d9269f01eb |
| 6.6 | 5.19 | 6.6.153 | 06c2a53604fa |
| 7.1 | 5.19 | 7.1.10 | 4b177911eb9f |
| mainline | 5.19 | 7.2 | 976df67f463d |
| cip/6.1 | 5.19 | 6.1.187-cip60 | a808aadff634 |
| cip/6.1-rt | 5.19 | 6.1.189-cip61-rt32 | a808aadff634 |
| cip/6.12 | 5.19 | 6.12.108-cip31 | 18ae1e95f208 |
04CIP Kernels
State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.
| CIP tree | State |
|---|---|
| cip/6.12 | Fixed in 6.12.108-cip31 |
| cip/6.1 | Fixed in 6.1.187-cip60 |
| cip/6.1-rt | Fixed in 6.1.189-cip61-rt32 |