日期 :2026-07-08 主题 :OpenSSH 10.4 发布:后量子签名时代来临 原文 :OpenSSH 10.4 发布:后量子签名时代来临 来源 :LWN.net 领域:🔒 安全/网络
背景
2026 年 7 月 6 日,OpenSSH 10.4 正式发布。这个版本最引人注目的特性,是引入了实验性的后量子(post-quantum)签名方案支持------将 ML-DSA 44(基于格的数字签名算法)与经典的 Ed25519 组合成复合签名。这标志着 SSH 协议在量子计算威胁面前迈出了防御性的第一步。
除此之外,10.4 还带来了多项安全加固和功能改进:在 Linux 上强制 SECCOMP 沙箱、对传输协议做更严格的报文校验、重写了通配符匹配器避免指数级性能退化,以及修复了一批安全漏洞。本文将从技术角度逐一拆解这些变化。
核心内容
后量子签名:ML-DSA 44 + Ed25519 复合方案
量子计算对当前公钥密码体系的威胁已经不是新鲜话题。Shor 算法可以在多项式时间内破解 RSA 和 ECDSA,这意味着一旦大规模容错量子计算机建成,目前 SSH 依赖的签名算法将全面失效。
美国 NIST 在 2024 年正式标准化的 FIPS 204(ML-DSA,Module-Lattice-Based Digital Signature Algorithm),就是为应对这一威胁而设计的后量子签名标准。ML-DSA 基于格密码中的 Module-LWE 问题,目前学术界普遍认为它能够抵抗量子攻击。
OpenSSH 10.4 采纳了 IETF 草案 draft-miller-sshm-mldsa44-ed25519-composite-sigs,实现了一种复合签名方案:
- 对同一份数据同时用 ML-DSA 44 和 Ed25519 签名
- 验证时要求两份签名同时有效才通过
- 既提供经典安全性(Ed25519),又提供量子安全性(ML-DSA 44)
这种"双签名"设计的精巧之处在于:即使将来 Ed25519 被量子攻破,只要 ML-DSA 还是安全的,复合签名就仍然成立。反过来,如果 ML-DSA 被发现有经典攻击漏洞,Ed25519 也能兜底。这是一种"不把鸡蛋放在同一个篮子里"的安全策略。
当然,这个方案目前还是实验性的,默认并不启用。需要手动配置才能使用:
bash
# 生成复合签名密钥
ssh-keygen -t mldsa44-ed25519
# 在 sshd_config 中启用
HostKeyAlgorithms sk-ssh-ed25519-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,mldsa44-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,ssh-ed25519,mldsa44-ed25519
PubkeyAcceptedAlgorithms sk-ssh-ed25519-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,mldsa44-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,ssh-ed25519,mldsa44-ed25519
密钥的长度也有所增加。ML-DSA 44 的公钥约 1.3 KB,签名约 2.4 KB,相比 Ed25519 的 32 字节公钥加 64 字节签名大了不少。这意味着握手阶段的网络开销会有所上升,但从安全的角度来看,这笔代价是值得的。
SECCOMP 沙箱强制:不再容忍不安全的环境
在 Linux 平台上,OpenSSH 自 6.7 起就支持使用 seccomp(secure computing mode)对 sshd 的子进程做沙箱隔离。当客户端完成认证后,sshd 会创建一个受限的子进程来处理后续会话,这个子进程只允许调用少数几个系统调用,大幅降低了被利用后的危害范围。
10.4 之前,如果系统没有启用 SECCOMP 或 NO_NEW_PRIVS,sshd 只会记录一条错误日志然后继续运行。这在某些老旧容器环境或自定义内核中很常见------操作员甚至可能从未注意到沙箱其实没有生效。
10.4 改变了这个行为 :如果编译时启用了沙箱支持,但运行时系统无法启用 SECCOMP 或 NO_NEW_PRIVS,sshd 直接退出,不再妥协。对于确实无法支持这些特性的系统,维护者需要在编译时显式禁用沙箱:
bash
# 编译时禁用沙箱
./configure --without-sandbox
这是一个"默认安全"的立场变化:与其让大家以为沙箱在工作实际上却没有,不如让问题在启动时就暴露出来。
传输协议加固:拒绝乱序消息
RFC 4253 第 7.1 节明确规定,在密钥重新交换(key re-exchange)期间,对端不应发送非密钥交换消息。然而 OpenSSH 之前的实现对此并没有强制约束------如果对端在此期间发送了常规数据,这些数据会被缓冲起来,等密钥交换完成后再处理。
这看起来像个"友好的兼容性"设计,但实际带来了风险:一个恶意的对端可以持续发送大量数据,导致接收端不断消耗内存缓冲这些消息,形成拒绝服务攻击。
10.4 修正了这个问题:如果在 post-authentication 密钥重新交换期间收到非 KEX 消息,连接将被直接断开。这属于 breaking change------一些没有严格遵循 RFC 4253 的实现可能会因此无法与 OpenSSH 10.4 互通。
通配符匹配器重写:从递归到 NFA
这是一个容易被忽略但非常有价值的工程改进。OpenSSH 的配置文件(如 sshd_config、authorized_keys)中大量使用通配符模式匹配(如 *、?),用于匹配主机名、用户名等。原先的实现基于递归回溯,在某些精心构造的模式匹配场景下,会出现指数级的时间复杂度------这实际上是一个拒绝服务向量。
10.4 将通配符匹配器替换为基于 NFA(非确定性有限自动机)的实现。NFA 的匹配复杂度是 O(n × m),无论输入如何构造都不会退化到指数级。这借鉴了正则表达式引擎中从回溯到自动机的经典优化思路。
安全修复一览
除了上述新特性,10.4 还修复了多个安全漏洞:
- sftp 下载路径劫持 :使用
sftp host:/path .下载文件时,恶意服务器可能将文件写入非预期的位置 - scp 远程间拷贝:双远程拷贝场景下,防止恶意服务器将文件写入目标目录的父目录
- internal-sftp 参数截断:第 10 个及之后的参数被静默丢弃,可能导致安全选项失效
- GSSAPI 预认证 DoS:启用 GSSAPIAuthentication 时存在潜在的 DoS 漏洞(默认关闭)
- 认证延迟绕过:多处在认证流程中没有正确执行最小认证延迟
- 客户端 use-after-free:服务端在密钥重新交换时更换主机键,可能触发客户端释放后使用
每个漏洞都已在发布前收到了负责任的报告和修复。
其他值得注意的变化
- FIDO 密钥下载 :
ssh-keygen和ssh-add在从 FIDO 令牌下载驻留密钥时,遇到不支持的密钥类型会跳过而不是终止整个流程 - X11 通道安全:修复了在发送 x11-req 消息之前创建 X11 通道可能导致的 strlen(NULL) 崩溃
- sshd_config 重构:配置解析和管理代码做了重大重构,为后续更严格的权限分离边界序列化做准备
- 密码学代码加固:ed25519 验证增加了签名可塑性和公钥有效性检查,ECDSA 曲线 cofactor 检查更正
总结与展望
OpenSSH 10.4 是一个在安全前瞻性和工程严谨性上都迈出重要步伐的版本。实验性的后量子签名支持让 SSH 成为了首批拥抱 NIST 后量子标准的通用基础设施协议之一;SECCOMP 沙箱的强制化意味着默认安全立场进一步收紧;而传输协议和通配符匹配器的加固则体现了 OpenSSH 团队一贯的"对细节零容忍"的工程文化。
对于运维人员和系统管理员来说,10.4 升级后需要留意两点:一是 SECCOMP 沙箱可能在未配置的内核或容器环境导致 sshd 启动失败,需要在编译时确认沙箱配置;二是 post-authentication 期间的消息验证变化可能影响某些非标准 SSH 实现的互操作性。
后量子密码的标准化和部署才刚刚开始。OpenSSH 10.4 的复合签名方案只是第一步------未来我们可以期待更多后量子算法被纳入主流基础设施。在量子计算真正到来之前提前做好准备,才是负责任的安全实践。