Look up another CVE · open CVE-2025-39682 in the interactive tracker
CVE-2025-39682
tls: fix handling of zero-length records on the rx_list
Published 2025-09-05 (13 months ago) by the Linux kernel CNA. Subsystem net/tls. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2025-39682 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | fixedDSA-6009-1 · 2025-09-22 · text | 6.1.153-1 | Update the kernel and reboot. DSA-6009-1 shipped the fix on 2025-09-22, in 6.1.153-1. A running kernel keeps the old code until the machine restarts. |
| Debian 13trixie | fixedDSA-6008-1 · 2025-09-22 · text | 6.12.48-1 | Update the kernel and reboot. DSA-6008-1 shipped the fix on 2025-09-22, in 6.12.48-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 6.16.5-1 | Update the kernel and reboot. Fixed in 6.16.5-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 6.16.5-1 | Update the kernel and reboot. Fixed in 6.16.5-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
Each recvmsg() call must process either - only contiguous DATA records (any number of them) - one non-DATA record If the next record has different type than what has already been processed we break out of the main processing loop. If the record has already been decrypted (which may be the case for TLS 1.3 where we don't know type until decryption) we queue the pending record to the rx_list. Next recvmsg() will pick it up from there. Queuing the skb to rx_list after zero-copy decrypt is not possible, since in that case we decrypted directly to the user space buffer, and we don't have an skb to queue (darg.skb points to the ciphertext skb for access to metadata like length). Only data records are allowed zero-copy, and we break the processing loop after each non-data record. So we should never zero-copy and then find out that the record type has changed. The corner case we missed is when the initial record comes from rx_list, and it's zero length.
Where it lives
The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.
net/tls/tls_sw.c
- What this is
- NETWORKING [TLS]MAINTAINERS section matched on net/tls/ · netdev@vger.kernel.org · Maintained
- Kernel module
- tls
Check it on the machine
grep -w CONFIG_TLS /boot/config-$(uname -r)Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.
lsmod | grep -w tlsPrints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.
Show whether Debian builds this, per release
Debian builds this as a loadable module. Every release below compiles it as a module on every flavour, so whether the code is in the running kernel depends on whether that module is loaded.
- bookworm, trixie, forky, sidm
- m
- a loadable module on every flavour - check lsmod, can be blacklisted
- Build switch
- CONFIG_TLS
From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages
Known to be exploited in the wild
- Added to KEV
- 2026-09-18
- Federal due date
- 2026-09-21
- Ransomware use
- unknown
- Required action
- Apply mitigations in accordance with vendor instructions, ensuring compliance with CISA’s BOD 26-04 Prioritizing Security Updates Based on Risk (see URL in Notes) guidance and CISA’s “Forensics Triage Requirements” (see URL in Notes). Follow applicable BOD 26-04 guidance for cloud services or discontinue use of the product if mitigations are unavailable. Stakeholders are responsible for evaluating each asset's internet exposure and ensuring adherence to BOD 26-04 patching guidelines.
Signals
- Published
- 2025-09-05 (13 months ago)source
- CVSS
- 9.8 critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- network (AV:N)source
- EPSS
- 2.88%, higher than 86.6% of all CVEssource
- CISA KEV
- listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- Subsystem
- net/tls
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 6.0 | 6.1.149 | 2902c3ebcca5 |
| 6.0 | 6.6.103 | c09dd3773b59 |
| 6.0 | 6.12.44 | 3439c15ae91a |
| 6.0 | 6.16.4 | 29c0ce3c8cdb |
| 6.0 | 6.17 | 62708b9452f8 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4328-1 | 2025-10-13 | bullseye 6.1.153-1~deb11u1 | tracker |
| DSA-6009-1 | 2025-09-22 | bookworm 6.1.153-1 | tracker |
| DSA-6008-1 | 2025-09-22 | trixie 6.12.48-1 | tracker |
Why the CNA scored it this way
Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source
- AV:NAttack vector, network
- The bug is triggered entirely by the sequence and content of TLS records arriving from the remote peer on a kTLS-enabled TCP socket (net/tls RX path); no local access is needed. Any kTLS RX consumer — OpenSSL-with-kTLS servers/clients, NFS-over-TLS, SMB/RPC-over-TLS via net/handshake — is remotely reachable over the network.
- AC:LAttack complexity, low
- The attacker sends three back-to-back records ([DATA][zero-length non-DATA][DATA]) and the corruption occurs deterministically on the victim's ordinary recvmsg() loop, with no race to win and no memory-layout dependency; the kernel selftest added with the fix reproduces it in one shot. TLS 1.2 is zero-copy-capable by default (zc_capable = rx_no_pad || version != TLS_1_3_VERSION), so no unusual kernel config or sockopt is required.
- PR:NPrivileges required, none
- The attacker is the remote TLS peer, which holds no privileges on the target system — an anonymous client completing a server-authenticated TLS handshake with a kTLS server, or a malicious server that a kTLS client connects to, suffices. This matches the repo's PR:N scoring of the comparable remote-peer net/tls bug CVE-2025-39946.
- UI:NUser interaction, none
- The victim application only has to run its normal recvmsg() loop on an already-established kTLS socket; no click, mount, file open, or any other victim action is required. The attacker drives the entire trigger from the wire.
- S:UScope, unchanged
- The corruption is confined to kernel skb/slab state within the same security authority; there is no VM, IOMMU, or sandbox boundary crossed. Standard in-kernel memory corruption is Scope:Unchanged.
- C:HConfidentiality impact, high
- The strparser anchor is queued on rx_list after tcp_read_done() already released its backing TCP skbs, so the next recvmsg() copies freed kernel heap memory straight into the userspace buffer via skb_copy_datagram_msg(). This is a directly usable, repeatable kernel-memory disclosure primitive, not a bounded pointer leak.
- I:HIntegrity impact, high
- The live strp->anchor is consume_skb()'d by process_rx_list() while the strparser still uses it, after which incoming attacker-controlled TCP data is written into the freed sk_buff/skb_shared_info (skb_fill_page_desc, tls_strp_load_anchor_with_queue), and socket teardown double-frees the anchor and its frag_list skbs. This yields attacker-controlled write-after-free and freelist corruption suitable for control-flow hijack.
- A:HAvailability impact, high
- The use-after-free and double-free of the anchor and of already-released TCP receive-queue skbs reliably corrupt slab state, producing oopses/panics and list corruption. Any remote peer can repeat this on every connection, giving a trivial remote kernel-crash DoS.