SSH-Keysign-pwn(CVE-2026-46333)漏洞原理及复现过程
CVE-2026-46333代号 ssh-keysign-pwn是2026年5月披露的一个Linux内核本地权限提升漏洞由安全公司 Qualys 的研究团队发现并报告。该漏洞源于Linux内核 ptrace 访问控制机制与进程退出流程之间的竞争条件race condition允许本地普通用户读取本应受到保护的特权进程已打开但尚未关闭的敏感文件。发现时间线时间描述2020该逻辑问题首次由安全研究员Jann Horn发现并指出但当时未得到修复2026.05Qualys团队重新发现并成功利用该漏洞随后向Linux内核安全团队报告2026.05.16Linus Torvalds亲自提交修复补丁漏洞获得正式编号CVE-2026-463332026.05.18公开的概念验证代码PoC发布漏洞细节及利用方法全面公开一、漏洞描述CVE-2026-46333是Linux内核ptrace子系统与进程退出流程之间存在的一个竞争条件漏洞由安全公司Qualys的研究团队发现并报告因其典型的利用目标为/usr/lib/openssh/ssh-keysign程序而被称为“ssh-keysign-pwn”。该漏洞的根源在于Linux内核处理进程退出时的操作顺序问题当一个特权进程退出时内核会先释放该进程的内存描述符将mm指针设为NULL然后再关闭该进程已打开的文件描述符。在这两个步骤之间的极短时间窗口内目标进程处于“没有内存空间但仍持有文件句柄”的特殊状态而此时内核的ptrace_may_access()权限检查函数由于检测到mm指针为NULL会错误地跳过后续的权限验证。攻击者利用这个缺陷通过pidfd_getfd()系统调用在该时间窗口内从特权进程中窃取已打开但尚未关闭的文件描述符从而读取本无法访问的敏感文件。该漏洞允许本地普通用户读取SSH主机私钥/etc/ssh/ssh_host_*_key实现中间人攻击或读取/etc/shadow文件获取用户密码哈希进行离线破解影响所有未修复的Linux内核版本自5.10至7.0均受影响。二、利用机理CVE-2026-46333漏洞的利用涉及Linux内核中多个核心机制的交互缺陷整个攻击链围绕一个关键的竞争条件展开。一setuid与文件描述符机制Linux中像ssh-keysign这样的程序由root拥有并设置了setuid位使得普通用户执行时临时获得root权限从而能够读取本应只有root才能访问的SSH主机私钥。当特权进程以root身份打开敏感文件后内核返回一个文件描述符fd后续的读写操作都基于这个fd而非文件路径且权限检查主要发生在open()阶段。这意味着如果攻击者能够复制到已经打开的敏感文件fd就能绕过最初的路径权限验证。二pidfd_getfd()与ptrace权限检查pidfd_getfd()系统调用可以从另一个进程复制已打开的文件描述符到当前进程但其权限检查复用了ptrace访问控制。ptrace用于观察和控制其他进程内核必须严格判断调用者是否有资格访问目标进程。对于setuid程序或曾接触过敏感资源的进程内核应执行更严格的限制不能将其视为普通同uid进程。此外dumpable机制原本用于决定进程崩溃时是否生成core dumpsetuid程序通常被标记为不可dump而ptrace的访问控制也依赖dumpable状态来判断是否允许其他进程接触该进程。三进程退出时的竞态窗口漏洞的关键在于进程退出时的资源释放顺序。do_exit()会先调用exit_mm()释放内存描述符将task-mm设为NULL然后再调用exit_files()关闭已打开的文件描述符。这就创造了一个特殊中间状态目标进程的mm已经为NULL没有用户态内存上下文但文件描述符表仍然存在且这些fd可能仍然指向敏感文件。更关键的是__ptrace_may_access()在检测到task-mm NULL时会跳过dumpable检查旧逻辑认为没有mm就没有内存镜像可转储因此不再需要限制跨进程访问但这个假设忽略了文件描述符仍然存在的事实。四竞态窗口的利用攻击者利用的就是exit_mm()与exit_files()之间的这个极短竞态窗口。当目标进程如ssh-keysign或chage处于mm已释放但fd尚未关闭的状态时由于mm为NULL导致ptrace权限检查被绕过攻击者可以成功调用pidfd_getfd()复制到该进程持有的敏感文件fd。虽然这个窗口非常短暂但通过高频重复启动和退出目标程序通常在100到2000次尝试内即可命中。五两个典型攻击目标具体到ssh-keysign该程序在permanently_set_uid()降权之前就已经以root权限打开了0600权限的SSH主机私钥即使后续因为EnableSSHKeysign配置为no而退出这些fd仍然在退出过程中短暂保持打开状态。对于chage该程序在打开/etc/shadow后会执行setreuid(ruid, ruid)将权限降至普通用户同样在退出阶段存在可竞争的窗口。攻击者成功复制fd后就能读取SSH主机私钥用于冒充服务器实施中间人攻击或/etc/shadow用于离线破解密码哈希从而实现本地权限提升和敏感信息窃取。三、复现情况CVE-2026-46333漏洞的PoC由安全研究员“SiCk”发布于2026年5月18日左右在GitHub上公开。该PoC仓库名为“ssh-keysign-pwn”。PoChttps://github.com/0xdeadbeefnetwork/ssh-keysign-pwn复现环境准备复现该漏洞需要一个未打补丁的Linux系统受影响的内核版本包括5.10、5.15、6.1、6.6、6.12、6.18及7.0系列。攻击者需要拥有本地普通用户权限无需root身份。下载PoC后在目录中执行make命令编译即可生成两个可执行文件。下载完成后目录结构如下用make编译后会生成两个执行文件其中sshkeysign_pwn用于读取SSH主机私钥/etc/ssh/ssh_host*_keychage_pwn用于读取/etc/shadow文件。四、缓解措施针对CVE-2026-46333漏洞最彻底的解决方案是更新Linux内核至修复版本5.10.256、5.15.207、6.1.173、6.6.139、6.12.89、6.18.31、7.0.8及以上。如果无法立即重启系统应用内核更新可以通过修改kernel.yama.ptrace_scope参数进行临时缓解该参数控制系统对ptrace跨进程访问的限制等级。设置为2时只允许root用户使用ptrace调试其他进程设置为3时完全禁用ptrace包括root用户两种设置均可阻断该漏洞的利用路径但设置为3会导致gdb、strace等调试工具完全失效。为方便快速部署以下提供一键缓解脚本#!/bin/bash# CVE-2026-46333 临时缓解脚本# 用法sudo bash cve-2026-46333-mitigation.shif [ $EUID -ne 0 ]; thenecho 请使用root权限运行此脚本exit 1fiecho [*] 正在设置 ptrace_scope3...sysctl -w kernel.yama.ptrace_scope3echo [*] 写入配置文件以永久生效...cat /etc/sysctl.d/99-cve-2026-46333.conf EOF# CVE-2026-46333 (ssh-keysign-pwn) 临时缓解措施# 完全禁用 ptrace防止通过 pidfd_getfd 窃取文件描述符kernel.yama.ptrace_scope 3EOFecho [*] 应用配置...sysctl -p /etc/sysctl.d/99-cve-2026-46333.confecho [*] 验证当前设置sysctl kernel.yama.ptrace_scopeecho [!] 注意ptrace_scope3 会禁用所有 ptrace 调试功能echo [!] 包括 gdb、strace -p 等工具将无法使用echo [!] 请在条件允许时尽快更新内核以彻底修复漏洞运行临时缓解脚本后无法正常攻击如需永久解决建议下载Linux官方补丁。