OpenSSH 10.4 发布:多项安全修复、新功能及可移植性改进!

📅 2026/7/7 20:06:17 👁️ 阅读次数 📝 编程学习
OpenSSH 10.4 发布:多项安全修复、新功能及可移植性改进!

OpenSSH 10.4 发布资讯

OpenSSH 10.4 于 2026 年 7 月 6 日发布,可从列出的镜像源获取。OpenSSH 是一个 100% 完整的 SSH 协议 2.0 实现,包含 sftp 客户端和服务器支持。在此,再次感谢 OpenSSH 社区对项目的持续支持,尤其感谢那些贡献代码或补丁、报告漏洞、测试快照或为项目捐款的人。有关捐款的更多信息可查看相关页面。

潜在不兼容的更改

没错,OpenSSH 10.4 存在一些潜在不兼容的更改:

  • sshd(8) 配置转储模式现在以混合大小写写入指令,而之前仅输出小写名称。
  • 在启用 seccomp 沙箱的 Linux 系统中,启用 SECCOMP 或 NO_NEW_PRIVS 失败现在是致命错误。之前,sshd(8) 会记录错误但继续运行,以支持缺乏这些功能的系统。现在,缺乏这些功能的系统应在配置时禁用沙箱。
  • ssh(1)、sshd(8) 如果对等方在认证后密钥重新交换期间发送非密钥交换(KEX)消息,则断开连接,使传输协议更严格。之前,恶意对等方可以不受惩罚地继续发送非密钥交换消息。这些消息会被缓冲,导致在连接终止或服务器/客户端达到内存限制之前浪费内存。未按照 RFC4253 第 7.1 节限制密钥交换期间发送消息的实现可能会被断开连接。此问题由 Marko Jevtic 报告。

自 OpenSSH 10.3 以来的更改

那么,此版本包含多项安全修复、常规漏洞修复以及一些新功能:

安全方面
  • sftp(1) 使用 “sftp host:/path .” 在命令行下载文件时,恶意服务器可能导致文件下载到意外位置。此问题由 Swival 安全扫描器发现。
  • scp(1) 在两个远程目标之间复制文件时,不允许恶意服务器将文件写入预期目标目录的父目录。此问题由 Swival 安全扫描器发现。
  • 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) 修复了如果服务器在密钥重新交换期间更改其主机密钥,客户端可能出现的使用后释放(use-after-free)问题。此问题由 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 的实现替换通配符模式匹配器,避免旧实现的指数级最坏情况行为。
漏洞修复
  • ssh-agent(1) 修复 “query” SSH_AGENTC_EXTENSION 请求的错误回复。(bz3967)
  • sshd(8) 避免在 GSSAPIAuthentication(默认禁用)中为有效和无效用户发送明显不同的消息。
  • ssh(1)、sshd(8) 修复了几个错误地将批量流量分类为交互式流量的漏洞。(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 扩展同时对同一索引节点进行读写操作。
  • ssh(1)、sshd(8) 避免在发送 x11-req SSH_MSG_CHANNEL_REQUEST 之前创建 X11 通道时出现 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 不依赖这些属性。
  • 加密代码修复余因子不等于 1 的曲线的 ECDSA 顺序检查问题。所有支持的 EC 曲线余因子均为 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 上出现强化警告。(bz3954)
  • 修复可移植性代码中错误路径上的一些内存泄漏问题。(GHPR681)
  • 修订 README.privsep 文档,以反映 sshd 最近向多二进制模型的转变。

校验和

以下是 OpenSSH 10.4 的校验和信息:

  • 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 密钥可从镜像站点获取。

报告漏洞

请阅读相关页面。安全漏洞应直接报告给 openssh@openssh.com。那么,对于这些更改和修复,你认为对用户会产生怎样的影响呢?