OpenSSH 10.4
摘要
OpenSSH 10.4 于 2026 年 7 月 6 日发布,包含安全修复以及对一种结合 ML-DSA 44 和 Ed25519 的复合后量子签名方案的实验性支持。
<p><a href="https://lobste.rs/s/caofow/openssh_10_4">评论</a></p>
查看缓存全文
缓存时间: 2026/07/07 04:12
# OpenSSH:发布说明
来源:https://www.openssh.org/releasenotes.html
---
### OpenSSH 10.4 (https://www.openssh.org/txt/release-10.4)/10.4p1 (https://www.openssh.org/txt/release-10.4) (2026-07-06)
OpenSSH 10.4 于 2026 年 7 月 6 日发布。可从 https://www.openssh.com/ 列出的镜像站点获取。OpenSSH 是 SSH 协议 2.0 的 100% 完整实现,并包含 sftp 客户端和服务端支持。
我们再次感谢 OpenSSH 社区对本项目的持续支持,特别是那些贡献代码或补丁、报告 bug、测试快照或向项目捐赠的人们。有关捐赠的更多信息,请访问:https://www.openssh.com/donations.html
潜在不兼容变更
----------------
* sshd(8):配置转储模式("sshd -G")现在以混合大小写(例如 "PubkeyAuthentication")写入指令,而之前仅输出小写名称。
* sshd(8):在启用 seccomp 沙箱的 Linux 系统上,无法启用 SECCOMP 或 NO_NEW_PRIVS 现在会导致致命错误。以前 sshd(8) 会记录错误但继续运行,以支持缺少这些功能的系统。现在缺少这些功能的系统应改为在配置时禁用沙箱。
* ssh(1), sshd(8):使传输协议更加严格,如果对等方在认证后的密钥重新交换期间发送非 KEX 消息,则断开连接。以前恶意对等方可以继续发送非密钥交换消息而不受惩罚。这些消息会被缓冲,导致内存浪费直至连接终止或服务端/客户端达到内存限制。不按 RFC4253 第 7.1 节限制密钥交换期间发送消息的实现可能会被断开连接。由 Marko Jevtic 报告。
自 OpenSSH 10.3 以来的变更
==========================
此版本包含多项安全修复、常规 bug 修复以及一些新功能。
安全性
=======
* sftp(1):使用 "sftp host:/path ." 在命令行下载文件时,恶意服务端可能导致文件下载到意外位置。此问题由 Swival Security Scanner 发现。
* scp(1):在两个远程目的地之间复制文件时,不允许恶意服务端将文件写入目标目录的父目录。此问题由 Swival Security Scanner 发现。
* sshd(8):当使用 "internal-sftp" SFTP 服务端实现(非默认)时,长命令行此前在第 9 个参数后静默截断。如果安全相关选项在第 10 个或更靠后的位置,则会被丢弃。由 Steve Caffrey 报告。
* sshd(8):添加文档说明,指出当服务端加入 Windows Active Directory 时,GSSAPIStrictAcceptorCheck 选项无效。由 Safebreach 的 Yarin Aharoni 报告。
* sshd(8):DisableForwarding=yes 并未像文档所述覆盖 PermitTunnel=yes。请注意 PermitTunnel 默认未启用。由 Redhat 的 Huzaifa Sidhpurwala 和 Marko Jevtic 独立报告。
* sshd(8):当启用 GSSAPIAuthentication 时(此功能默认关闭),避免潜在的身份验证前拒绝服务。此问题不受 MaxAuthTries 缓解,但会被 PerSourcePenalties 处罚。由奥地利国防部 milCERT AT 的 Manfred Kaiser 报告。
* sshd(8):修复未执行最小认证延迟的多个情况。由 Orange Cyberdefense 漏洞团队报告。
* ssh(1):修复服务端在密钥重新交换期间更改主机密钥时可能发生的客户端释放后使用问题。由 Depthfirst 的 Zhenpeng (Leo) Lin 报告。
新功能
-----------
* 所有组件:添加对组合后量子签名方案的实验性支持,该方案结合了 ML-DSA 44 和 Ed25519,如 draft-miller-sshm-mldsa44-ed25519-composite-sigs 所述。此方案默认未启用。要使用它,需要将其添加到 HostKeyAlgorithms、PubkeyAcceptedAlgorithms 等中。可以使用 "ssh-keygen -t mldsa44-ed25519" 生成密钥。
* ssh(1), sshd(8):将通配符模式匹配器替换为基于 NFA 的实现。这避免了旧实现的指数级最坏情况行为。
Bug 修复
--------
* ssh-agent(1):修复对 "query" SSH_AGENTC_EXTENSION 请求的错误响应。bz3967
* sshd(8):避免在 GSSAPIAuthentication(默认禁用)中对有效用户和无效用户发送可观察的不同消息。
* ssh(1), sshd(8):修复将批量流量错误分类为交互式流量的多个 bug。bz3972, bz3958
* ssh-keygen(1), ssh-add(1):从 FIDO 令牌下载驻留密钥时跳过不支持的密钥类型。以前遇到此类密钥时下载会中止。GHPR657
* ssh(1):修复在 cipher_init() 失败时错误路径上的潜在释放后使用问题。
* sshd(8):对在 sshd 进程间传递的传输状态进行更严格的编码和验证。这进一步加强了服务端对 sshd-auth 或 sshd-session 子进程攻击的防护。
* ssh-agent(1):通过对密钥使用约束中的用户名长度施加一些限制,避免可能的运行时拒绝服务。
* sftp(1):修复两个单独的一字节越界读取,分别位于 SSH2_FXP_REALPATH 和批处理命令处理中。
* sftp-server(8):禁止使用 copy-data 扩展同时读取和写入相同的 inode。
* ssh(1), sshd(8):如果 X11 通道在发送 x11-req SSH_MSG_CHANNEL_REQUEST 之前创建,则避免 strlen(NULL) 崩溃。GHPR679
* sftp(1), scp(1):避免 sftp_download() 在读取文件时如果损坏的服务端反复返回零长度可能陷入循环的情况。
* ssh(1):避免将 DNS0x20 大小随机化名称泄露到使用 CanonicalizePermittedCNAMEs 规范化的名称中。bz3966
* sftp-server(8):在 PATH_MAX 不是实际最大值的系统上处理 SSH_FXP_REALPATH 时,避免传递给 lstat() 的路径名被截断。GHPR688
* ssh(1), sshd(8):纠正某些套接字类型通道的 poll(2) 事件掩码的设置。GHPR660
* sshd(8):对 sshd_config 解析和管理代码进行了重大重构,以便在权限分离边界上进行更精确的序列化/反序列化。
* ssh-add(1):仅在 getopt() 处理完成后才打开与代理的连接,以便类似 "-v" 的选项有机会显示此操作的调试信息。
* 加密代码:修复在签名长度大于 size_t 所能容纳的消息时的边界检查。在 OpenSSH 中,消息大小受 SSHBUF_SIZE_MAX 限制,因此此问题不可达。
* 加密代码:为 ed25519 验证添加签名可塑性检查和公钥有效性检查。SSH 不依赖这些属性。
* 加密代码:修复具有 cofactor != 1 的 ECDSA 曲线的顺序检查。所有支持的 EC 曲线的 cofactor 均为 1,因此此问题不可达。
* sshd(8):在记录子系统启动失败时,区分执行失败和未找到子系统两种情况。GHPR637
* 所有组件:使用更安全的惯用法进行 timegm(3) 和 mktime(3) 的错误检测。
* ssh(1), sshd(8):避免在配置文件或命令行参数中接受无效的密码或 MAC 列表。这可能导致后续运行时失败。
* ssh(1):当使用 PEM 样式私钥且附近没有对应的 .pub 文件时,修复在公钥认证期间的空指针引用崩溃。
* sshd(8):当使用 PKCS#11 密钥时,不要打印加载主机私钥的错误消息,因为这些密钥不需要文件系统上的私钥部分。GHPR664
* 所有组件:不要使用已弃用的 ERR_load_crypto_strings()。GHPR650
* ssh(1):正确报告配置默认设置期间发生的错误。GHPR649
* ssh(1):在错误消息中使用正确的指令名称(Match 而非 Host)。bz3968
* sftp(1):修复 "ls -ln" 未能正确显示数字 UID/GID 而显示用户和组名的问题。bz3953
* sshd(8):如果在配置解析期间分配失败,避免可能的空指针引用。bz3948
* 所有组件:修复多处加载超大公钥的无效防护措施。bz3969 和 bz3970
* sftp(1):确保 sftp 用于与 ssh(1) 子进程通信的文件描述符不会泄漏到执行的子进程(例如通过 "!")。GHPR693
可移植性
-----------
* 从 OpenBSD 上游同步 fmt_scaled.c,修复大指数的精确性问题 (GHPR671)
* sshd(8):移除 clock_gettime64 的重复沙箱条目。
* ssh(1), sshd(8):如果系统头文件未提供,则使用正确的 IPTOS_DSCP_VA 值。
* 从 OpenBSD 上游同步 getrrsetbyname.c,包含健壮性修复。
* 禁用 openbsd-compat 中未使用的 strvisx(3) 和 stravis(3) 的替代实现,因为这些在 OpenSSH 中未使用。
* 避免 Android 上的 fortify 警告。bz3954
* 修复可移植性代码错误路径上的多个内存泄漏。GHPR681
* 修订 README.privsep 文档,以反映 sshd 近期切换到多二进制模型。
校验和:
==========
- SHA1 (openssh-10.4.tar.gz) = 8502b516230865e229d55045bb4ccc67aeae905b
- SHA256 (openssh-10.4.tar.gz) = qUVI+wMg4mVpiQbXvfMVkF3Zuyy2JrS+ZjN764mtyGE=
- SHA1 (openssh-10.4p1.tar.gz) = ae8650a71cc52dbbd049519cee276ae6d65c2c4d
- SHA256 (openssh-10.4p1.tar.gz) = 72Am3SrqjVYFljjV0yYpAsiSzrqfiDlYNeDQbT+2Mjg=
请注意,SHA256 签名是 base64 编码的,而非十六进制(大多数校验和工具的默认格式)。用于签署发布的 PGP 密钥可从镜像站点获取:
https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/RELEASE_KEY.asc
报告 Bug:
===============
- 请阅读 https://www.openssh.com/report.html
安全 Bug 应直接发送至 [email protected]
---
### OpenSSH 10.3 (https://www.openssh.org/txt/release-10.3)/10.3p1 (https://www.openssh.org/txt/release-10.3) (2026-04-02)
OpenSSH 10.3 于 2026 年 4 月 2 日发布。可从 https://www.openssh.com/ 列出的镜像站点获取。OpenSSH 是 SSH 协议 2.0 的 100% 完整实现,并包含 sftp 客户端和服务端支持。
我们再次感谢 OpenSSH 社区对本项目的持续支持,特别是那些贡献代码或补丁、报告 bug、测试快照或向项目捐赠的人们。有关捐赠的更多信息,请访问:https://www.openssh.com/donations.html
潜在不兼容变更
----------------
* ssh(1), sshd(8):移除对不支持重新密钥的实现所做的 bug 兼容性。如果此类实现尝试与 OpenSSH 互操作,当传输需要重新密钥时,它最终会失败。
* sshd(8):在此版本之前,通过在 authorized_keys 中使用 principals="" 选项,证书的 principals 部分为空的情况下会被视为匹配任何主体(即作为通配符)。这是有意为之,但如果 CA 意外签发了一个 principals 部分为空的证书,则会产生一个令人惊讶且可能有风险的情况:它不会像预期的那样毫无用处,反而可用于认证任何通过 authorized_keys 信任该 CA 的用户。[注意:此条件不适用于通过 sshd_config(5) 的 TrustedUserCAKeys 选项信任的 CA。] 此版本将空的 principals 部分视为永不匹配任何主体,并修复了证书主体中通配符字符的解释。现在对主机证书一致实现,而对用户证书不支持。
* ssh(1):-J 和等效的 -oProxyJump="..." 选项现在验证通过命令行传递的 ProxyJump/-J 选项中的用户和主机名(对此选项在配置文件中不执行此类验证)。这可以防止在直接暴露给对抗性输入时发生 shell 注入,但这从一开始就是个糟糕的主意。由 rabbit 报告。
自 OpenSSH 10.2 以来的变更
==========================
此版本包含一些相对较小的安全修复以及多项功能改进和常规 bug 修复。
安全性
=======
* ssh(1):对命令行中输入的用户名中的 shell 元字符的验证执行得太晚,无法阻止某些情况下它们在 ssh_config 中从 %-令牌展开。对于某些配置,例如在 "Match exec" 块中使用 "%u" 令牌的配置,攻击者如果可以控制传递给 ssh(1) 的用户名,则可能能够执行任意 shell 命令。由 Florian Kohnhäuser 报告。我们继续建议不要直接将 ssh(1) 和其他工具的命令行暴露给不受信任的输入。鉴于正在使用的各种 shell 和用户配置,此类缓解措施并非绝对。
* sshd(8):当将 authorized_keys 的 principals="" 选项与证书中的主体列表进行匹配时,使用了错误的算法,这可能在证书中的主体名称包含逗号字符时导致不适当的匹配。利用此条件需要 authorized_keys 的 principals="" 选项列出多个主体,并且 CA 将签发一个证书,该证书编码了由逗号分隔的多个此类主体名称(典型的 CA 会严格限制它们放入证书的主体名称)。此条件仅适用于 authorized_keys 中的用户信任 CA 密钥,主认证路径(TrustedUserCAKeys/AuthorizedPrincipalsFile)不受影响。由 Vladimir Tokarev 报告。
* scp(1):在以 root 身份使用传统(-O)模式且未设置 -p(保留模式)标志下载文件时,scp 未能如通常预期那样清除下载文件的 setuid/setgid 位。此 bug 可追溯到原始的 Berkeley rcp 程序。由 Cantina 和 Spearbit 的 Christos Papakonstantinou 报告。
* sshd(8):修复 PubkeyAcceptedAlgorithms 和 HostbasedAcceptedAlgorithms 对 ECDSA 密钥未完全应用的问题。以前,如果这些指令中的任何一个包含任何 ECDSA 算法名称(例如 "ecdsa-sha2-nistp384"),那么任何其他 ECDSA 算法都会被接受,无论是否列出。由 Cantina 和 Spearbit 的 Christos Papakonstantinou 报告。
* ssh(1):连接复用确认(使用 "ControlMaster ask/autoask" 请求)未在代理模式复用会话(即 "ssh -O proxy ...")中测试。由 Michalis Vasileiadis 报告。
新功能
-----------
* ssh(1), sshd(8):支持 IANA 分配的 SSH 代理转发代码点,如 draft-ietf-sshm-ssh-agent 所述。对新名称的支持通过 EXT_INFO 消息通告。如果服务端提供对新名称的支持,则优先使用它们。对代理转发的前标准化 "@openssh.com" 扩展的支持仍然保留。
* ssh-agent(1):实现对 draft-ietf-sshm-ssh-agent "query" 扩展的支持。
* ssh-add(1):通过代理的 "query" 扩展,使用新的 -Q 标志支持查询协议扩展。
* ssh(1):支持在 ssh_config 的 RevokedHostKeys 指令中使用多个文件。bz3918
* sshd(8):支持在 sshd_config 的 RevokedKeys 指令中使用多个文件。bz3918
* ssh(1):添加一个 ~I 转义选项,显示当前 SSH 连接的信息。
* ssh(1):添加一个 "ssh -Oconninfo user@host" 复用命令,显示连接信息,类似于 ~I 转义字符。
* ssh(1):添加一个 "ssh -O channels user@host" 复用命令,获取正在运行的 mux 进程以显示当前打开的通道信息。
* sshd(8):向 PerSourcePenalties 添加 'invaliduser' 惩罚,应用于与真实帐户不匹配的用户名的登录尝试。默认值为 5s 以匹配 'authfail',但允许管理员根据需要延长阻止此类尝试的时间。
* sshd(8):为服务端添加 GSSAPIDelegateCredentials 选项,控制是否接受客户端提供的委托凭证。此选项镜像了 ssh_config 中的相同选项。GHPR6
相似文章
OpenSSH 10.4/10.4p1 发布
OpenSSH 10.4/10.4p1 发布,包含安全修复和实验性后量子签名支持。
被植入木马的OpenSSH(2002年)
2002年8月,OpenBSD FTP服务器上的OpenSSH源码tarball包被替换为被植入木马的版本,导致了一起安全事件,OpenBSD团队对此作出了响应。
Erlang/OTP 29.0 发布
Erlang/OTP 29.0 是一个重要版本,引入了原生记录、多值推导式、改进的编译器警告,以及增强的安全默认设置(如禁用 SSH 守护进程)。此外,该版本还包含了 JIT 改进以及诸如后量子加密支持等实验性功能。
OpenBSD 7.9 发布
OpenBSD 7.9 已发布,包含针对 arm64、amd64、luna88k、riscv64 等架构的平台特定改进,以及各种错误修复和增强的硬件支持。
Let's Encrypt的后量子未来
Let's Encrypt宣布计划采用Merkle Tree证书进行后量子认证,以应对Web PKI中向后量子签名迁移日益增长的紧迫性。