深入分析 Linux 内核高危漏洞 CVE-2026-46333
一个 ptrace 竞态条件如何泄露 SSH 私钥与 Shadow 密码
概述
2026年3月,Linux 内核被曝出一个高危漏洞——CVE-2026-46333。该漏洞源于 ptrace_may_access() 函数中的一个竞态条件,攻击者可借此从高权限进程中窃取已打开但尚未关闭的敏感文件描述符,造成 SSH 主机私钥、/etc/shadow 密码哈希等关键机密信息泄露。
漏洞原理
漏洞的根本原因在于 Linux 内核 ptrace_may_access() 函数中的权限检查存在时序空隙。当进程的 task->mm(内存描述符)为 NULL 时,该函数会跳过关键的 "dumpable" 权限检查。攻击者利用 pidfd_getfd() 系统调用,精确瞄准一个进程即将退出、内存已清理但文件描述符尚未关闭的微小时间窗口,从高权限进程中"偷取"已经打开但尚未关闭的敏感文件描述符。
简单来说,这是一个典型的 TOCTOU(Time-of-Check Time-of-Use) 漏洞:权限检查的时刻与实际使用时刻之间存在不可忽视的时间差,攻击者正是在这个间隙中完成了劫持。
影响范围
该漏洞影响多个主流 Linux 发行版:
- Raspberry Pi OS Bookworm (6.12.75)
- Ubuntu 22.04 / 24.04 / 26.04
攻击向量一:窃取 SSH 主机私钥(ssh-keysign)
攻击目标:/etc/ssh/ssh_host_ecdsa_key、/etc/ssh/ssh_host_ed25519_key、/etc/ssh/ssh_host_rsa_key
系统 SUID 程序 ssh-keysign 在启动时会以 Root 权限打开上述敏感主机私钥文件(权限为 0600)。在调用 permanently_set_uid() 降权之前,如果配置文件禁用了该功能(EnableSSHKeysign=no),程序会在持有文件描述符的情况下直接退出。攻击者反复触发该程序,利用内核漏洞在其退出的临界点窃取已打开的文件描述符,从而读取私钥内容。
后果: 获取主机私钥后,攻击者可伪装成该 SSH 服务器,对客户端发起中间人攻击(MITM)。
攻击向量二:窃取 /etc/shadow(chage)
chage -l <用户名> 命令在执行时,会先以 Root 权限打开 /etc/shadow 文件。随后,它会调用 setreuid(ruid, ruid) 将进程的所有 UID 都降级为普通用户权限。在权限完全丢失后,攻击者利用内核漏洞,可以抢在文件描述符被内核回收前,从该即将退出的进程中将其窃取出来,从而读取完整的密码哈希。
后果: 获取 /etc/shadow 后,攻击者可离线进行暴力破解,直接获得 Root 密码。
漏洞复现
测试环境: Linux ubuntu-linux-2404 6.8.0-110-generic #110-Ubuntu SMP PREEMPT_DYNAMIC Thu Mar 19 17:16:23 UTC 2026 aarch64
上图展示了攻击者成功窃取 SSH 主机私钥的过程。

上图展示了攻击者成功窃取 shadow 文件的过程。
影响评估
- 后果严重:可导致 SSH 私钥和 Root 密码泄露
修复建议
- 立即更新内核:关注各发行版安全公告,及时安装内核安全更新
- 临时缓解措施:通过 SELinux / AppArmor 限制
pidfd_getfd() 的使用 - SSH 安全加固:配置正确的
EnableSSHKeysign 参数
结语
CVE-2026-46333 再次提醒我们,操作系统内核的安全性不容忽视。即使是微小的竞态条件,也可能被精心利用,酿成严重的安全事故。