CVE-2023-53643CVE-2023-53643是Linux内核中nvme-tcp(基于TCP的NVMe传输协议)驱动模块的一个空指针解引用漏洞。该漏洞源于错误恢复过程中对已释放socket的不安全访问。当nvme-tcp的连接出现错误并触发错误恢复工作时,内核会释放当前的socket并创建一个新的socket。然而,在此过程中,如果用户执行'nvme list'命令,该命令会通过getsockname()系统调用尝试访问已被释放的socket,从而导致内核空指针解引用,引发内核崩溃(Kernel Panic)。该漏洞的CVSS 3.1评分为5.5分,属于中危级别。攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性影响低(C:L),对完整性无影响(I:N),但对可用性影响高(A:H),可导致系统拒绝服务。该漏洞已在多个Linux内核稳定版本中得到修复,包括通过提交76d54bf20cdcc1ed7569a89885e09636e9a8d71d、d82f762db4776fa11de88018f0f5de2d5db72a72和fe2d9e54165dadaa0d0cc3355c0be9c3e129fa0d等补丁进行修复。nvme-tcp是现代数据中心和高性能存储系统中广泛使用的协议,该漏洞可能影响使用NVMe over TCP存储的企业服务器和云基础设施。
该漏洞的根本原因在于nvme-tcp驱动在错误恢复路径中存在竞态条件(Race Condition)。具体技术细节如下:
1. **错误恢复机制**:当nvme-tcp连接发生错误时,内核会调度错误恢复工作(error recovery work),该工作会释放当前的TCP socket,然后创建一个新的socket用于重连。
2. **竞态窗口**:在socket被释放后、新的socket完全建立之前,存在一个时间窗口。在此窗口期内,如果用户空间发起'nvme list'命令,该命令会调用getsockname()系统调用尝试获取socket信息。
3. **空指针解引用**:由于旧的socket已被释放,而getsockname()尝试访问该socket的内部结构,导致内核访问了无效的内存地址(NULL指针或已释放的内存),从而触发内核空指针解引用错误。
4. **触发条件**:
- 需要存在一个活跃的nvme-tcp连接
- 该连接必须经历错误恢复过程(如网络中断、目标端重启等)
- 在恢复过程中执行'nvve list'命令
5. **影响范围**:该漏洞可被本地低权限用户利用,通过在特定时间窗口执行nvme-cli工具命令即可触发内核崩溃,导致系统拒绝服务。
6. **修复方案**:补丁增加了对socket有效性的检查,确保在访问socket之前确认其状态,避免对已释放的socket进行操作。