CVE-2025-39946CVE-2025-39946是Linux内核TLS(传输层安全)子系统中存在的一个高危缓冲区溢出漏洞,CVSS评分为9.8,属于严重级别。该漏洞位于Linux内核的TLS协议处理模块中,具体涉及`tls_rx_msg_size()`函数和流解析器(stream parser)的交互逻辑。
在正常情况下,Linux内核的TLS实现会等待套接字缓冲完整的TLS记录后再进行处理。但当套接字缓冲区较小时,内核会提前读取数据以防止连接停滞。然而,在这种提前读取的机制下,如果后续发现TLS记录头实际上是无效的(bogus headers),内核会尝试重新解析记录。每次重新解析都会复制更多的数据到已分配的skb(socket buffer)空间中,最终可能导致缓冲区溢出。
该漏洞由syzbot模糊测试工具发现。攻击者可以通过精心构造的攻击场景触发:先通过小的带外(OOB)发送提供TLS记录头,然后通过正常的大发送填充接收缓冲区,从而在特定条件下导致内核态缓冲区溢出。由于该漏洞位于网络协议栈中,攻击者可以通过网络远程触发,无需认证和用户交互,对系统的机密性、完整性和可用性均产生高影响。
该漏洞的技术原理涉及Linux内核TLS子系统的流解析机制。
**漏洞原理:**
在Linux内核的TLS实现中,当套接字的接收缓冲区较小时,为了避免连接停滞,内核会在TLS记录尚未完全接收时就开始处理数据。这一优化通过`tls_rx_msg_size()`函数实现,该函数负责解析TLS记录头以确定记录长度。
关键问题在于,当`tls_rx_msg_size()`发现记录头无效时,原有逻辑会尝试重新解析。每次重新解析都会将更多数据复制到已分配的skb空间中。由于skb空间是预先分配的有限缓冲区,反复复制数据最终会溢出该缓冲区,导致内核态内存损坏。
**利用方式:**
syzbot发现了一种利用场景:攻击者通过小的带外发送(OOB sends)分段提供TLS记录头,使内核在缓冲区数据不足以一次性解析完整长度的情况下开始处理。随后,攻击者通过正常的大发送填充接收缓冲区。当内核尝试重新解析无效记录头时,每次都会复制更多数据,最终触发缓冲区溢出。
**修复方案:**
修复方案确保`tls_rx_msg_size()`在检测到无效记录时中止流解析器(abort strp)。一旦达到无效记录,无法恢复连接状态,因此必须中止流以防止进一步的缓冲区溢出操作。