CVE-2025-40271
fs/proc: 修复 proc_readdir_de() 中的释放后使用(UAF)漏洞
- 已发布
- 2025年12月6日
- 已更新
- 2026年8月5日
- 分配 CNA
- Linux
- 观察到的证据
- 2026年5月4日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H低 · 未来 30 天
- 百分位
- 38.7%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
在 Linux 内核中,已修复以下漏洞:fs/proc: 修复 proc_readdir_de() 中的 UAF。Pde 通过 rb_erase() 从 subdir 红黑树中删除,但未将该节点设置为 EMPTY,这可能导致 UAF 访问。我们应该使用 RB_CLEAR_NODE() 将已删除的节点设置为 EMPTY,这样 pde_subdir_next() 将返回 NULL,从而避免 UAF 访问。我们在使用 stress-ng 测试时发现了一个 UAF 问题,需要同时运行 getdent 和 tun 测试用例。该问题的步骤如下:1) 使用 getdent 遍历目录 /proc/pid/net/dev_snmp6/,当前 pde 为 tun3;2) 在 [时间窗口] 内注销网络设备 tun3 和 tun2,并将它们从红黑树中删除。先删除 tun3,再删除 tun2。pde(tun2) 将被释放到 slab;3) 继续 getdent 进程,然后 pde_subdir_next() 将返回已被释放的 pde(tun2),这将导致 UAF 访问。 CPU 0 | CPU 1 ------------------------------------------------------------------------- traverse dir /proc/pid/net/dev_snmp6/ | unregister_netdevice(tun->dev) //tun3 tun2 sys_getdents64() | iterate_dir() | proc_readdir() | proc_readdir_de() | snmp6_unregister_dev() pde_get(de); | proc_remove() read_unlock(&proc_subdir_lock); | remove_proc_subtree() | write_lock(&proc_subdir_lock); [time window] | rb_erase(&root->subdir_node, &parent->subdir); | write_unlock(&proc_subdir_lock); read_lock(&proc_subdir_lock); | next = pde_subdir_next(de); | pde_put(de); | de = next; //UAF | rbtree of dev_snmp6 | pde(tun3) / \ NULL pde(tun2)
来源
3对CVE-2025-40271的技术分析,这是Linux内核/proc文件系统中的一个严重释放后使用(Use-After-Free)漏洞,包括根本原因、复现步骤和补丁细节。
CVE-2025-40271 由 MadEploits 修改
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。