OpenSSH 10.6 以安全之名故意破坏两项功能
OpenSSH 10.6 deliberately breaks two features in the name of security
OpenSSH 10.6 发布,出于安全考虑禁用了 SSH 压缩中的 LZ77 字典编码器,并拒绝命令行用户名中的 $ 和 \ 字符。前者源于研究人员发现多路复用通道共享压缩状态可泄露明文,后者防止用户名被 shell 通过 ProxyCommand 等指令解释执行。该版本还开始逐步淘汰 scp -R 远程到远程复制,并移除了混合后量子签名算法的实验性后缀。
周二发布的 OpenSSH 10.6 降低了压缩的有效性,并拒绝了一些之前可用的用户名,维护者知道这两项变更在发布时都会造成破坏。
其中一项变更禁用了用于 SSH 压缩的 LZ77 字典编码器,此前研究人员发现,在多个通道之间共享压缩状态可能会泄露明文。另一项变更则在命令行用户名中屏蔽了 $ 和 \,以防止它们通过 ProxyCommand 和 Match exec 等指令被 shell 解释。
此次发布之际,OpenSSH 正看到越来越多使用 AI 模型进行的安全研究,同时这些模型在发现可利用漏洞方面变得越来越强。其他研究人员后来独立发现了其中一些漏洞。OpenSSH 警告称,不报告所发现漏洞的对手“很可能也能发现这些漏洞”,目前该项目计划更频繁地发布修复,而不是等待其通常的发布周期。
OpenSSH 警告称,不报告所发现漏洞的对手“很可能也能发现这些漏洞”,目前该项目计划更频繁地发布修复,而不是等待其通常的发布周期。
压缩上下文泄露明文
SSH 可以在一条加密连接上承载多种内容,包括交互式 shell、端口转发或动态 SOCKS 代理。当启用压缩时,这些通道共享相同的压缩状态,不过 OpenSSH 默认关闭压缩,因此该攻击仅在有人开启压缩时才有效。
波鸿鲁尔大学的安全研究人员 Fabian Bäumer 和 Marcus Brinkmann 在他们的论文 “Crossing the Streams: SSH Plaintext Recovery via a Common Compression Context in Multiplexed Channels” 中演示了这个问题。攻击者若能向一个通道注入选定的明文并观察由此产生的加密流量,就可以利用压缩来恢复同一会话中另一通道传输的机密信息。
攻击者若能向一个通道注入选定的明文并观察由此产生的加密流量,就可以利用压缩来恢复同一会话中另一通道传输的机密信息。
该泄露源于 LZ77 的记忆机制。它不会再次编码相同的字节序列,而是可以指回已经见过的匹配序列。OpenSSH 在各通道之间共享该历史记录,因此攻击者控制的数据可以改变会话中其他地方机密信息的压缩方式。当猜测与机密信息的某部分匹配时,产生的流量可能会略微变短,从而给攻击者提供又一条信息。
这使该攻击与针对基于 TLS 的 HTTP 的 CRIME 和 BREACH 属于同一类,不过在这里实施攻击需要相当特定的配置。攻击者控制的流量和机密信息必须共享同一个多路复用 SSH 会话。在他们噪声最低的测试中,Bäumer 和 Brinkmann 在 100 次试验中以中位数 276 次猜测从 26 个字符的字母表中恢复了一个 8 字符的机密信息。在他们噪声更大的基于浏览器的场景中,这一数字跃升至约 27,600 次。
这两名研究人员使用 Claude Code 为所有三种攻击场景构建了概念验证实现,而且他们并不是唯一使用 AI 工具攻击 OpenSSH 的人,因为 10.6 版本还致谢了 Chris Rohlf,他与 Claude 和 Anthropic Research 合作,发现了该版本中修复的另外两个漏洞。
Huffman 保留,LZ77 移除
OpenSSH 采用了直接的修复方式,完全移除了共享字典。Deflate 使用 LZ77 查找先前出现过的重复数据块,然后使用 Huffman 编码用更少的比特表示频繁出现的值。OpenSSH 10.6 在 ssh 和 sshd 中都禁用了 LZ77 部分,同时保留 Huffman 编码。
压缩仍然有效,只是效果不如从前。OpenSSH 警告称 Compression 选项的效果会降低,并建议改在应用层处理压缩,称这样通常性能更好,且不会受到此攻击的影响。
大多数交互式 SSH 会话可能不会注意到差异,但在受限连接上传输大量可压缩数据的自动化任务可能会。这些工作负载在升级后可能需要将压缩从 SSH 移到应用中。
大多数交互式 SSH 会话可能不会注意到差异,但在受限连接上传输大量可压缩数据的自动化任务可能会。
用户名更改针对的是由外部输入构建的命令。内部工具、CI 任务或代理可能会运行类似 ssh "$INPUT_USER@host" 的命令,而该用户名随后可能出现在 ProxyCommand、Match exec 或传递给 shell 的其他命令中,此时 $ 和 \ 等字符可能突然变成 shell 语法,而不再只是用户名的一部分。
这并非该项目第一次收紧这条路径。10.3 版本修复了一个相关漏洞,即命令行用户名的 shell 元字符检查执行得太晚,此时它们已经可以通过 ssh_config 被展开。
在 10.6 中,命令行传递的用户名中会拒绝 $ 和 \,但当用户名通过 SSH 配置文件中的 User 指令设置时,该限制不适用。包含这两个字符的合法账户仍可通过这种方式使用,不过直接传递这些用户名的脚本和代理工具将不得不做出改变。
后量子密钥,弃用 scp
OpenSSH 10.6 中还有其他一些变化可能会影响自动化工作流。混合后量子 ssh-mldsa44-ed25519 签名算法失去了实验性的 @openssh.com 后缀,这意味着使用早期实现创建的密钥需要重新生成或删除。该版本还开始逐步淘汰用于远程到远程复制的 scp -R;它在 10.6 中仍然有效,但现在会产生警告,并最终将被忽略。
热门故事
来源:Hacker News · thenewstack.io