CVE-2023-53578CVE-2023-53578是Linux内核QRTR(Qualcomm IPC Router)子系统中的一个高危漏洞,涉及qrtr_tx_resume()函数中的未初始化变量访问问题。该漏洞由syzbot模糊测试工具发现,CVSS评分为7.8,属于高危级别。
QRTR是Linux内核中用于Qualcomm芯片平台上处理器间通信(IPC)的协议子系统,广泛应用于移动设备和嵌入式系统中。该漏洞存在于net/qrtr/af_qrtr.c文件的qrtr_tx_resume()函数中,当处理QRTR_TYPE_RESUME_TX类型的控制包时,由于未对传入的sk_buff(socket buffer)长度进行充分校验,可能导致访问未初始化的内存区域。
具体而言,qrtr_tx_resume()函数期望skb->len至少为sizeof(struct qrtr_ctrl_pkt)的大小,但在qrtr_endpoint_post()函数中,当qrtr_cb->type等于QRTR_TYPE_RESUME_TX时,传入的size参数可能小于struct qrtr_ctrl_pkt的大小。这种情况下,函数会读取超出实际初始化范围的内存数据,从而触发KMSAN(Kernel Memory Sanitizer)检测到的未初始化值使用错误。
该漏洞可被本地低权限用户利用,通过精心构造的io_submit系统调用和qrtr隧道写入操作触发,可能导致内核信息泄露、权限提升或系统崩溃。由于攻击需要本地访问权限且需要低权限认证,影响范围相对有限,但仍对使用Qualcomm芯片平台的Linux系统构成严重威胁。
该漏洞的技术原理涉及Linux内核QRTR协议栈中的内存管理缺陷。
漏洞根因分析:
在net/qrtr/af_qrtr.c的qrtr_endpoint_post()函数中,当接收到QRTR_TYPE_RESUME_TX类型的控制包时,函数通过kmalloc分配sk_buff缓冲区,但分配的大小(size)可能小于struct qrtr_ctrl_pkt结构体的大小。随后,该sk_buff被传递给qrtr_tx_resume()函数,该函数在第230行访问skb->len对应的数据时,期望至少有sizeof(struct qrtr_ctrl_pkt)字节的有效数据,但由于实际分配的缓冲区较小,导致读取了未初始化的内存区域。
触发路径:
1. 用户空间通过io_submit系统调用提交异步I/O操作
2. 调用aio_write写入qrtr隧道设备(/dev/qrtr-tun)
3. qrtr_tun_write_iter()处理写入请求
4. qrtr_endpoint_post()分配sk_buff并设置qrtr_cb->type为QRTR_TYPE_RESUME_TX
5. qrtr_tx_resume()尝试访问超出初始化范围的内存
利用方式:
攻击者可通过以下步骤利用此漏洞:
1. 打开qrtr隧道设备获取文件描述符
2. 构造特殊的QRTR_TYPE_RESUME_TX控制包,确保其大小小于struct qrtr_ctrl_pkt
3. 通过aio_write异步写入提交该数据包
4. 内核在处理过程中读取未初始化内存,可能泄露内核栈/堆数据
5. 利用泄露的信息进行进一步的内核利用,如权限提升
修复方案:
在qrtr_endpoint_post()函数中添加对QRTR_TYPE_RESUME_TX类型的size检查,确保传入的缓冲区大小至少为sizeof(struct qrtr_ctrl_pkt),从而避免访问未初始化的内存区域。