编程 OpenSSH 10.6p2:musl + 关闭 PAM 的构建存在密码绕过,升级后要手动重启 sshd

2026-11-09 21:09:28

OpenSSH 10.6p2:musl + 关闭 PAM 的构建存在密码绕过,升级后要手动重启 sshd

OpenSSH 10.6p2 于 2026-11-05 发布,修掉一个严重的密码认证绕过。截至发布日该问题尚未分配 CVE,基于 CVE 的扫描器可能不会标记受影响机器,只能手工确认构建类型。

  • 发布说明:
  • 版本历史:

中招前提是两层条件叠加

不是所有 OpenSSH 都受影响。触发需要同时满足:

  1. 构建使用 musl libc;
  2. 构建时关闭了 PAM。

Debian、Ubuntu、RHEL 这类 glibc 发行版基本不受影响;Alpine 这类 musl 发行版要逐个确认。攻击还需要一个已存在、带真实密码的第二账号,光有一个已存哈希不够。

登录之前,远程就能观察到两件事:SSH banner 里的 OpenSSH 版本,以及服务器是否接受密码认证。不接受密码认证的服务器不受影响。

包升级不会重启正在运行的 sshd

这是最容易漏的一步。升级只替换磁盘上的二进制,内存里的守护进程还是旧的那份,漏洞照旧存在。升级后必须显式重启:

# systemd 发行版
systemctl restart sshd

# Alpine / OpenRC
rc-service sshd restart

Alpine 已为 3.16 到 3.24 及 edge 提供修补包。

只看 banner 版本不能证明已修

发行版普遍采用 backport:把修复打进旧版本号里重新构建,版本号不变。ssh -V 输出的数字只能说明基线版本,不能作为「已修复」的证据。要确认包版本与构建时间,或直接查发行版的更新记录。

检查命令

# 1. 当前版本
ssh -V

# 2. 确认是否 musl 构建
ldd $(which sshd) | grep -E 'musl|libc'

# 3. 是否仍允许密码认证
sshd -T | grep -i passwordauthentication

# 4. 排查密码登录记录
journalctl -u ssh | grep 'Accepted password'

排查是否已被利用

在第 4 条命令的输出里,重点看 Accepted password for 是否出现在本来没有密码的账号上——例如只有密钥的运维账号、服务账号、本应禁用的系统用户。这类记录不该存在。

拿不准、无法排除异常登录的,按已失陷处理:换密钥、清 authorized_keys、查 crontab 与 systemd unit、必要时重建。

无法立刻升级时的缓解

在 sshd_config 里关掉密码认证,改用密钥:

PasswordAuthentication no

改完同样要重启 sshd 才生效。这直接切断了该漏洞的利用路径,代价是失去密码登录的兜底手段,确认每台机器都有可用的密钥后再推。

顺带看 10.6 本体(2026-10-06)

安全

  • 禁用 LZ77 字典压缩,缓解跨通道压缩侧信道,对应论文《Crossing the Streams: SSH Plaintext Recovery via a Common Compression Context in Multiplexed Channels》(arXiv 2609.07709)。代价是 Compression 效果下降,需要压缩的场合改用应用层压缩。
  • ssh(1) 命令行输入的用户名拒绝包含 $ 与 \,防止经 ProxyCommand、Match exec 注入;配置文件里的 User 不受此限制。
  • sftp 更严格校验服务器返回路径,避免递归复制写到目标目录之外;sshd 只在 GSSAPI 认证成功后保存凭据;压缩 payload 不得超出最大包长;修正 authorized_keys 的 restrict 关键字对 tunnel forwarding 未生效的问题。

新特性

  • 启用混合后量子签名 ssh-mldsa44-ed25519,不再带 @openssh.com 后缀;之前实验版生成的密钥需要重新生成。
  • sshd 新增 WarnWeakCrypto,默认开启,会记录非后量子密钥交换。
  • ssh-keygen / ssh-add 保留 FIDO resident key 的 credProtect。
  • sftp mkdir 增加 -p。
  • ssh-keygen 增加 hexdump 导出。
  • ChannelTimeout 支持小数秒。
  • 新增 AgentSocketPath 选项。
  • 新增 PubkeyAuthOptions max-pk-ok。

弃用

scp(1) 的 -R 开始弃用。目前仍可用,会向 stderr 输出告警,未来版本将忽略该选项。

修复

  • ssh-keygen 处理夏令时导致的证书过期时间误差,最多 ±1 小时。
  • KDF 轮数上限设为 100 万;ssh-keygen 默认 KDF 轮数从 24 提到 32。

此次 10.6p2 除密码绕过修复外,还接受 ML-DSA 混合签名作为 CA 签名。OpenSSH 团队在得知漏洞后一天就发布了修复,理由很直接:AI agent 会在数小时内重新发现这类 bug,留给未修补窗口的时间比过去短得多。

复制全文 生成海报 运维 OpenSSH 安全补丁 Linux

推荐文章

程序员茄子在线接单