OpenSSH 10.6p2:musl + 关闭 PAM 的构建存在密码绕过,升级后要手动重启 sshd
OpenSSH 10.6p2 于 2026-11-05 发布,修掉一个严重的密码认证绕过。截至发布日该问题尚未分配 CVE,基于 CVE 的扫描器可能不会标记受影响机器,只能手工确认构建类型。
- 发布说明:
- 版本历史:
中招前提是两层条件叠加
不是所有 OpenSSH 都受影响。触发需要同时满足:
- 构建使用 musl libc;
- 构建时关闭了 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,留给未修补窗口的时间比过去短得多。