CVE-2023-53609CVE-2023-53609是Linux内核SCSI(小型计算机系统接口)子系统中的一个高危本地漏洞。该漏洞源于Linux内核中scsi_queue_rq()函数对已释放设备指针的不当引用操作。具体而言,在提交cfee29ffb45b1c9798011b19d454637d1b0fe87d引入的代码中,当scsi_dispatch_cmd()返回失败时,系统会执行atomic_inc(&cmd->device->iorequest_cnt)操作来增加SCSI设备的I/O请求计数器。然而,cmd->device所指向的scsi_device结构体在scsi_dispatch_cmd()返回后可能已经被释放,这导致对已释放内存的原子递增操作,从而触发内核崩溃(kernel panic)。
该漏洞的CVSS评分为5.5分,属于中危级别。虽然利用该漏洞需要本地低权限访问权限,但一旦触发,将直接导致系统内核崩溃,造成拒绝服务(DoS)攻击,影响系统的可用性。该漏洞不影响数据的机密性和完整性,但会严重影响系统的稳定性和可用性。
Linux内核的SCSI子系统负责管理存储设备(包括硬盘、SSD、SAN存储等)的I/O操作,是服务器和存储系统中至关重要的组件。该漏洞的修复通过回滚(revert)引入问题的提交来实现,恢复到稳定的状态。修复提交包括35fe6fa57b994e7da222893adf0bb748d6055e73和6ca9818d1624e136a76ae8faedb6b6c95ca66903,确保scsi_device在引用前不会被释放。
该漏洞的技术原理涉及Linux内核SCSI子系统的I/O请求调度路径。具体分析如下:
1. **漏洞触发路径**:在Linux内核的块设备I/O路径中,当上层文件系统或应用程序发起I/O请求时,请求会经过scsi_queue_rq()函数进行排队处理。该函数是SCSI中间层将请求分发给底层驱动的关键入口。
2. **问题代码**:提交cfee29ffb45b引入了以下逻辑——当scsi_dispatch_cmd()返回失败(非SUCCESS状态)时,代码尝试通过atomic_inc(&cmd->device->iorequest_cnt)来增加设备的I/O请求计数器,目的是在分发失败时仍保持计数的一致性。
3. **竞态条件**:关键问题在于scsi_dispatch_cmd()执行期间或返回后,cmd->device指向的scsi_device结构体可能因为设备移除、热插拔事件或错误处理路径而被释放。释放后,atomic_inc操作访问的是已释放的内存(dangling pointer),这会导致:
- 内核页错误(page fault)
- 原子计数器损坏
- 内核对象引用计数异常
- 最终触发内核oops或kernel panic
4. **利用方式**:攻击者作为本地低权限用户,可以通过以下方式触发该漏洞:
- 持续对SCSI设备发起I/O操作(读写请求)
- 在适当时机触发设备热插拔或移除操作(例如通过sysfs或设备管理器)
- 利用竞态窗口,使scsi_dispatch_cmd()返回失败时cmd->device已被释放
- 触发内核panic,实现本地拒绝服务攻击
5. **修复方案**:通过完全回滚(revert)引入问题的提交cfee29ffb45b,恢复到之前稳定的代码状态,确保不会在scsi_dispatch_cmd()返回后对可能已释放的cmd->device进行引用操作。