CVE-2026-31415Linux内核IPv6协议栈中存在一个本地拒绝服务漏洞。该漏洞源于`ip6_datagram_send_ctl`函数在处理辅助数据时,未能正确校验重复的`IPV6_DSTOPTS`消息,导致16位长度累加器`opt_flen`发生整数回绕。本地攻击者可利用此漏洞构造特制的数据包选项,触发内核内存分配错误,进而导致内核崩溃。
该漏洞位于Linux内核的`net/ipv6/datagram.c`文件中。核心问题是`struct ipv6_txoptions`中的`opt_flen`字段为`__u16`类型(16位),而指针`opt->dst1opt`指向最后一个提供的Destination Options头。当`ip6_datagram_send_ctl()`接收到多个`IPV6_DSTOPTS`控制消息时,它会将每个消息的长度累加到`opt_flen`中。由于没有拒绝重复消息的机制,攻击者可以发送足够多的、长度较大的选项(如32个2048字节的消息),使累加值超过65535而发生回绕。虽然`opt_flen`回绕变小,但`dst1opt`仍指向一个很大的头部。在后续的传输路径中,内核使用回绕后的`opt_flen`计算头部空间(低估),但在实际构建SKB时,`ipv6_push_frag_opts`依据`dst1opt`的大小进行数据推送。由于预留空间不足,`skb_push`操作会触发`skb_under_panic`,最终导致内核崩溃。利用此漏洞需要本地`CAP_NET_RAW`权限,可通过用户命名空间获取。