OpenSSH 10.4/10.4p1 正式发布
原标题:OpenSSH 10.4/10.4p1 Released
速览
OpenSSH项目发布了10.4及10.4p1版本,这是安全通信工具的重要更新。新版本修复了多个安全漏洞,并引入了新的功能特性。该版本对服务器和客户端均有改进,建议用户及时升级。
AI 深度解读
背景
OpenSSH 是使用最广泛的 SSH 协议实现,提供安全的远程登录、文件传输等功能,广泛应用于服务器管理、自动化运维和云基础设施。2026 年 7 月 6 日,OpenSSH 发布了 10.4 版本(对应 OpenSSH 10.4 及 OpenSSH 10.4p1),这是继 10.3 之后的一次重要更新,重点修复了多个安全漏洞,并引入了实验性后量子签名支持。
核心内容
OpenSSH 10.4 是一次融合安全修复、新功能与多项 bug 修复的常规版本。以下是本次发布的主要变更:
潜在不兼容变更
- sshd(8) 配置转储模式变化:
sshd -G现在输出的配置指令采用混合大小写(如PubkeyAuthentication),此前仅输出小写名称。 - Linux seccomp 沙箱行为变更:在启用 seccomp 沙箱的 Linux 系统上,若无法启用
SECCOMP或NO_NEW_PRIVS,sshd 将直接终止进程(此前仅记录错误并继续运行)。缺乏这些特性的系统应在编译时禁用沙箱。 - 传输协议严格化:在认证后的密钥重交换期间,如果对端发送非密钥交换消息,ssh(1) 和 sshd(8) 会立即断开连接。此前恶意对端可无惩罚地持续发送非密钥交换消息,导致缓冲区内存浪费直至连接终止或达到内存限制。该问题由 Marko Jevtic 报告。
安全修复
本次修复了多个安全漏洞,涵盖 sftp、scp、sshd 和 ssh:
- sftp(1) 命令行下载路径劫持:使用
sftp host:/path .下载文件时,恶意服务器可将文件下载到非预期位置(由 Swival Security Scanner 发现)。 - scp(1) 远程到远程复制目录穿越:在两个远程目的地之间复制文件时,不允许恶意服务器将文件写入目标目录的父目录(同样由 Swival Security Scanner 发现)。
- sshd(8) internal-sftp 命令行截断:当使用 internal-sftp SFTP 服务器实现(非默认)时,长命令行的第 10 个及之后的参数会被静默丢弃,可能导致安全相关选项失效(Steve Caffrey 报告)。
- GSSAPIStrictAcceptorCheck 文档补充:明确说明当服务器加入 Windows Active Directory 时,该选项无效(Safebreach 的 Yarin Aharoni 报告)。
- DisableForwarding 与 PermitTunnel 冲突:
DisableForwarding=yes未能覆盖PermitTunnel=yes(后者默认关闭)。由 Redhat 的 Huzaifa Sidhpurwala 和 Marko Jevtic 独立报告。 - GSSAPIAuthentication 预认证 DoS:当启用 GSSAPIAuthentication(默认关闭)时,存在潜在的预认证拒绝服务漏洞,不受
MaxAuthTries限制,但会被PerSourcePenalties惩罚(奥地利国防部 milCERT AT 的 Manfred Kaiser 报告)。 - 最小认证延迟未强制:修复多个未正确执行最小认证延迟的情况(Orange Cyberdefense 漏洞团队报告)。
- 客户端 use-after-free:若服务器在密钥重交换期间更换主机密钥,可能导致客户端 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(非确定有限自动机)的实现,避免旧实现中的指数级最坏情况性能问题。
Bug 修复
本版本修复了大量 bug,涵盖 ssh-agent、sshd、ssh-keygen、sftp、scp 等组件,包括但不限于:
- ssh-agent:修复对
SSH_AGENTC_EXTENSION查询请求的错误回复(bz3967)。 - sshd:在 GSSAPIAuthentication(默认关闭)中避免对有效/无效用户发送可观测的不同消息。
- ssh/sshd:修复将批量流量误判为交互式流量的多个 bug(bz3972、bz3958)。
- ssh-keygen/ssh-add:从 FIDO token 下载常驻密钥时跳过不支持的密钥类型(此前遇到即中止)(GHPR657)。
- ssh:修复
cipher_init()失败时的潜在 use-after-free。 - sshd:对权限分离子进程间传递的传输状态进行更严格的编码和验证,加强服务器安全性。
- ssh-agent:对密钥使用约束中的用户名长度施加限制,避免运行时 DoS。
- sftp:修复
SSH2_FXP_REALPATH和批处理命令处理中的两个单字节越界读取。 - sftp-server:禁止使用 copy-data 扩展同时读写同一 inode。
- ssh/sshd:修复在 x11-req 消息发送前创建 X11 通道导致的
strlen(NULL)崩溃(GHPR679)。 - sftp/scp:修复
sftp_download()在服务器反复返回零长度时陷入循环的问题。 - ssh:避免将 DNS0x20 大小写随机化的名称泄露到通过
CanonicalizePermittedCNAMEs规范化的名称中(bz3966)。 - sftp-server:修复在
PATH_MAX不是实际最大值的系统上,处理SSH_FXP_REALPATH时路径名截断问题(GHPR688)。 - ssh/sshd:修正某些 socket 类型通道的
poll(2)事件掩码设置(GHPR660)。 - sshd:对 sshd_config 解析和管理代码进行重大重构,以便在权限分离边界上进行更精确的序列化/反序列化。
- ssh-add:在
getopt()处理完成后才打开与 agent 的连接,使-v等选项能显示调试信息。 - 加密代码:修复长度超过
size_t可容纳范围的签名消息的边界检查(OpenSSH 中消息大小受SSHBUF_SIZE_MAX限制,实际不可达)。 - 加密代码:为 ed25519 验证增加签名可变性和公钥有效性检查(SSH 不依赖这些属性,但作为防御性加固)。
- 加密代码:修复 cofactor != 1 曲线的 ECDSA 顺序检查(所有支持的 EC 曲线 cofactor 均为 1,因此不可达)。
- sshd:在日志中区分子系统启动失败的原因是执行失败还是子系统未找到(GHPR637)。
- 所有组件:使用更安全的
timegm(3)和mktime(3)错误检测惯用法。 - ssh/sshd:避免接受配置文件或命令行参数中的无效密码或 MAC 列表(可能导致运行时失败)。
- ssh:修复使用 PEM 风格私钥且没有对应 .pub 密钥文件时的 NULL 解引用崩溃。
- sshd:使用 PKCS#11 密钥时不打印加载主机私钥的错误消息(这些密钥不需要文件系统上的私钥部分)(GHPR664)。
- 所有组件:不再使用已废弃的
ERR_load_crypto_strings()(GHPR650)。 - ssh:正确报告配置默认设置期间的错误(GHPR649)。
- ssh:在错误消息中使用正确的指令名(
Match而非Host)(bz3968)。 - sftp:修复
ls -ln命令(原文此处被截断,推测是修复该命令的显示问题)。
关键要点
- 安全修复密集:本次修复了 8 个安全漏洞,涉及 sftp 下载路径劫
查看原文 →openssh.org
