CVE-2026-43186Linux内核ipv6模块的IOAM功能中存在堆缓冲区溢出漏洞。在接收路径下,`__ioam6_fill_trace_data`函数直接使用数据包中的`trace->nodelen`字段决定写入数据量,而未校验其与`trace->type`字段的一致性。攻击者可构造特制数据包,设置极小的nodelen但包含大量数据类型,导致内核写入超出分配区域的内存,引发堆内存损坏及内核崩溃。
该漏洞源于Linux内核处理IPv6 IOAM扩展头时的逻辑缺陷。在接收处理路径中,`__ioam6_fill_trace_data`函数依赖数据包内提供的`nodelen`值来确定写入内存的大小,但未检查`nodelen`是否与`type`字段声明的数据项相匹配。攻击者可以发送恶意数据包,将`nodelen`设置为0,同时设置`type`字段中的位0-21。由于函数认为空间不足(nodelen小)但仍尝试写入type字段要求的数据(实际需要较大空间),导致向`skb_shared_info`结构体后方写入约100字节数据。这种越界写入会破坏堆内存结构,导致系统崩溃或潜在的权限提升。修复方案引入了`ioam6_trace_compute_nodelen`辅助函数,在写入前根据type计算预期长度并丢弃不一致的数据包。