[!WARNING] 请仅在你拥有或获授权测试的系统上使用。如果你在失败时无法重启系统,建议保持一个 root shell 打开,因为如果没有 root,你可能无法清除
/etc/shadow的页缓存。
利用 CVE-2026-46333 和 CVE-2026-31431,无需提升到 root 即可更改任意用户的密码。
python passwd.py <username>
你也可以不带参数运行该命令,以查看 shadow 文件中当前的哈希。
CopyFail(CVE-2026-31431)及类似漏洞允许向操作系统中你可读取的任何文件写入 4 个字节。这通常意味着你无法修改你不能读取的文件,例如 PAM 规则或 shadow 文件。你可以利用 CopyFail 提升到 root,然后再更改任何你想要的文件(这方面有很多 PoC,包括我自己的 RootRemover),但如果我们想在不提升权限的情况下修改其他文件呢?
CopyFail 只需要一个文件描述符即可工作。大多数 PoC 会打开一个文件并使用该 FD,但我们也可以从其他任何地方获取它。接下来登场的是 CVE-2026-46333。
CVE-2026-46333 能够从 chage 或 ssh-keysign 窃取指向 root 可读文件的文件描述符。由于我们需要 /etc/shadow 来修改密码,因此我们聚焦于 chage。pidfd_getfd 被用来窃取 /etc/shadow 的文件描述符,因为在它的执行过程中有一个时刻 UID 被设置为执行它的用户(从而允许调用 pidfd_getfd),但凭借 SUID 位,它能够在降权到我们的用户之前以 root 身份打开 /etc/shadow。
该 FD 处于 O_RDONLY,即只读,但因为我们有 CopyFail,这并不重要,我们可以升级为写入。我们只需将 FD 传给 CopyFail,然后像使用其他任何可读文件一样使用该漏洞。
passwd 更改一次密码。passwd 设置一次即可解决这个问题。