IPBUF安全漏洞报告
English
CVE-2026-43402 CVSS 9.8 严重

CVE-2026-43402 Linux内核kthread释放后重用漏洞

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

漏洞信息

漏洞编号
CVE-2026-43402
漏洞类型
释放后重用 (Use-After-Free)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelUse-After-Free内存破坏提权DoSkthread

漏洞概述

Linux内核中的kthread组件存在一个严重的释放后重用(UAF)漏洞。该漏洞源于kthread退出路径未能统一处理,当线程通过make_task_dead()退出时,会跳过关键的affinity_node清理步骤。在特定的内存合并配置下,这导致已释放的内存被重新分配并写入数据,进而破坏RCU回调函数指针。成功利用此漏洞可能导致内核崩溃、拒绝服务或潜在的权限提升,严重影响系统安全性和可用性。

技术细节

该漏洞的核心在于Linux内核内存管理中的SLAB合并机制与kthread退出逻辑的缺陷。首先,struct pid的大小因pidfs rhashtable转换缩小至144字节,与不包含CONFIG_BLK_CGROUP的struct kthread大小一致。当开启CONFIG_SLAB_MERGE_DEFAULT时,这两个结构体共享同一个SLAB缓存。关键在于,struct pid.rcu.func与struct kthread.affinity_node在内存中的偏移量均为0x78。当kthread通过make_task_dead()退出时,它绕过了常规的kthread_exit()函数,导致affinity_node未被从全局链表kthread_affinity_list中移除。随后,free_kthread_struct()释放了该内存。如果另一线程执行list_del()操作,会向这块已释放且可能被重新分配给struct pid的内存写入数据。由于偏移量重叠,这会覆盖pid.rcu.func指针,导致内核控制流劫持或崩溃。

攻击链分析

STEP 1
步骤1:触发条件准备
系统开启CONFIG_SLAB_MERGE_DEFAULT和SLAB_HWCACHE_ALIGN,导致struct pid和struct kthread共享SLAB缓存。
STEP 2
步骤2:创建kthread
内核创建一个kthread,分配struct kthread内存,初始化affinity_node并加入全局链表。
STEP 3
步骤3:异常退出
攻击者触发特定内核路径(如通过make_task_dead()),使kthread退出时绕过kthread_exit(),未从链表中移除affinity_node。
STEP 4
步骤4:内存释放与重用
free_kthread_struct()释放内存。随后,系统分配struct pid,恰好重用了刚释放的内存块。
STEP 5
步骤5:破坏内存
其他kthread执行清理操作,调用list_del()向旧地址写入数据,覆盖了新struct pid中的rcu.func指针。
STEP 6
步骤6:触发漏洞
当RCU回调机制尝试调用被损坏的rcu.func指针时,导致内核崩溃或执行任意代码。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * Conceptual PoC for CVE-2026-43402 * This demonstrates the scenario where a kthread exits via make_task_dead(), * bypassing cleanup, leading to a UAF condition. */ #include <linux/kthread.h> #include <linux/delay.h> static struct task_struct *bad_kthread; static int kthread_func(void *data) { // Simulate work while (!kthread_should_stop()) { msleep(100); } // Vulnerable path: exiting via make_task_dead bypasses kthread_exit() // which normally calls kthread_complete_and_exit() cleaning up affinity_node. // In a real exploit, this might be triggered by a kernel panic or oops path. make_task_dead(SIGKILL); return 0; } static int __init init_vuln(void) { printk(KERN_INFO "Starting vulnerable kthread...\n"); bad_kthread = kthread_run(kthread_func, NULL, "vuln_kthread"); return 0; } static void __exit exit_vuln(void) { if (bad_kthread) kthread_stop(bad_kthread); } module_init(init_vuln); module_exit(exit_vuln); MODULE_LICENSE("GPL");

影响范围

Linux Kernel (特定版本)

防御指南

临时缓解措施
建议立即升级Linux内核以修复此漏洞。若无法立即升级,可在内核编译配置中禁用CONFIG_SLAB_MERGE_DEFAULT,防止不同结构体共享SLAB缓存,从而阻断利用条件,但这可能会增加内存消耗。

参考链接