CVE-2022-50531CVE-2022-50531是Linux内核TIPC(Transparent Inter-Process Communication,透明进程间通信)子模块中存在的一个内核信息泄露漏洞。该漏洞位于net/tipc/topsrv.c文件中的tipc_topsrv_kern_subscr()函数中。在处理setsockopt系统调用时,函数对本地变量sub的sub.usr_handle字段使用了不完整的初始化操作,仅进行了4字节写入而非完整的8字节写入,导致结构体中后4个字节保持未初始化状态。当数据包被接收并通过copy_to_user等接口复制到用户空间时,这些未初始化的内核栈内存内容会随着数据包一起泄露给用户态进程。
该漏洞由KMSAN(Kernel Memory Sanitizer,内核内存消毒器)工具检测发现。KMSAN能够追踪内核中未初始化内存的使用情况,并在发现未初始化数据被复制到用户空间时触发告警。根据KMSAN报告的调用栈,泄露发生在packet_recvmsg路径中,涉及__skb_datagram_iter、skb_copy_datagram_iter等网络数据包接收函数。泄露的数据大小为88字节,其中第84至87字节为未初始化内容。
从CVSS评分来看,该漏洞评分为5.5分,属于中危级别。虽然漏洞本身仅泄露少量内核内存内容(4字节),但攻击者可能利用这些泄露的栈数据推断内核地址布局或其他敏感信息,为进一步的内核利用攻击提供辅助。该漏洞需要本地低权限用户即可触发,无需用户交互,具有较低的利用门槛。
该漏洞的根本原因在于tipc_topsrv_kern_subscr()函数中对sub.usr_handle字段的不完整初始化。在C语言中,结构体成员初始化时如果只写入部分字节(例如使用32位赋值操作),而结构体成员本身是64位类型(如uint64_t),则剩余的高位字节将保持未初始化状态。
漏洞触发路径如下:
1. 用户进程创建TIPC套接字(AF_TIPC)。
2. 调用setsockopt(fd, SOL_TIPC, TIPC_GROUP_JOIN, ...)加入TIPC组。
3. 内核调用tipc_setsockopt() -> tipc_sk_join() -> tipc_group_create()。
4. tipc_group_create()调用tipc_topsrv_kern_subscr()创建订阅。
5. 在tipc_topsrv_kern_subscr()中,sub结构体的usr_handle字段被部分初始化(仅4字节)。
6. 随后tipc_conn_rcv_sub() -> tipc_sub_subscribe()将包含未初始化数据的sub结构发送到网络层。
7. 当用户进程通过recvmsg接收数据包时,内核调用copy_to_iter()将数据包内容(包括未初始化的4字节)复制到用户空间缓冲区。
修复方案是使用8字节写入操作(如使用memcpy或结构体整体赋值)来完整初始化sub.usr_handle字段,确保所有8个字节都被正确赋值,避免未初始化内存泄露。