{"id":"CVE-2025-37756","state":"PUBLISHED","title":"net: tls: explicitly disallow disconnect","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet: tls: explicitly disallow disconnect\n\nsyzbot discovered that it can disconnect a TLS socket and then\nrun into all sort of unexpected corner cases. I have a vague\nrecollection of Eric pointing this out to us a long time ago.\nSupporting disconnect is really hard, for one thing if offload\nis enabled we'd need to wait for all packets to be _acked_.\nDisconnect is not commonly used, disallow it.\n\nThe immediate problem syzbot run into is the warning in the strp,\nbut that's just the easiest bug to trigger:\n\n  WARNING: CPU: 0 PID: 5834 at net/tls/tls_strp.c:486 tls_strp_msg_load+0x72e/0xa80 net/tls/tls_strp.c:486\n  RIP: 0010:tls_strp_msg_load+0x72e/0xa80 net/tls/tls_strp.c:486\n  Call Trace:\n   <TASK>\n   tls_rx_rec_wait+0x280/0xa60 net/tls/tls_sw.c:1363\n   tls_sw_recvmsg+0x85c/0x1c30 net/tls/tls_sw.c:2043\n   inet6_recvmsg+0x2c9/0x730 net/ipv6/af_inet6.c:678\n   sock_recvmsg_nosec net/socket.c:1023 [inline]\n   sock_recvmsg+0x109/0x280 net/socket.c:1045\n   __sys_recvfrom+0x202/0x380 net/socket.c:2237","publishedAt":"2025-05-01T12:56:00.539Z","updatedAt":"2026-10-15T21:51:59.284Z","severity":{"score":7.8,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"7bdcf5bc35ae59fc4a0fa23276e84b4d1534a3cf","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"ac91c6125468be720eafde9c973994cb45b61d44","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"f3ce4d3f874ab7919edca364c147ac735f9f1d04","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"2bcad8fefcecdd5f005d8c550b25d703c063c34a","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"9fcbca0f801580cbb583e9cb274e2c7fbe766ca6","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"c665bef891e8972e1d3ce5bbc0d42a373346a2c3","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"8513411ec321942bd3cfed53d5bb700665c67d86","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"5071a1e606b30c0c11278d3c6620cd6a24724cf6","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/tls/tls_main.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.13","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.13","versionType":"semver"},{"version":"5.10.237","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.181","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.135","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.88","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.24","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.13.12","status":"unaffected","lessThanOrEqual":"6.13.*","versionType":"semver"},{"version":"6.14.3","status":"unaffected","lessThanOrEqual":"6.14.*","versionType":"semver"},{"version":"6.15","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/tls/tls_main.c"]}],"references":["https://git.kernel.org/stable/c/7bdcf5bc35ae59fc4a0fa23276e84b4d1534a3cf","https://git.kernel.org/stable/c/ac91c6125468be720eafde9c973994cb45b61d44","https://git.kernel.org/stable/c/f3ce4d3f874ab7919edca364c147ac735f9f1d04","https://git.kernel.org/stable/c/2bcad8fefcecdd5f005d8c550b25d703c063c34a","https://git.kernel.org/stable/c/9fcbca0f801580cbb583e9cb274e2c7fbe766ca6","https://git.kernel.org/stable/c/c665bef891e8972e1d3ce5bbc0d42a373346a2c3","https://git.kernel.org/stable/c/8513411ec321942bd3cfed53d5bb700665c67d86","https://git.kernel.org/stable/c/5071a1e606b30c0c11278d3c6620cd6a24724cf6","https://lists.debian.org/debian-lts-announce/2025/05/msg00045.html","https://lists.debian.org/debian-lts-announce/2025/05/msg00030.html","http://www.openwall.com/lists/oss-security/2026/05/07/1"],"weaknesses":[],"ingestedAt":"2026-10-29T20:09:03.054Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2025/37xxx/CVE-2025-37756.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2025-37756","state":"PUBLISHED","datePublished":"2025-05-01T12:56:00.539Z","dateUpdated":"2026-10-15T21:51:59.284Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2025-04-16T04:51:23.938Z"},"containers":{"cna":{"title":"net: tls: explicitly disallow disconnect","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet: tls: explicitly disallow disconnect\n\nsyzbot discovered that it can disconnect a TLS socket and then\nrun into all sort of unexpected corner cases. I have a vague\nrecollection of Eric pointing this out to us a long time ago.\nSupporting disconnect is really hard, for one thing if offload\nis enabled we'd need to wait for all packets to be _acked_.\nDisconnect is not commonly used, disallow it.\n\nThe immediate problem syzbot run into is the warning in the strp,\nbut that's just the easiest bug to trigger:\n\n  WARNING: CPU: 0 PID: 5834 at net/tls/tls_strp.c:486 tls_strp_msg_load+0x72e/0xa80 net/tls/tls_strp.c:486\n  RIP: 0010:tls_strp_msg_load+0x72e/0xa80 net/tls/tls_strp.c:486\n  Call Trace:\n   <TASK>\n   tls_rx_rec_wait+0x280/0xa60 net/tls/tls_sw.c:1363\n   tls_sw_recvmsg+0x85c/0x1c30 net/tls/tls_sw.c:2043\n   inet6_recvmsg+0x2c9/0x730 net/ipv6/af_inet6.c:678\n   sock_recvmsg_nosec net/socket.c:1023 [inline]\n   sock_recvmsg+0x109/0x280 net/socket.c:1045\n   __sys_recvfrom+0x202/0x380 net/socket.c:2237"}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"7bdcf5bc35ae59fc4a0fa23276e84b4d1534a3cf","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"ac91c6125468be720eafde9c973994cb45b61d44","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"f3ce4d3f874ab7919edca364c147ac735f9f1d04","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"2bcad8fefcecdd5f005d8c550b25d703c063c34a","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"9fcbca0f801580cbb583e9cb274e2c7fbe766ca6","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"c665bef891e8972e1d3ce5bbc0d42a373346a2c3","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"8513411ec321942bd3cfed53d5bb700665c67d86","versionType":"git"},{"version":"3c4d7559159bfe1e3b94df3a657b2cda3a34e218","status":"affected","lessThan":"5071a1e606b30c0c11278d3c6620cd6a24724cf6","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/tls/tls_main.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.13","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.13","versionType":"semver"},{"version":"5.10.237","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.181","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.135","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.88","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.24","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.13.12","status":"unaffected","lessThanOrEqual":"6.13.*","versionType":"semver"},{"version":"6.14.3","status":"unaffected","lessThanOrEqual":"6.14.*","versionType":"semver"},{"version":"6.15","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/tls/tls_main.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/7bdcf5bc35ae59fc4a0fa23276e84b4d1534a3cf"},{"url":"https://git.kernel.org/stable/c/ac91c6125468be720eafde9c973994cb45b61d44"},{"url":"https://git.kernel.org/stable/c/f3ce4d3f874ab7919edca364c147ac735f9f1d04"},{"url":"https://git.kernel.org/stable/c/2bcad8fefcecdd5f005d8c550b25d703c063c34a"},{"url":"https://git.kernel.org/stable/c/9fcbca0f801580cbb583e9cb274e2c7fbe766ca6"},{"url":"https://git.kernel.org/stable/c/c665bef891e8972e1d3ce5bbc0d42a373346a2c3"},{"url":"https://git.kernel.org/stable/c/8513411ec321942bd3cfed53d5bb700665c67d86"},{"url":"https://git.kernel.org/stable/c/5071a1e606b30c0c11278d3c6620cd6a24724cf6"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - The vulnerability is triggered by the socket owner issuing `connect(fd, AF_UNSPEC)` followed by `recvmsg()` on their own kTLS socket; a remote TLS peer has no way to induce a disconnect. The TCP connection can be entirely loopback, so no network access is needed at all.\nAC:L - The sequence (attach TLS ULP, receive one record so the strparser latches `msg_ready` with a borrowed `frag_list`, disconnect, recvmsg) is fully under the attacker's control, single-threaded, and deterministic with no race to win. Heap grooming of the freed `skbuff_head` objects is standard and repeatable since the attacker can retry indefinitely.\nPR:L - `net/tls` contains no `capable()`/`ns_capable()` checks whatsoever, and `setsockopt(TCP_ULP,\"tls\")` plus `TLS_RX` crypto_info are available to any unprivileged user once the tls module is built in or resident. All steps are ordinary socket syscalls on a socket the attacker created.\nUI:N - The attacker performs every step themselves within a single process; no victim action, mount, or file open is involved.\nS:U - The corruption is confined to kernel memory managed by the same kernel security authority; there is no VM, IOMMU, or sandbox boundary crossed.\nC:H - `skb_nsg()`/`skb_to_sgvec()` walk the anchor's dangling `frag_list` into freed `skbuff_head` slab objects, building a scatterlist from attacker-sprayable page pointers; the zero-copy AEAD then writes those kernel bytes into the user's buffer before the tag check fails, and since the attacker chose the RX key/IV they recover the plaintext — an arbitrary kernel memory read.\nI:H - This is a use-after-free: `tls_strp_msg_hold()` performs `skb_clone()` on freed skbs (refcount writes into reallocated slab memory) and queues clones that are later freed, giving heap corruption and arbitrary-free primitives usable for control-flow hijack.\nA:H - The immediate observable effect is the `WARN_ON` at net/tls/tls_strp.c:486 (a panic under `panic_on_warn`), and the subsequent dereference of freed skb metadata and wild page pointers reliably oopses the kernel."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-08-05T11:57:19.159Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"5.10.237"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"5.15.181"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.1.135"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.6.88"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.12.24"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.13.12"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.14.3"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.13","versionEndExcluding":"6.15"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"title":"CVE Program Container","references":[{"url":"https://lists.debian.org/debian-lts-announce/2025/05/msg00045.html"},{"url":"https://lists.debian.org/debian-lts-announce/2025/05/msg00030.html"},{"url":"http://www.openwall.com/lists/oss-security/2026/05/07/1"}],"providerMetadata":{"shortName":"CVE","orgId":"af854a3a-2127-422b-91ae-364da2661108","dateUpdated":"2026-05-07T06:58:56.863Z"}},{"title":"CISA ADP Vulnrichment","metrics":[{"other":{"type":"ssvc","content":{"id":"CVE-2025-37756","role":"CISA Coordinator","options":[{"Exploitation":"none"},{"Automatable":"no"},{"Technical Impact":"total"}],"version":"2.0.3","timestamp":"2026-10-15T21:44:56.970467Z"}}}],"providerMetadata":{"shortName":"CISA-ADP","orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","dateUpdated":"2026-10-15T21:51:59.284Z"}}]}}}