0xdeadbeefnetwork/ssh-keysign-pwn
GitHub: 0xdeadbeefnetwork/ssh-keysign-pwn
利用 Linux 内核 ptrace_may_access 竞态漏洞,通过 pidfd_getfd 窃取 SUID 进程的文件描述符,以非特权用户读取 SSH 主机私钥和 /etc/shadow。
Stars: 120 | Forks: 11
# ssh-keysign-pwn
以非特权用户读取 root 所拥有的文件。适用于 `31e62c2ebbfd` 之前的内核(截至 2026-05-14 的所有稳定版本)。

## 漏洞详情
当 `task->mm == NULL` 时,`__ptrace_may_access()` 会跳过 dumpable 检查。`do_exit()` 在 `exit_files()` 之前运行 `exit_mm()` —— 此时没有 mm,但 fd 仍然存在。当调用者的 uid 与目标进程的 uid 匹配时,`pidfd_getfd(2)` 可以在这个时间窗口内成功执行。
该漏洞由 Qualys 报告,由 Linus 于 2026-05-14 修复。Jann Horn 曾在 [2020 年 10 月](https://lore.kernel.org/all/20201016230915.1972840-1-jannh@google.com/) 指出过这种 FD 窃取的形式。距今已有六年。
## 攻击目标
**`sshkeysign_pwn`** —— 提取 `/etc/ssh/ssh_host_{ecdsa,ed25519,rsa}_key`。`ssh-keysign.c` 在执行 `permanently_set_uid()` 之前以 0600 权限模式打开它们,然后在遇到 `EnableSSHKeysign=no` 时退出,但文件描述符仍处于打开状态。这个问题自 2002 年以来就一直存在。
**`chage_pwn`** —— 提取 `/etc/shadow`。`chage -l ` 会调用 `spw_open(O_RDONLY)`,然后执行 `setreuid(ruid, ruid)`。设置这两个参数意味着 uid=euid=suid=ruid:权限完全降级。通过竞争退出时机,窃取 shadow 文件的 fd,然后离线破解 root 哈希。
## 构建与运行
```
make
./sshkeysign_pwn # host keys
./chage_pwn root # /etc/shadow content
```
会在标准输出打印文件内容。通常在启动 100 到 2000 个进程后命中。
## 已确认平台
Raspberry Pi OS Bookworm 6.12.75, Debian 13, Ubuntu 22.04 / 24.04 / 26.04, Arch, CentOS 9。
## 受控目标 PoC
`vuln_target.c` 打开 `/etc/shadow` 然后降权。`exploit_vuln_target.c` 展示了在目标存活时的 `EPERM` 错误,以及在发送 `SIGKILL` 之后成功窃取 fd 的过程。
```
sudo install -m 4755 vuln_target /usr/local/bin/vuln_target
./exploit_vuln_target /usr/local/bin/vuln_target
```
标签:0day挖掘, CVE 漏洞利用, Exploit 开发, Linux 内核漏洞, Linux 安全, PID 文件描述符, Ptrace 绕过, Python3.6, Shadow 密码提取, SSH 主机密钥窃取, StruQ, UID 权限降级滥用, Web报告查看器, 二进制利用, 内核安全, 协议分析, 子域名枚举, 安全渗透, 客户端加密, 攻击 PoC, 文件描述符劫持, 本地提权, 权限提升, 离线密码破解, 竞争条件, 系统安全, 红队武器