CVE-2023-53633CVE-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操作即可触发该漏洞,无需用户交互。