文章总结: 本文分析Linux内核net/tls子系统CVE-2025-39682Use-After-Free漏洞,CVSS7.1分,已确认在野利用。漏洞源于tlsswrecvmsg对零长度TLS记录处理不当,导致引用计数破坏,本地低权限用户可提权至root。影响内核6.0至6.16.3及6.17-rc1/rc2版本。文章提供完整触发序列、检测排查方法及升级修复建议,并给出红队视角的实战价值分析。 综合评分: 85 文章分类: 漏洞分析,漏洞预警,应急响应,红队,安全运营
(7.1分) CVE-2025-39682:Linux内核TLS UAF本地提权
红队安全圈 红队安全圈
红队安全圈
2026年9月19日 08:06 重庆
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
已确认在野利用的 Linux 内核本地提权洞:net/tls 一条零长度记录就能打碎引用计数,低权限直接够到 root。
01 漏洞速览
Linux 内核 net/tls 子系统存在一个 Use-After-Free 漏洞(CVE-2025-39682),CVSS 3.1 评分 7.1,本地低权限攻击者可以借此把权限提到 root。最要命的信号是:CISA KEV 已确认在野利用,说明有真实攻击者在用,不只是实验室玩具。跑着内核 6.0 到 6.16 的机器,尤其是多用户服务器和云主机,都需要立刻排查。
漏洞编号CVE-2025-39682
影响产品Linux Kernel(net/tls)
影响版本6.0 – 6.16.3 及 6.17-rc1/rc2(详见下文)
漏洞类型CWE-416 Use After Free
危害等级CVSS 3.1 7.1 High(本地提权)
是否在野是,已进 CISA KEV
公开 PoC有,崩溃 PoC + 完整分析已公开
攻击前提本地低权限账号 + 启用 kTLS 接收路径
影响面多用户 Linux 服务器本地提权到 root
02 漏洞成因
根因在 tls_sw_recvmsg 对零长度 TLS 记录的处理。正常约定是:每次 recvmsg() 要么只处理连续的 DATA 记录,要么处理一条非 DATA 记录。但当一条零长度记录从 rx_list 取出时,这个约定被打破——后续 TLS 记录会按错误的 zero-copy 和排队假设继续处理。
具体链条:
-
copied == 0 时函数继续循环收包。一条零长度解密记录正好触发这个条件。
-
下一轮迭代中,如果新记录的 content type 与先前建立的 control 不一致,tls_record_content_type() 返回 0。
-
返回值小于等于 0 走错误路径,把 darg.skb(其实就是 strp 的 anchor)挂进 ctx 的 rx_list。
-
问题在这:当 darg.zc == 1(zero-copy 模式激活)时,把 anchor 挂进 rx_list 是禁止的。这会破坏 anchor 的 frag_list 和引用计数。
后果是:socket 关闭时,tls_sw_release_resources_rx 遍历已释放的内存,UAF 在 kfree_skb_list_reason 处被 KASAN 确认。这块 SKB 最早由 tcp_sendmsg_locked 分配,在错误重新入队之前已经被 tls_strp_msg_done 释放。
一句话总结:错误路径把一个 zero-copy 模式下的 anchor SKB 二次入队,引用计数被打乱,释放后还在用。
03 影响范围
受影响版本(升级到以下版本之上即安全):
6.0 – 6.1.148
6.2 – 6.6.102
6.7 – 6.12.43
6.13 – 6.16.3
6.17-rc1 / 6.17-rc2
补丁已随主线发布。KEV 条目提到部分受影响产品可能已 EoL/EoS——这类机器打不了补丁,只能换版本或做缓解。
04 利用分析:触发序列已公开
研究者已发布完整触发序列,六步复现(在 Linux 6.12.41 上实测触发 KASAN UAF):
步骤 1:发送一条 TLS Application Data 记录(type 0x17,内容 Hello world)。
步骤 2:发送一条零长度 TLS Handshake 记录(type 0x16,空明文)。
步骤 3:用 read(conn, buf, 0x100) 部分消费第一条记录,让下一次调用时 copied == 0。
步骤 4:再发送一条 Application Data 记录(type 0x17)。
步骤 5:调用 recvmsg——handshake 记录与后续 data 记录的 content type 不匹配,触发漏洞路径:darg.zc == 1 时错误地把 anchor SKB 入队 rx_list。
步骤 6:关闭 socket——UAF 在 tls_sw_release_resources_rx 中触发。
公开的崩溃 PoC 本身只让内核崩溃(KASAN 报 slab-use-after-free)。但从崩溃到提权是经典路径:UAF 意味着可以堆喷射占位被释放的 SKB 内存,配合跨缓存攻击或 page 级喷射替换成可控对象,进而改写函数指针或核心结构完成 LPE。研究者的分析标题就写明目标是 privilege escalation。
利用门槛评估:本地、低权限、复杂度低(AC:L)。难点在于 kTLS 接收路径需要目标进程真的在用 kTLS——这缩小了实战面,但在负载均衡、加密代理类服务里并不罕见。
05 检测与排查
版本排查(第一步先看内核版本是否在受影响区间):
uname -r
确认 kTLS 是否在用——看进程有没有设置 TCP_ULP tls,服务端场景直接查模块和 socket 状态:
ss -tinm | grep tls
lsmod | grep tls
日志排查:内核日志出现过 KASAN 的 slab-use-after-free,位置在 kfree_skb_list_reason 或调用栈带 tls_sw_release_resources_rx,说明漏洞已被触发。在野利用场景下,攻击者得手后还会尝试提权,需结合 auditd 的 setuid/execve 异常记录一起看。
06 修复建议
-
升级内核到包含补丁的版本:6.1.149+ / 6.6.103+ / 6.12.44+ / 6.16.4+ / 6.17-rc3+(或发行版 backport 版本)。
-
暂时无法升级的:确认业务没有启用 kTLS 接收路径可显著降低风险——漏洞入口在 tls_sw_recvmsg,不用 kTLS 就打不到。
-
EoL/EoS 系统(KEV 明确点名):没有补丁可打,尽快迁移到受支持版本。
-
多用户服务器和容器宿主机:限制本地不可信用户,是所有内核 LPE 的通用缓解。
07 红队视角
这个洞的实战价值在于:在野确认 + 本地低门槛。KEV 收录说明已有攻击者把它塞进利用链,很可能作为容器逃逸或多阶段入侵里的提权环节——拿到 Web shell 后从低权限服务账号提到 root,一步到位。
对防守方的提示:
-
面向公网的服务就算本身无此漏洞,落入的账号一旦能触发本地内核漏洞,边界就没了。7.1 分的本地提权在多租户环境里实际影响远超分数。
-
排查优先级:容器宿主机 > 多用户跳板机 > 单用途加密服务节点。
-
类似历史案底:net/tls 这几年不是第一次出事,tls_setsockopt 系列和 tls_sw_recvmsg 早前的处理缺陷都报过。这条接收路径建议整体纳入重点审计范围。
后续如果出现可用的完整 LPE exploit,会跟进分析。
08 POC 链接
STAR Labs 的完整分析(触发序列 + 崩溃 PoC 源码 + TLS 记录生成脚本):
https://starlabs.sg/advisories/25/25-39682/
CISA KEV 条目:
https://www.cisa.gov/known-exploited-vulnerabilities-catalog#CVE-2025-39682
如果文章对您有收获,欢迎关注、点赞、推荐、转发。
— END —
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:红队安全圈 红队安全圈 红队安全圈《(7.1分) CVE-2025-39682:Linux内核TLS UAF本地提权》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论