CVE-2026-43402Linux内核中的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指针,导致内核控制流劫持或崩溃。