CVE-2025-39950CVE-2025-39950是Linux内核网络子系统中存在的一个空指针解引用漏洞,位于net/ipv4/tcp_ao.c文件的tcp_ao_finish_connect()函数中。该漏洞在TCP-AO(TCP Authentication Option,TCP认证选项)与TCP_REPAIR功能同时启用时触发。当用户在一个已添加TCP-AO密钥并启用了TCP_REPAIR选项的套接字上执行connect()系统调用时,tcp_ao_finish_connect()函数会被以skb(socket buffer)为NULL的参数调用,函数未对skb进行有效性校验便直接通过tcp_hdr(skb)->seq访问其内存,从而导致内核空指针解引用,引发内核崩溃(kernel panic/Oops)。该漏洞的CVSS 3.1评分为5.5分,属于中危级别,攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性和完整性无影响,但对系统可用性影响为高(A:H),可导致系统拒绝服务。攻击者利用该漏洞可使运行Linux内核的操作系统发生内核崩溃,造成拒绝服务攻击。
该漏洞的根本原因在于tcp_ao_finish_connect()函数缺少对输入参数skb的空指针检查。
在TCP连接建立流程中,当套接字配置了TCP-AO密钥并启用了TCP_REPAIR模式后,connect()系统调用会调用tcp_ao_finish_connect()函数来完成连接初始化。在TCP_REPAIR模式下,该函数被调用时传入的skb参数为NULL。然而,函数实现中直接执行了tcp_hdr(skb)->seq操作,即通过NULL指针计算偏移并访问seq字段,导致空指针解引用错误。
参考同一调用流程中的bpf_skops_established()函数,该函数在解引用skb之前会先进行NULL检查,而tcp_ao_finish_connect()缺少这一保护。
漏洞利用方式:攻击者只需拥有本地用户权限,创建一个TCP套接字,通过setsockopt()添加TCP-AO密钥并启用TCP_REPAIR选项,然后对任意目标执行connect()调用,即可触发空指针解引用,导致内核Oops或panic。内核崩溃日志显示错误发生在net/ipv4/tcp_ao.c的第1182行。