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 version;ssh_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-32728:
sshd(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。