综合 OpenSSH 10.x 变更清单:sshd 拆出 sshd-auth、默认关闭 modp DH,客户端换用 mlkem768x25519

2026-09-24 21:14:17

OpenSSH 10.x 变更清单:sshd 拆出 sshd-auth、默认关闭 modp DH,客户端换用 mlkem768x25519

以下笔记整理自 Debian changelog(openssh 1:10.2p1-6)、Ubuntu changelog(10.2p1-2ubuntu3)以及 OpenSSH release notes。按对运维/安全的影响排列,版本号标注在括号里。

认证阶段代码拆到独立的 sshd-auth 二进制(OpenSSH 10.0)

sshd 把协议中用户认证阶段的代码,从每连接的 sshd-session 二进制里移出,放进新的 sshd-auth 二进制。目的很直接:让关键的 pre-authentication 攻击面与连接其余部分使用的代码处在完全不相交的地址空间里。附带收益是认证阶段结束后认证代码被卸载,运行时内存略有节省。

对用户基本无感,但有一处可见变化:部分日志消息现在来自 sshd-auth 而不是 sshd-session。日志采集、告警规则、审计脚本里如果按进程名匹配,需要检查一遍。

sshd 默认禁用有限域 Diffie-Hellman

该版本在 sshd 侧默认关闭 finite field(modp)Diffie-Hellman 密钥交换,即从默认 KEXAlgorithms 列表中移除 diffie-hellman-group*diffie-hellman-group-exchange-*客户端不变,仍默认支持这些方法。

注意方向和范围:只有服务端默认值改了。仍只支持 group DH 的老客户端(旧版 PuTTY、嵌入式 ssh 客户端、部分网络设备)连上来会协商失败。处理方式二选一:升级客户端,或在服务端显式把相关算法加回 KEXAlgorithms

moduli 文件缺请求区间时不再隐式回退

Diffie-Hellman Group Exchange 在 moduli 文件存在、但不包含客户端请求范围内的模数时,过去会隐式回退到编译内置 group;这个回退被移除,只在 moduli 文件完全不存在时才保留。

结果是管理员获得了更明确的控制,代价是 moduli 文件编辑不当会直接造成连接失败。改动 moduli 后建议在测试环境用请求不同位数的客户端各验一次。

客户端默认改用混合后量子 KEX

ssh(1) 的默认密钥协商算法变为 mlkem768x25519-sha256。它是混合算法:抗量子计算机,强度不低于 curve25519-sha256,由 NIST 标准化,并且比此前的默认算法更快。服务端不支持时按 KEX 列表继续协商其他算法。

密文偏好:AES-GCM 优先于 AES-CTR

ssh(1) 默认密文偏好列表现在是 Chacha20/Poly1305、AES-GCM(128/256)、然后 AES-CTR(128/192/256)。CTR 仍保留,只是排在后面。

Match 支持扩展

ssh(1)sshd(8) 新增 Match versionssh_config 新增 Match sessiontype。可以按对端版本、会话类型做条件配置。

DSA 移除与 OpenSSH_1* 匹配陷阱

OpenSSH 10.0 移除对弱 DSA 签名算法的支持,版本串宣告为 SSH-2.0-OpenSSH_10.0。软件里如果存在 OpenSSH_1* 这类朴素前缀匹配来判断版本,会把 10.x 误判为 1.x。

两个 CVE

  • CVE-2025-32728sshd(8)DisableForwarding 指令按文档应禁用 X11 转发与 agent 转发,实际未做到。
  • CVE-2026-3497:GSS-API 错误处理不正确;以 ssh_packet_disconnect() 替换 sshpkt_disconnect();并取消默认使用弱 GSS-API 交换算法。

10.2 之后的修复项

来自 release notes 中 "Changes since OpenSSH 10.2" 一组:

  • ssh(1):对命令行传入用户名的 shell 元字符校验执行过晚,无法阻止 ssh_config 中的 %-token 展开。若配置在 Match exec 块中使用了 %u,控制传给 ssh(1) 用户名的攻击者有可能执行任意 shell 命令。报告者 Florian Kohnhäuser。
  • sshd(8):主名(principal)中含逗号时,principals="" 的匹配 bug。
  • scp(1):以 root 身份、legacy (-O) 模式下载文件且不带 -p 时,未清除 setuid/setgid 位;该问题可追溯到 Berkeley rcp。
  • sshd(8):对 ECDSA 密钥未完整应用 PubkeyAcceptedAlgorithms / HostbasedAcceptedAlgorithms
  • ssh(1):代理模式多路复用的连接复用确认未被测试。

10.2 与后续弃用

OpenSSH 10.2(2025-10-10)是 bugfix 版本,修复了 ControlPersist 导致 ssh(1) 不可用的问题。未来弃用提醒:SHA1 SSHFP 记录将被忽略,ssh-keygen -r 将只生成 SHA256 SSHFP。

升级前建议自行验证的几项

  • 现有客户端是否只支持 diffie-hellman-group*;服务端当前值可用 sshd -T | grep kexalgorithms 确认(具体字段名以你环境版本输出为准)。
  • 本机 moduli 是否被本地修改过、覆盖哪些位数范围,以及是否有客户端在请求该范围外的位数。
  • 日志采集/告警规则是否按 sshd-session 进程名匹配。
  • 自有脚本或网管系统里是否存在 OpenSSH_1* 一类版本前缀匹配。

来源:openssh.org/releasenotes.html、Debian changelog openssh 1:10.2p1-6、Ubuntu changelog 10.2p1-2ubuntu3

复制全文 生成海报 OpenSSH 运维 安全 SSH

推荐文章

程序员茄子在线接单