CVE-2026-43037Linux内核的ip6_tunnel模块存在一个严重的缓冲区溢出漏洞。该漏洞源于处理IPv4-in-IPv6隧道错误报文时的类型混淆。当ip4ip6_err()函数调用icmp_send()时,错误地将IPv6的skb控制块数据解析为IPv4结构,导致内存布局错位。攻击者可利用此漏洞通过特制的数据包触发栈缓冲区溢出,可能导致系统崩溃或远程代码执行。
该漏洞发生在Linux内核网络子系统的IPv6隧道实现中。当内核处理IPv4封装在IPv6(ip4ip6)的数据包错误时,ip4ip6_err()函数被调用。此时,克隆的skb2的cb[]区域保留了IPv6接收路径写入的struct inet6_skb_parm结构。然而,后续调用的icmp_send()通过IPCB(skb2)宏访问该区域,将其视为struct inet_skb_parm(IPv4)。由于结构体定义不同,IPv6结构中的nhoff字段(偏移14)与IPv4结构中的opt.rr字段重叠。攻击者通过控制数据包内容,可以影响这个重叠区域的值,导致__ip_options_echo()函数从攻击者可控的数据包偏移处读取optlen。随后,内核将optlen长度的数据拷贝到栈上固定的40字节缓冲区dopt->__data中。由于缺乏长度校验,拷贝过量数据将导致栈缓冲区溢出,破坏内核堆栈,从而实现本地提权或远程代码执行。