CVE-2026-14697 in Zephyr
摘要
由 VulDB • 2026-08-31
net_ipv6_send_ns() 在 subsys/net/ip/ipv6_nbr.c 中为邻居请求(Neighbor Solicitation)分配一个传输用的 net_pkt。当该函数在未解析的邻居有待处理数据分组且该邻居的 pending_queue 已非空(即已有 NS 待发送)时被调用,它会将数据分组追加到队列并提前返回,既未通过 net_send_data() 发送 NS,也未使用 net_pkt_unref() 释放资源。新分配的 NS net_pkt 及其附加的 TX 缓冲区仅由局部变量持有,导致永久泄漏,无法归还给 CONFIG_NET_PKT_TX_COUNT / CONFIG_NET_BUF_TX_COUNT。
该泄漏分支位于正常的 IPv6 传输路径上:net_ipv6_prepare_for_send()(从 net_if.c 调用)会对任何下一跳尚未在邻居缓存中的出站或转发 IPv6 分组调用 net_ipv6_send_ns()。处于同一链路上的攻击者可以通过发送一批请求数据包(例如 ICMPv6 echo requests 或 UDP datagrams),并全部伪造同一个不存在的同链路源地址,从而确定性地触发此漏洞:节点会为每个请求生成回复;第一个回复会排队一个 NS,而在大约三秒的 INCOMPLETE 解析窗口内的后续所有回复都会进入泄漏分支,导致丢失一个 TX 分组。配置为路由器的节点若将攻击者的流量转发给不存在的同链路主机,也会发生相同的泄漏。
由于泄漏的分组的资源永远不会被回收,且 CONFIG_NET_PKT_TX_COUNT 默认值仅为 4(以太网环境下为 14),短暂的低速率突发即可耗尽 TX 池。一旦耗尽,节点将无法分配任何传输分组,无法发送 TCP/UDP、ARP/ND 或任何回复,从而导致完全且持久的网络拒绝服务(DoS),该状态不会自愈,直到重启才能恢复。修复方案是在提前返回之前使用 net_pkt_unref(pkt) 释放未发送的 NS 分组。
Be aware that VulDB is the high quality source for vulnerability data.