OpenSSH更新记录集(202x)
2014-09-16 15:25:50 阿炯

本文系《OpenSSH》所分离出来的,专门用于记录其相关的版本发布更新,截止到2030年之前。OpenSSH 是 100% 完整的 SSH 协议 2.0 实现,且包括 sftp 客户端和服务器支持。


最新版本:6.7
6.7是一个大更新版本,加入了许多新特性,其中一个重要特性是Unix domain socket转发。该功能允许本地机器上的 一个Unix domain socket转发到一个远程TCP端口,或者一个远程TCP端口转发到一个Unix domain socket——使用Socket转发的相同语法。举例来说,一个远程PostgreSQL数据库实例可通过SSH转发到本地机器上的一个Unix domain socket。

最新版本:7.2
主要是 bug 修复,修改了自 OpenSSH 7.1p2 以来由用户报告和开发团队发现的问题,但是我们可以看到几个新功能。这其中可以提到使用了 SHA-256 或者 SHA-256 512 哈希算法的 RSA 签名;增加了一个 AddKeysToAgent 客户端选项,以添加用于身份验证的 ssh-agent 的私钥;和实现了一个“restrict”级别的 authorized_keys 选项,用于存储密钥限制。增加了AES-GCM认证加密支持,encrypt-then-mac (EtM) MAC模式支持,总算支持了多种加密方式支持(如Key+口令),支持了Key Revocation Lists(KRLs)等及Bug改进。

根据内部发布公告OpenSSH 7.2 主要是 bug 修复,修改了自 OpenSSH 7.1p2 以来由用户报告和开发团队发现的问题,但是我们可以看到几个新功能。这其中可以提到使用了 SHA-256 或者 SHA-256 512 哈希算法的 RSA 签名;增加了一个 AddKeysToAgent 客户端选项,以添加用于身份验证的 ssh-agent 的私钥;和实现了一个“restrict”级别的 authorized_keys 选项,用于存储密钥限制。此外在 ssh_config 中 CertificateFile 选项可以明确列出证书,ssh-keygen 现在能够改变所有支持的格式的密钥注释、密钥指纹现在可以来自标准输入,多个公钥可以放到一个文件。

ssh-keygen 现在支持多证书
除了上面提到的,OpenSSH 7.2 增加了 ssh-keygen 多证书的支持,一个一行,实现了 sshd_config ChrootDirectory 及Foreground 的“none”参数,“-c”标志允许 ssh-keyscan 获取证书而不是文本密钥。最后但并非最不重要的,OpenSSH 7.3 不再默认启用 rijndael-cbc(即 AES),blowfish-cbc、cast128-cbc 等古老的算法,同样的还有基于 MD5 和截断的 HMAC 算法。在 Linux 中支持 getrandom() 系统调用。下载 OpenSSH 7.2 并查看更新日志中的更多细节。

最新版本:7.6
OpenSSH 7.6 已发布,该版本的OpenSSH 是一个 100%完整的 SSH 2.0 协议实现,包括 sftp 客户端和服务器支持。此版本包含一些可能影响现有配置的更改:
ssh(1): delete SSH protocol version 1 support, associated configuration options and documentation.
ssh(1)/sshd(8): remove support for the hmac-ripemd160 MAC.
ssh(1)/sshd(8): remove support for the arcfour, blowfish and CAST ciphers.
Refuse RSA keys <1024 bits in length and improve reporting for keys that do not meet this requirement.
ssh(1): do not offer CBC ciphers by default.
其他安全修复和改进请查阅发行主页

最新版本:8.0
OpenSSH 8.0 发布了,此版本缓解了 scp(1) 工具和协议漏洞。该漏洞大致如下:将文件从远程系统复制到本地目录时,SCP 客户端无法验证 SCP 服务器返回的对象是否与请求的东西一致,这使得攻击者可以使用恶意服务器控制的内容创建或破坏本地文件。8.0 的缓解措施添加了客户端检查,查看从服务器发送的文件名与命令行请求是否匹配。SCP 协议被认为已经过时,不灵活且不易修复,OpenSSH 官方建议使用更现代的协议进行文件传输,如 sftp 和 rsync。该版本新特性包括:
ssh(1)、ssh-agent(1)、ssh-add(1):PKCS#11 token 中添加对 ECDSA 密钥的支持。
ssh(1)、sshd(8):基于 Streamlined NTRU Prime 4591^761 和 X25519 的组合,添加实验性量子计算抗性密钥交换方法。
ssh-keygen(1):将默认 RSA 密钥大小增加到 3072 位。
ssh(1):允许"PKCS11Provider = none"覆盖 ssh_config 中 PKCS11Provider 指令的后续实例。
ssh(1):提示是否录制新主机密钥时,输入密钥指纹作为"yes"。
ssh-keygen(1):在单个命令行调用上签名多个证书时,允许自动递增证书序列号。
scp(1)、sftp(1):接受 -J 选项作为 scp 和 sftp 命令行上 ProxyJump 的别名。
ssh-agent(1)、ssh-pkcs11-helper(8)、ssh-add(1):接受"-v"命令行标志以增加输出的详细程度;将详细标志传递给子进程,例如从 ssh-agent 启动的 ssh-pkcs11-helper。
ssh-add(1):添加"-T"选项以允许通过执行签名和验证来测试代理中的密钥是否可用。
sshd(8):在 PAM 环境中暴露 $SSH_CONNECTION。
完整更新内容查看更新日志

最新版本:8.3
此版本主要聚焦在 bug 修复,一些安全修复程序,包括对静态密钥进行加密以保护其免受推测性执行攻击;对于公钥,还有一个实验性的新签名和验证机制。此版本增加了对 FIDO/U2F 硬件身份验证器的支持。FIDO/U2F 是廉价硬件双因认证的开放标准,广泛应用于网站的身份验证。此版本通过新的公共密钥类型"ecdsa-sk"和"ed25519-sk",以及相应的证书类型支持 FIDO 设备。ssh-keygen(1) 可用于生成 FIDO 令牌支持的密钥,之后它们的使用方式与 OpenSSH 支持的任何其它密钥类型非常相似,只要在使用密钥时附加硬件令牌。包括修复了:
ssh(1): 修复 IdentitiesOnly=yes 以适用于从 PKCS11Provider 加载的密钥
ssh-keygen(1): 尝试转换无效的 RFC4716 私钥时,避免 NULL 取消引用
scp(1): 当使用'scp -3'执行远程复制时,启动第二个 ssh(1) 通道并启用 BatchMode = yes 以避免提示的混乱和不确定性排序
* ssh(1), ssh-keygen(1): 使用 FIDO 令牌签署挑战时,在中间件层而不是 OpenSSH 代码中对要签名的消息进行哈希处理。这允许使用隐式执行哈希的安全密钥中间件,例如 Windows Hello
ssh(1): 修复了“已知主机文件过多”的错误信息
sshd(8): 当目标用户为 root 时,不将 /etc/hosts.equiv 和 /etc/shosts.equiv 文档视为 HostbasedAuthentication
ssh(1), ssh-keygen(1): 修复了私有证书密钥解析中的 NULL 取消引用(oss-fuzz #20074)
ssh(1), sshd(8): 各种配置选项均接受 %TOKENS 组之间的更高一致性
various: 修复注释和调试/错误消息中的许多拼写错误
sshd(8), ssh-keygen(1): 无需触摸的 FIDO 证书选项应该是扩展而不是关键选项
ssh(1): 检测并防止使用 ProxyJump 时琐碎的配置循环
更多更新详情见此处

最新版本:8.4
2020年9月30日,OpenSSH 8.4 已发布,OpenSSH 是 100% 完整的 SSH 协议 2.0 版本的实现,并且包括 sftp 客户端和服务器支持,它用于远程登录的主要连接工具。OpenSSH 对所有流量进行加密,避免窃听、连接劫持等攻击。此外,OpenSSH 还提供了一整套安全隧道功能、多种身份验证方法和复杂的配置选项。自 OpenSSH 8.3 以来的变更:
支持每次使用都需要输入 PIN 码的 FIDO 密钥,这些密钥通过应用了新的"verify-required"选项的 ssh-keygen 来生成,当使用需要 PIN 码的密钥时,会提示用户输入 PIN 码来完成签名操作
authorized_keys 现在支持新的"verify-required"选项,要求 FIDO 签名断言令牌被验证,FIDO 协议支持多种用户验证方法,但目前 OpenSSH 只支持 PIN 验证
添加对验证 FIDO Webauthn 签名的支持,Webauthn 是在 Web 浏览器中使用 FIDO 密钥的标准
-A 标志可显式启用 scp 和 sftp 中的代理转发

更好地支持多个附加的 FIDO 令牌
支持长度大于 256k 的 sshd_config 文件
针对 Xcode 12 的配置修复

此外,由于 SHA-1 哈希算法被发现构造前缀碰撞攻击成本已降至低于 5 万美元(实际为 4.5 万美元),因此开发团队决定禁用 ssh-rsa 公钥签名算法。虽然存在更好的替代方案,但 SHA-1 算法至今仍然被广泛使用。部分替代方案包括 RFC8332 RSA SHA-2 签名算法 rsa-sha2-256/512、ssh-ed25519 签名算法与 RFC5656 ECDSA 算法。目前这些算法在 OpenSSH 中都已经支持。更多详情请查看发行说明

最新版本:8.5
OpenSSH 8.5 已经于2021年3月5日发布, 主要更新内容如下:
ssh-agent(1): 修正了一个重复释放内存的问题,该问题在 OpenSSH 8.2 中引入
可移植的 sshd(8):防止过长的用户名进入 PAM。 这是为了缓解 Solaris 的 PAM 用户名处理中的缓冲区溢出问题(CVE-2020-14871),并且只对 Sun 派生的 PAM 实现启用。 这不是 sshd 本身的问题,它只是防止 sshd 被用作攻击 Solaris 的 PAM 的载体。它并不能阻止 PAM 中的错误被其他 PAM 应用程序所利用

兼容性相关
ssh(1)、sshd(8):这个版本将第一优先签名算法从 ECDSA 改为 ED25519
ssh(1)、sshd(8):在 TCP 连接之前,设置配置中指定的 TOSDSCP ,供交互使用。SSH 会话的连接阶段对时间敏感,通常是显式交互的。最终的交互式bulk TOSDSCP 将在认证完成后设置
ssh(1)、sshd(8):更新/替换基于流线型 NTRU Prime 和 X25519 的实验性后量子混合密钥交换方法
ssh(1):默认禁用 CheckHostIP。它提供了微不足道的好处,同时也使密钥轮换变得更加困难,尤其是对于基于 IP 的负载均衡器后面的主机
ssh(1):在某些保守的前提下,此版本默认情况下启用UpdateHostkeys
ssh(1)、sshd(8):增加了一个新的 LogVerbose 配置指令, 允许通过 filefunctionline 模式列表强制进行最大限度的调试记录
ssh(1):当提示用户接受新的主机密钥时,显示已经与密钥关联的其他主机名称地址
ssh(1):允许 UserKnownHostsFile=none 表示不应该使用 known_hosts 文件来识别主机密钥
ssh(1):增加一个 ssh_config KnownHostsCommand 选项,除了通常的文件外,允许客户端从命令中获取 known_hosts 数据
ssh(1):增加一个 ssh_config PermitRemoteOpen 选项,当 RemoteForward 与 SOCKS 一起使用时,允许客户端限制目的地
更多详细内容请查看发行公告

最新版本:8.6
OpenSSH 8.6 已于2021年4月未旬发布,自 OpenSSH 8.5 以来的变更主要集中在 Bugfix,此外还引入了部分新功能:
ssh_config(5), sshd_config(5):在手册页中使用当前默认值同步 CASignatureAlgorithms 列表
ssh(1):确保退出前调用 pkcs11_del_provider()
ssh(1), sshd(8):修复 string->argv 的转换问题,多个反斜杠没有被正确引用,并且字符串中的引号空间被错误地分割
ssh(1):当被信号杀死时返回非零退出状态
sftp-server(8):增加 SSH2_FXP_READ 最大值以匹配最大数据包的大小,同时处理规范中没有明确禁止的零长度的读取

新特性
sftp-server(8):增加了一个新的 limits@openssh.com 协议扩展,允许客户端发现多项服务器限制,包括最大数据包大小和最大读/写长度
sftp(1):使用新的 limits@openssh.com 扩展 (当可用时) 以在客户端中选择更好的传输长度
sshd(8):在 sshd_config 中增加 ModuliFile 关键字,以指定包含 DH-GEX 组的"moduli"文件的位置
unit tests:增加了 TEST_SSH_ELAPSED_TIMES 环境变量,以便能够打印出每个测试的耗时(以秒为单位)

此外,由于 SHA-1 哈希算法被发现构造前缀碰撞攻击成本已降至低于 5 万美元(实际为 4.5 万美元),因此开发团队决定禁用 ssh-rsa 公钥签名算法,但这并不意味着要停止使用 RSA 公钥,在 SSH 协议中,它仍然能配合不同算法用于签名。例如  ssh-rsa 可以用 rsa-sha2-256(RSA/SHA256)、rsa-sha2-512(RSA/SHA512) 和 ssh-rsa(RSA/SHA1) 进行签名,只有最后一个将被默认禁用。更多详情查看发行说明

最新版本:8.7
OpenSSH 8.7 已于2021年8月22日发布,主要新特性包括:
实验性支持使用 SFTP 作为文件传输协议,替代不再安全的 scp 协议
改变远程到远程的复制行为,默认通过本地主机传输
使用更严格的配置文件解析器
准备在下一个版本中默认停用 ssh-rsa 签名方案。鼓励用户现在迁移到更好、更安全的替代方案
错误修复和其他小的改进

之所以默认停用 ssh-rsa 签名方案, 这是由于 SHA-1 哈希算法被发现构造前缀碰撞攻击成本已降至低于 5 万美元(实际为 4.5 万美元),因此开发团队决定停用 ssh-rsa 公钥签名算法,但这并不意味着要停止使用 RSA 公钥,在 SSH 协议中,它仍然能配合不同算法用于签名。例如  ssh-rsa 可以用 rsa-sha2-256(RSA/SHA256)、rsa-sha2-512(RSA/SHA512) 和 ssh-rsa(RSA/SHA1) 进行签名,只有最后一个将被默认禁用。更多详情查看发行说明

最新版本:8.8
OpenSSH 8.8 于2021年9月末旬正式发布,此版本默认情况下会禁用使用SHA-1哈希算法RSA签名,会导致部分老的ssh客户端无法连接。更新内容包括:
ssh(1):允许 ssh_config(5) CanonicalizePermittedCNAMEs 指令接受 "none" 参数,以指定默认的行为。
scp(1):当使用 SFTP 协议时,在发生传输错误后继续传输文件时,更好地匹配原始 scp/rcp 行为
ssh(1):修正了多路复用中的一些内存泄漏问题
ssh-keygen(1): 避免在使用 -Y find-principals 命令时崩溃
一系列文档和手册的改进,HostkeyAlgorithms上禁用了ssh-dss,ssh-rsa两种算法
ssh-agent(1): 在 FreeBSD 上,使用 procctl 禁用 ptrace(2)

最新版本:8.9
OpenSSH 8.9于2022年2月下旬正式发布,更新内容包括:
新功能
ssh(1), sshd(8), ssh-add(1), ssh-agent(1): 增加了一个用于限制转发和使用添加到 ssh-agent(1) 的密钥的系统
ssh-keygen(1): 当从 FIDO token 下载常驻密钥时,传回创建密钥时使用的用户 ID,并将其附加到密钥被写入的文件名中
ssh-keygen(1), ssh(1), ssh-agent(1): 更好地处理 FIDO 密钥,以在设备本身上提供用户验证(UV)
ssh-keygen(1): 增加了 "ssh-keygen -Y match-principals" 的操作
ssh-add(1), ssh-agent(1): 允许将 pin-required FIDO 密钥添加到 ssh-agent(1)
ssh-keygen(1): 允许在 sshsig 签名时选择哈希值
ssh(1), sshd(8): 直接读取网络数据到数据包输入的缓冲区,而不是通过一个小的堆栈缓冲区间接地读取网络数据
ssh(1), sshd(8): 直接读取数据到通道输入缓冲区
ssh(1): 扩展了 PubkeyAuthentication 的配置指令,以便接受 yes|no|unbound|host-bound

错误修复
sshd(8): 记录了 CASignatureAlgorithms、ExposeAuthInfo 和 PubkeyAuthOptions 可以在一个 Match 块中使用
sshd(8): 修复构建路径到具有很长用户主目录名称的 .rhosts/.shosts 文件时,可能产生的字符串截断
ssh(1): 当 SessionType=none 时,不要把 TTY 放到 raw 模式
scp(1): 修正了 SFTP 模式下处理 ~-前缀路径时的一些错误
ssh(1): 允许 ssh(1) 当只有 RSA/SHA2 签名算法时选择 RSA 密钥
ssh-keysign(1): 使 ssh-keysign 使用请求的签名算法,而不是默认的签名算法
ssh(1): 在客户端有更严格的 UpdateHostkey 签名验证逻辑
ssh-keygen(1): 使得 sshsig 验证时间参数的解析成为可选项
sshd(8): 修正 rhosts/shosts 路径结构中的截断
ssh(1), sshd(8): 更正 IPTOS_DSCP_LE 的值
更多详情可查看此处

最新版本:9.0
OpenSSH 9.0作为广泛使用的、开源的SSH实现的最新版本已经于2022年4月上旬上线。它带来了新的功能和变化,如scp默认使用SFTP协议,这是一个重要的版本,它带来了一些明显的变化。

* ssh(1), sshd(8): use the hybrid Streamlined NTRU Prime + x25519 key exchange method by default ("sntrup761x25519-sha512@openssh.com").The NTRU algorithm is believed to resist attacks enabled by future quantum computers and is paired with the X25519 ECDH key exchange(the previous default) as a backstop against any weaknesses in NTRU Prime that may be discovered in the future. The combination ensures that the hybrid exchange offers at least as good security as the status quo.We are making this change now(i.e. ahead of cryptographically-relevant quantum computers) to prevent "capture now, decrypt later" attacks where an adversary who can record and store SSH session ciphertext would be able to decrypt it once a sufficiently advanced quantum computer is available.

* sftp-server(8): support the "copy-data" extension to allow serverside copying of files/data, following the design in draft-ietf-secsh-filexfer-extensions-00. bz2948

* sftp(1): add a "cp" command to allow the sftp client to perform server-side file copies.

首先将scp从使用传统的SCP/RCP协议改为现在默认使用SFTP协议。这是OpenSSH一直在努力实现的一个变化,在之前的版本中为scp工具在内部使用SFTP奠定了基础。另一个值得注意的变化是SSH/SSHD默认使用混合的Streamlined NTRU Prime + x25519密钥交换方法,以抵御未来量子计算机的攻击。OpenSSH开发者现在做这个改变是为了提高安全性,以抵御"现在捕获,以后解密"的攻击,一旦有量子计算机有能力解密捕获的SSH密码文本。另外一个相当有用的变化是,sftp-server实现增加了对copy-data扩展的支持,以支持服务器端的文件/数据拷贝。sftp工具还增加了一个"cp"命令,允许SFTP客户端对服务器端的文件进行复制。

还有一些可移植性的改进、各种bug的修复和其它改善。具体如下:
不兼容的变化
这个版本将 scp 从使用传统的 scp/rcp 协议改为默认使用 SFTP 协议;传统的 scp/rcp 会通过远程 shell 对远程文件名进行通配符扩展(例如 "scp host:* ...")。这会产生一个副作用,就是需要在文件名中对 shell 元字符进行双引号处理,否则它们可能被解释为远程的 shell 命令。而这就产生了一个潜在的不兼容的地方:scp(1) 在使用 SFTP 协议时,不再需要这种引号。而试图使用它可能会导致传输失败。
在不兼容的情况下,scp(1)客户端可以被使用 -O 标志来使用的传统 scp/rcp。

新功能
ssh, sshd: 默认使用混合的 Streamlined NTRU Prime + x25519 密钥交换方法
sftp-server: 支持 "copy-data" 扩展以允许服务器端复制文件/数据
sftp: 增加了一个 "cp" 命令, 允许 sftp 客户端执行服务器端的文件拷贝

错误修正
sshd: 在服务器监听/接受循环中打包 pollfd 数组,可能导致服务器在 MaxStartups > RLIMIT_NOFILE 时挂起/自旋
scp: 修复了参数 processing.bz3404 中的内存泄漏
sshd: 不要尝试在 sshd re-exec 路径中解析 ListenAddress 指令
sshd: 客户端使用未经批准或不支持的签名算法而拒绝公钥认证请求时,在日志信息中包括算法的名称,以使调试更加容易

其他
sshd: 重构了特定平台的锁定账户检查
ssh, sshd: 修正可能出现的整数下溢
sshd: 提供 killpg 的实现
检查丢失的 ftruncate 原型
sshd: 在交叉编译时默认不使用沙盒
sshd: 在 seccomp 沙箱中允许 ppoll_time64,应该可以修复沙盒在某些 32 位 Linux 平台上的违规行为
改进对配置脚本中 -fzero-call-used-regs=all 支持的检测
更多详情可查看发行说明

最新版本:9.2
OpenSSH 9.2 现已于2023年2月上旬发布,此版本包含两个安全问题和一个内存安全问题的修复程序:
sshd(8) : 修复 OpenSSH 9.1 中引入的预认证双释放内存错误。它发生在受 chroot (2) 影响的非特权预授权进程中, 并在大多数主要平台上进一步沙盒化,但不可利用。
ssh(8):在 8.7 之后的 OpenSSH 版本中,PermitRemoteOpen 选项将忽略它的第一个参数,除非它是特殊的参数关键字 “any” 或 “none” 之一,如果仅指定一个权限,则会导致权限列表无法打开。
bz3515 ssh(1):如果启用了 CanonicalizeHostname 和 CanonicalizePermittedCNAMEs 选项,且系统 /libc 解析器没有检查 DNS 响应中的名称是否有效,那么这些选项可能允许控制 DNS 的攻击者在更新时将无效字符(可能包括通配符)添加到 known_hosts 文件的名称中。

新功能
sshd(8):通过新的 sshd_config (5) ChannelTimeout 指令添加对通道不活动超时的支持。 在可配置的时间间隔内,通道如果没有检测到流量则会自动关闭。可以将不同的超时应用于 X11、代理和 TCP 转发通道等。
sshd(8) : 添加 sshd_config UnusedConnectionTimeout 选项,以终止在一段时间内没有开放通道的客户端连接。它补充了上面的 ChannelTimeout 选项。
sshd(8) : 像 ssh 客户端一样,向 sshd 添加一个 -V(版本)选项。
ssh(1):在 ssh -G 的输出中添加 “主机” 行,显示原始主机名参数。bz3343
scp(1) , sftp (1) :为 scp(1) 和 sftp(1) 添加一个 -X 选项,以允许控制一些 SFTP 协议参数:复制缓冲区长度和请求的数量,两者都在上传 / 下载期间使用。
ssh-keyscan (1):允许扫描完整的 CIDR 地址范围, 例如 “ssh-keyscan 192.168.0.0/24”。如果通过了 CIDR 范围,则将扩展到范围内所有可能的地址, 包括全 0 和全 1 地址。bz#976
ssh(1) : 在 escape 命令行的 -R 处理中支持动态远程端口转发。bz#3499
 
修复
ssh(1):当恢复非阻塞模式到 stdio fds 时, 准确恢复 ssh 开始的标志,不只是用零破坏它们,因为这也可能从集合中删除附加标志。bz3523
ssh(1):避免 printf ("% s", NULL) 如果使用 UserKnownHostsFile=none 和系统已知主机文件之一中的主机密钥更改。
scp(1):将 scp 从使用管道切换到套接字对,与其 ssh 子进程通信时匹配 sftp (1) 的操作方式。
sshd(8):在 main () 早期清除信号掩码;sshd 可能已经在一个或多个信号被屏蔽的情况下启动,会产生干扰, 例如登录宽限期计时器。
ssh(1) : 如果无法加载基于主机的身份验证的主机密钥,则发出警告。
sshd(8): 为 hostbased auth 添加服务器调试, 认证成功后排队并发送给客户端,同时也记录日志,以协助诊断 HostbasedAuthentication 问题。bz3507
ssh(1):将 IdentityFile 选项的使用记录为可用于列出公钥和私钥。GHPR352
sshd(8):在配置解析期间检查并禁止 MaxStartups 值小于或等于零,而不是在运行时失败。 bz3489
ssh-keygen(1) :修复在充当 CA 时,在命令行上指定的十六进制证书到期时间的解析。
ssh-agent(1):记录 “-O no-restrict-websafe” 命令行选项。
ssh(1):尊重用户的 umask (2),如果它比 ssh 默认值 (022) 更严格。

最新版本:9.3
OpenSSH 9.3 现已于2023年3月中旬发布,此版本修复了一些安全漏洞。

安全问题
ssh-add (1):当使用 OpenSSH 8.9 中添加的每跳(per-hop)目标约束(ssh-add -h ...)将智能卡密钥添加到 ssh agent(1) 时,逻辑错误会阻止约束传达到中介,导致在没有约束的情况下添加密钥。
ssh (1):便携式 OpenSSH 提供了 getrrsetbyname(3) 函数的实现(如果标准库未提供),供 VerifyHostKeyDNS 功能使用。
ssh-keygen (1), ssh-keyscan (1): 接受输出 SSHFP 指纹时,ohashalg=sha1|sha256 允许算法选择。
sshd (8):添加一个 sshd -G 选项来解析和打印有效配置,无需尝试加载私钥和执行其他检查。
scp (1), sftp (1):修复宽屏显示器上的进度表损坏问题;
ssh-add (1), ssh-keygen (1): 在测试可用性时使用 RSA/SHA256 私钥,因为一些系统开始禁用 RSA/SHA1
sftp-server (8): 修复内存泄漏。
ssh (1), sshd (8), ssh-keyscan (1): 去除残留协议,兼容性代码并简化剩下的内容。
修复一些低影响的 Coverity 静态分析结果。
回归测试的返工记录。 回归测试现在将为测试中的每个 ssh 和 sshd 调用捕获单独的日志。
ssh (1):使 ssh -Q CASignatureAlgorithms 用作联机帮助页
ssh (1):确保在添加 known_hosts 的新条目时有一个终止换行符
sshd (8):强化 Linux seccomp 沙箱。
sshd (8):为旧系统改进 Linux seccomp-bpf 沙箱

最新版本:9.4
OpenSSH 9.4 现已于2023年8月中旬发布,此版本修复了许多 bug 并添加了一些小功能。本版本删除了对旧版本 libcrypto 的支持。现在需要 LibreSSL >= 3.1.0 或 OpenSSL >= 1.1.1。注意这些版本已被其上游供应商弃用。

ssh-agent(1):PKCS#11 模块现在必须以完整路径指定。以前 dlopen(3) 可以在系统库目录中搜索它们。
ssh(1):允许通过 ssh -W 转发 Domain sockets。
ssh(1):向 ssh(1) 添加对 configuration tags 的支持。这添加了 ssh_config(5) “Tag” 指令和相应的 “Match tag” 谓词,可用于选择块配置类似于 pf.conf(5) 同名关键字的配置块。
ssh(1):添加 “match localnetwork” 谓词。这样就可以匹配可用网络接口的地址,并可根据网络位置改变有效的客户端配置。
ssh(1)、sshd(8)、ssh-keygen(1):KRL 扩展的基础设施支持。这定义了可选 KRL 扩展的 defines wire 格式,并实现新 submessages 的解析。目前还不支持实际的扩展。
sshd(8) : 现在 AuthorizedPrincipalsCommand 和 AuthorizedKeysCommand 接受两个额外的 % 扩展序列:% D 扩展为连接会话的路由域,% C 扩展为连接源和目的地的地址和端口号。
ssh-keygen(1) : 将用于为受密码保护的密钥文件生成对称加密密钥的 bcrypt KDF 的默认工作因子(轮数)提高 50%。
ssh-agent(1):通过为每个加载的提供程序运行单独的 ssh-pkcs11-helpers,改进加载的 PKCS#11 模块之间的隔离。
ssh(1):make -f(fork after authentication) 在包括 ControlPersist 在内的多路复用连接中正常工作。
ssh(1):使 ConnectTimeout 应用于多路复用套接字,而不仅仅是网络连接。仅适用于网络连接。
ssh-agent(1) , ssh(1):通过在加载请求的模块之前检查其是否包含所需的符号,改进了对加载无效 PKCS#11 模块的防御。
sshd(8):在 sshd_config 中,当 AuthorizedKeysCommand 出现在 AuthorizedPrincipalsCommand 之前时,修正 AuthorizedPrincipalsCommand。自 OpenSSH 8.7 以来,在这种情况下 AuthorizedPrincipalsCommand 指令被错误地忽略了。
ALL:修复一些内存泄漏和 unreachable/harmless 的整数溢出。
ssh-agent(1)、ssh(1):不要截断从 PKCS#11 模块记录的字符串
sshd(8)、ssh(1):更好地验证 ssh_config 和 sshd_config 中的 CASignatureAlgorithms。以前,该指令可接受证书算法名称,但由于 OpenSSH 不支持 CA 链,这些名称在实际中无法使用。
ssh(1) : 使 ssh -Q CASignatureAlgorithms 仅列对 CA 签名有效的签名算法。算法。以前的行为是列出所有签名算法,包括证书算法。
ssh-keyscan(1):优雅地处理 rlimits 或最大打开文件数大于 INT_MAX 的系统
ssh-keygen(1):修复在多个密钥上运行 ssh-keygen -l 时不显示 “no comment” 的问题,其中一个密钥有注释,而后面的其他密钥没有。
scp(1)、sftp(1):调整 ftruncate() 逻辑以处理重新排序请求的服务器。以前,如果服务器对请求重新排序,那么生成的文件就会被错误地截断。
ssh(1):当 CanonicalizeHostname=yes 和 ProxyJump 明确设置为 "none" 时,不要错误地禁用主机名规范化。
scp(1):复制 local->remote 时,在打开与服务器的 SFTP 连接之前检查源文件是否存在。
ALL:针对不同平台和配置组合的大量构建修复。
sshd(8):提供已弃用的 SELinux matchpathcon() 函数的替代程序。
ALL:放宽对 OpenSSL >=3 的 libcrypto 版本检查。在 OpenSSL 3.0 之后,ABI 兼容性的保证范围更广(只有库的 major 必须匹配,而不是早期版本中的 major 和 minor)。
修复某些测试中使用的 sk-dummy.so FIDO 提供程序模块的构建问题。

最新版本:9.6
OpenSSH 9.6版本现已于2023年12月下旬发布,包含了许多安全修复并添加了一些小功能,其中包括一个针对所谓 Terrapin 攻击的修复。这种攻击允许 MITM 在加密开始前发送额外信息,并在加密开始后立即删除相同数量的连续信息,从而有限度地破坏早期加密 SSH 传输协议的完整性。对等 SSH 客户端/服务器将无法检测到信息已被删除。公告称,虽然这一攻击手段在密码学上很新颖,但幸运的是,其对安全的影响非常有限。因为它只允许删除连续的信息,而在协议的这一阶段删除大多数信息会阻止用户验证继续进行,并导致连接卡死。

新功能
ssh(1):添加一个 %j token,扩展为已配置的 ProxyJump 主机名(如果未使用此选项,则为空字符串),可用于多个 ssh_config(5) 关键字。
ssh(1): 向客户端添加 ChannelTimeout 支持,在服务器中镜像相同的选项,并允许 ssh(1) 终止静态通道。
ssh(1)、sshd(8)、ssh-add(1)、ssh-keygen(1):添加对读取 PEM PKCS8 格式的 ED25519 私钥的支持。以前只支持 OpenSSH 私钥格式。
ssh(1)、sshd(8) : 引入协议扩展,以允许在服务器得知用于身份验证的用户名后,重新协商公钥身份验证的可接受签名算法。这允许在 "Match user" 块中更改 sshd_config(5) PubkeyAcceptedAlgorithms。
ssh-add(1)、ssh-agent(1) : 添加代理协议扩展,以允许在加载 PKCS#11 密钥时指定证书。这允许在所有支持 ssh-agent(1) 的 OpenSSH 工具中使用由 PKCS#11 私钥支持的证书。以前只有 ssh(1) 支持这一用例。

Bug修复
ssh(1): 决定是否启用 keystroke timing obfuscation 时,只有当带有 TTY 的通道处于活动状态时才启用。
ssh(1): 将主循环从 poll(3) 切换为 ppoll(3),并在检查信号处理器中设置的标志之前屏蔽信号。这样可以避免在发出 ssh 退出信号和轮询之间出现潜在的 race condition。
ssh(1): 当连接到同时使用 AddressFamily 和 CanonicalizeHostname 指令的目标时,AddressFamily 指令可能会被忽略。
sftp(1):当服务器返回意外信息时,正确处理了 limits@openssh.com 选项。
修复了 PuTTY 和 Dropbear 回归/集成测试中的一些问题。
ssh(1): 仅在认证结束时释放 GSS OID,避免了不必要的 init/cleanup cycles。
ssh_config(5): 在手册中提及 "none" 是 IdentityFile 的有效参数。BZ3080
scp(1):改进了在旧 SCP/RCP 协议模式下,因不匹配客户端 glob (3) 模式而被拒绝的服务器路径的调试。
ssh-agent(1): 如果之前的会话绑定操作失败,则拒绝对目标受限的密钥进行签名操作。如果用户使用了不匹配的 ssh(1) 客户端和 ssh-agent(1),而客户端支持的密钥类型是代理所不支持的,那么这可能会避免将来出现打开失败的情况。

最新版本:9.7
v9.7于2024-03-11发布。未来移除通知:

OpenSSH计划在中删除对DSA签名算法的支持2025年初,编译时将在2024年晚些时候禁用它。正如SSHv2协议中所规定的,DSA本质上是弱的——仅限于160位私钥和SHA1摘要的使用。它的估计的安全级别仅为80位对称等效。

自2015年以来,OpenSSH默认禁用DSA密钥,但保留了对它们的运行时可选支持。DSA是唯一强制性的在SSHv2 RFC中实现算法,主要是因为当SSHv2协议明确规定。这些年来,情况一直在变化,而且更好且维护更优的SSH都有很好地支持算法实现。我们不考虑继续维护DSA的是合理的,并希望从OpenSSH中删除它,可以加速其它在支持更强密码库的使用从而让用记免受广泛攻击。

此版本使OpenSSH编译时对DSA的支持是默认可选的,打算在下一个版本中更改默认值以在编译时禁用DSA。2025年的第一个OpenSSH版本将完全删除DSA支持。

自v9.6以来的变化
ssh(1),sshd(8):添加一个监视的“全局”ChannelTimeout类型所有开放通道,将在指定的时间间隔内关闭所有开放通道,如果它们中的任何一个上没有流量的话。这是在除了最近添加的现有每通道超时之外。支持同时拥有session和x11等情况打开转发通道,其中一个通道可能空闲一段时间期间,但另一个被积极使用。全局超时可能当两个通道空闲时间过长时关闭这两个通道;
*All:使DSA密钥支持编译时可选,默认为on;
*sshd(8):不要在子系统的末尾添加不必要的空格自变量;
*ssh(1):修复多路复用“通道代理”模式,当添加了击键定时模糊处理;
*ssh(1),sshd(8):修复当接受数组参数的选项将被覆盖;
*ssh代理(1):修复信号处理程序中的潜在自旋;
*对手册页和其他文档的许多修复;
*极大地改进了针对PuTTY的互操作测试;
*改进autoconf OpenSSL标头检查时的错误消息失败;
*改进对损坏工具链的检测-fzero调用使用regs支持;
*修复regression/misc/fuzzz使用模糊器,解决它们在使用clang16编译时时的警告。


更多详情可查看更新公告