CVE-2022-50493CVE-2022-50493是Linux内核qla2xxx SCSI驱动中存在的一个高危本地漏洞,该漏洞源于I/O中止超时处理逻辑中的缺陷。在CPU热插拔(CPU hotplug)操作期间,当NVMe over Fabrics(NVMe-oF)通过FC传输层发起I/O请求时,如果I/O中止操作超时,系统会直接调用完成回调函数而未检查该I/O是否已经被完成。这种竞态条件会导致内核崩溃,出现空指针引用或对已释放内存的非法访问问题。
该漏洞的影响范围涉及使用qla2xxx驱动的QLogic FC HBA(光纤通道主机总线适配器)用户,特别是在启用了NVMe over FC功能的存储环境中。当系统进行CPU热插拔操作时,qla2xxx驱动的响应队列处理函数qla24xx_process_response_queue会触发崩溃,崩溃调用栈涉及NVMe FC传输层的多个函数路径。
根据CVSS 3.1评分,该漏洞的CVSS评分为5.5分,属于中等严重等级。攻击向量为本地(AV:L),攻击复杂度低(AC:L),所需权限为低权限(PR:L),无需用户交互(UI:N)。该漏洞对机密性无影响(C:N),对完整性无影响(I:N),但对可用性影响高(A:H),意味着攻击者可导致系统拒绝服务(DoS)。该漏洞由安全研究人员发现,已在2025年10月4日公开披露。
该漏洞的根本原因在于qla2xxx驱动中I/O中止超时处理逻辑缺乏对I/O状态的检查。具体而言,在qla2xxx驱动的abort处理路径中,当abort命令超时后,系统会调用sp->done()完成回调函数,但此时并未验证该I/O请求(sp)是否已经被其他路径完成。
技术原理分析:
1. 在NVMe over FC传输场景下,qla2xxx驱动负责处理来自上层nvme_fc模块的I/O请求;
2. 当CPU热插拔发生时,硬件队列可能进入异常状态,导致I/O请求无法正常完成;
3. 系统触发abort流程尝试中止超时的I/O请求;
4. 如果abort命令本身也超时,驱动会直接调用完成回调函数;
5. 此时如果原I/O已经被其他路径完成(如硬件响应到达),就会导致重复完成(double completion);
6. 重复完成会导致对已释放的SRB(SCSI Request Block)结构的非法访问,引发内核崩溃。
漏洞利用方式:攻击者需要在目标系统上具有本地低权限访问权限,且系统需要配置qla2xxx驱动的FC HBA设备并启用NVMe over FC功能。攻击者可以通过触发CPU热插拔操作或制造高I/O负载来增加abort超时的概率,从而触发系统崩溃实现拒绝服务攻击。
修复方案是在调用完成回调之前,验证I/O请求和abort请求确实处于未完成状态(outstanding),通过增加状态检查来避免重复完成问题。