data built 2026-10-19T13:16:53Z

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

KEV 9.8 EPSS 2.9% AV:N

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

ReleaseStatus VersionWhat this means
Debian 12bookwormfixedDSA-6009-1 · 2025-09-22 · text6.1.153-1Update 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 13trixiefixedDSA-6008-1 · 2025-09-22 · text6.12.48-1Update 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 14forkyfixed6.16.5-1Update the kernel and reboot. Fixed in 6.16.5-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed6.16.5-1Update 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 tls

Prints 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.

the KEV catalogue

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

IntroducedFixed inCommit
6.06.1.1492902c3ebcca5
6.06.6.103c09dd3773b59
6.06.12.443439c15ae91a
6.06.16.429c0ce3c8cdb
6.06.1762708b9452f8

Debian advisories

AdvisoryDateShipped toDebian
DLA-4328-12025-10-13bullseye 6.1.153-1~deb11u1tracker
DSA-6009-12025-09-22bookworm 6.1.153-1tracker
DSA-6008-12025-09-22trixie 6.12.48-1tracker

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.