CVE-2023-53539CVE-2023-53539是Linux内核中RDMA(远程直接内存访问)rxe(RDMA over Ethernet)驱动中的一个状态保存不完整漏洞。该漏洞位于rxe_requester()函数中,当发送数据包在IP层被丢弃时,rxe_xmit_packet()调用会返回-EAGAIN错误。为了实现重传机制,内核设计了在数据包发送前保存wqe(工作队列元素)状态、发送失败后恢复状态的逻辑。然而,保存和恢复状态的例程遗漏了wqe中一个重要的变量状态——dma结构体(用于处理sge表的DMA地址映射)。更关键的是,状态保存操作并未在构建数据包之前完成,而构建数据包的过程本身会修改dma结构体。在高压力测试场景下,当多个QP(队列对)在快速节点上向慢速节点发送大消息时,会出现数据包被丢弃的情况。由于dma结构体未被正确恢复,重传的数据包会发生损坏。该漏洞的CVSS评分为5.5,属于中等严重等级。虽然该漏洞本身不会直接导致权限提升或信息泄露,但可能导致系统可用性受到影响,造成数据传输错误或服务异常。该漏洞影响本地用户,需要低权限即可触发,无需用户交互,主要影响系统的可用性。
从技术层面分析,该漏洞的根本原因在于rxe_requester()函数中状态保存与恢复机制的设计缺陷。具体技术细节如下:
1. **触发路径**:当RDMA发送操作通过rxe_requester()函数处理时,数据包通过IP层进行传输。在网络拥塞或目标节点处理能力不足的情况下,IP层可能丢弃数据包,导致rxe_xmit_packet()返回-EAGAIN错误。
2. **状态保存缺陷**:为支持重传机制,内核在发送数据包前需要保存wqe的完整状态。然而,保存函数仅保存了部分状态变量,遗漏了dma结构体。dma结构体负责跟踪sge(Scatter-Gather Element)表的处理进度,包含当前处理的DMA地址、长度等关键信息。
3. **时序问题**:状态保存操作在数据包构建之后执行,而构建数据包的过程会修改dma结构体(如更新已处理的字节数)。这意味着即使保存了dma状态,保存的也是已经被修改后的状态,而非原始状态。
4. **数据损坏机制**:当-EAGAIN错误触发重传时,系统使用保存的状态恢复wqe。由于dma结构体未被正确恢复,重传的数据包会从错误的sge位置开始读取数据,导致数据包内容损坏。
5. **利用条件**:攻击者需要本地访问权限(低权限即可),通过创建大量QP并向目标节点发送大消息,可以触发数据包丢弃,进而导致重传数据包损坏。
6. **影响范围**:该漏洞主要影响系统可用性,可能导致RDMA通信失败、数据传输错误,在关键业务场景下可能造成服务中断。