快速摘要

  • Linux 内核存在一个逻辑缺陷,允许非特权用户“窃取”受 root 保护的文件(如 SSH 私钥和 /etc/shadow 文件)的文件描述符。
  • 通过利用进程退出时的一个短暂时间窗口(内存已清除但文件尚未关闭),攻击者可以使用 pidfd_getfd 系统调用来绕过通常保护敏感 SUID 进程的安全检查。
  • 这个特定的 CVE-2026-41651 设计缺陷在 2020 年 10 月被安全研究员明确标记,但在稳定版 Linux 内核中未修补约六年。此外,ssh-keysign 工具中允许其被用作此漏洞目标的特定编码模式自 2002 年以来一直未变。

FD 窃取漏洞:存在 6 年的 Linux 内核缺陷

Linux 内核刚刚发布了一个新的安全补丁。这不是一个典型的“立即获取 root”漏洞,而是一个巧妙的“文件描述符(FD)窃取”漏洞,它作为内核设计的一部分已经存在了 6 年。

Linus Torvalds 最近推送了一个修复,针对内核处理退出进程时的逻辑错误。虽然补丁现已正式发布,但这个漏洞的工作原理以及它隐藏了多久,是一个关于内核内部的引人入胜的故事。

什么是文件描述符(FD)窃取漏洞?

大多数 Linux 安全新闻关注的是“权限提升”,即用户成为 root。这个漏洞不同,它是一个文件访问漏洞。

FD 窃取(文件描述符窃取)指的是攻击者在特权进程退出过程中“窃取”或复制其活动文件描述符的过程。这种技术允许非特权用户访问目标进程在仍拥有 root 权限时打开的敏感文件。

攻击者可以利用此缺陷在特权程序尝试关闭敏感文件(如 SSH 私钥或 /etc/shadow 密码文件)时“窃取”这些文件的活跃链接。

如果攻击者获取了您的 shadow 文件,他们可以获取密码哈希并离线破解,最终获得完全 root 访问权限。

内核中的安全窗口

要理解这个 fd 窃取漏洞,必须了解程序如何退出。当程序结束时,Linux 内核按特定顺序清理其资源。此漏洞利用了该序列中的一个微小时间间隙:

  1. 首先清除内存(exit_mm): 内核清除程序的内存。
  2. 检查失败: 通常,内核保护 root 拥有的程序不被普通用户探查。这称为“可转储”检查。但多年来,内核有一个“失败开放”策略:如果内存已经消失,内核就假定该程序可以安全访问。
  3. 文件保持打开一瞬间(exit_files): 即使内存已消失,程序的文件尚未关闭。

在这个微小的时间窗口内,攻击者可以使用 pidfd_getfd 工具来复制那些打开的文件。由于程序最初以 root 权限打开了这些文件,攻击者会获得一个可用的副本。

现实世界目标:ssh-keysign 和 chage

此攻击针对一种非常特定的程序“形状”。它需要一个 root 拥有的工具,该工具打开一个敏感文件,然后将其权限降级为普通用户,最后退出。

  • ssh-keysign: 此工具打开 SSH 主机私钥。由于此漏洞,攻击者可以捕获密钥,然后冒充您的服务器欺骗其他用户。
  • chage: 此工具管理用户密码并打开 /etc/shadow。攻击者可以在程序关闭时“竞态”以窃取您的密码哈希。

令人惊讶的是,ssh-keysign 中使此漏洞成为可能的代码自 2002 年以来一直完全相同。安全研究员 Jann Horn 甚至在 2020 年 10 月就警告过这个设计缺陷,称内核的逻辑“从安全角度来看是可疑的”。

如果您想测试此漏洞,请查看 GitHub 上的 ssh-keysign-pwn 仓库。它提供了必要的代码,用于演示 2025 年 5 月之前发布的内核上的漏洞。

Linus Torvalds 发布新补丁修复缺陷

Linus Torvalds 的新补丁,标识为 Commit 31e62c2ebbfd,引入了他所谓的“稍微更合理”的逻辑。

内核不再在内存被清除时“忘记”程序的安全状态,而是使用一个称为 user_dumpable 的缓存标志。

此标志记住程序在存活时是否受到保护。现在,如果攻击者试图在该退出窗口期间获取文件描述符,内核会看到缓存标志并阻止访问,除非用户具有高级别的 CAP_SYS_PTRACE 权限。

受影响的 Linux 系统

该漏洞影响几乎所有在 2025 年 5 月之前发布内核的主要 Linux 发行版。确认受影响的版本包括:

  • Ubuntu(20.04、22.04、24.04)
  • Debian 12
  • Arch Linux
  • CentOS 7
  • Raspberry Pi OS(Bookworm)

修复 FD 窃取漏洞

一旦您的发行版提供最新的安全补丁,请尽快更新内核。一旦您运行包含 Torvalds 修复的版本,那个“安全窗口”将永久关闭。

建议阅读: