综合 OpenSSH 10.5 升级笔记:agent 锁定绕过、客户端 UAF 与 restrict 隧道转发修复

2026-09-17 21:02:09

OpenSSH 10.5 升级笔记:agent 锁定绕过、客户端 UAF 与 restrict 隧道转发修复

OpenSSH 10.5 于 2026-08-11 发布,前一版本 10.4 发布于 2026-07-06。

  • 发布说明:https://www.openssh.org/txt/release-10.5
  • 项目主页:https://www.openssh.com/

潜在不兼容变更

Portable OpenSSH 现在要求 libcrypto 提供 ECC 支持,包含 NISTP521 曲线。LibreSSL、OpenSSL、BoringSSL、AWS-LC 的默认构建都带这项能力,--without-openssl 构建不受影响。使用了自定义裁剪 crypto 库的构建,升级前先确认 NISTP521 没有被编译掉,否则会在构建阶段直接失败。

安全修复

ssh-agent(1):agent 锁定后仍可执行本应受限的操作

修复的是 agent 锁定与 session-bind@openssh.com 扩展之间的交互问题。agent 被锁定时,绑定请求被拒绝,导致本应仅限本地使用的操作可以被远程执行,包括添加 PKCS#11 token、使用带目标限制的密钥。报告者 sn0x-sharma。

实际影响集中在 agent 转发场景:跳板机上持有转发过来的 agent 连接时,即使用户在本地对 agent 做了锁定(ssh-add -x),预期被挡住的操作仍可能被远程触发。

自查方式:确认哪些主机启用 ForwardAgent yes 或使用 ssh -A;对使用了 agent 锁定的会话,升级后验证锁定状态下 session-bind 行为是否符合预期,尤其是依赖 PKCS#11 token 或带目标限制密钥的流程。

ssh(1):本地多路复用下远程转发的 realloc use-after-free

客户端在通过本地多路复用 socket 添加远程转发、同时已有一个远程转发打开请求挂起时,可能触发 realloc use-after-free。报告与修复来自 Brian Mingus (Cognatory)。

触发条件需要两个条件同时成立:走 ControlMaster/ControlPath 复用连接,并且在同一连接上添加 -R 远程转发时已有另一个远程转发请求未完成。这类脚本在批量建立反向隧道时并不罕见。

自查方式:检查是否存在用 -O forward 或复用 socket 批量加远程转发的脚本;如果没有把握,可在测试环境用 ControlMaster no 复跑一遍对比,确认崩溃点是否来自这条路径。

sshd(8):authorized_keys 的 restrict 未覆盖隧道转发

修复后 restrict 关键字会正确作用于 tunnel forwarding(隧道转发,默认行政关闭)。报告者 Erichen,中科院计算所。

问题在于 restrict 本意是关掉一组能力,但隧道转发没有被关到位。在 authorized_keys 中写了 restrict 并以此作为限制手段的部署,等于对 -L/-R/-D 的约束没有生效。

自查方式:grep 所有 authorized_keys 中带 restrict 的条目,确认这些账号是否允许隧道转发;如不允许,升级后行为会收紧,需确认业务侧没有依赖此前“实际仍开放”的转发能力。

新特性

  • ssh-keygen(1):重置 FIDO 私钥口令时,可以设置或清除 touch-requiredverify-required 标志。
  • ssh(1):调整 pubkey 认证时证书的尝试顺序,优先不需要用户在场(touch)的 FIDO 密钥,把需要 PIN/生物识别的放最后。
  • ssh(1):新增 ssh -Z user@host 模式,按实际尝试顺序打印将会用于公钥认证的密钥。排查认证为什么走到某把密钥时很有用。
  • sshd(8):用 setproctitle(3) 标识 sshd-session(作为认证后监视进程时),ps 里能直接区分出会话进程。

Bug 修复

  • ssh-keyscan(1):读取服务器 banner 改为非阻塞,避免卡住的服务器阻塞多主机 keyscan。
  • sshd(8):数据包代码用 sshpkt_fatal() 替代 fatal(),报错时带上对端地址/端口/用户上下文。
  • sshd(8):为 UpdateHostKeys 签 hostkey 证明时,每个 hostkey 最多执行一次签名。
  • sshd(8):修复 servconf.c 重构导致的 GSSAPI 选项名损坏(bz3974)。
  • ssh-keygen(1):回传 ed25519 生成错误(GHPR702);修复 double free,改用 freezero
  • sshd(8):把公钥类型与允许算法的检查提前到解析对端公钥之前,减少预认证攻击面(Anthropic 的 Christopher Paul Rohlf 建议)。
  • sshd(8):修复 ChannelTimeoutRekeyLimit 未在 sshd_configMatch 块中生效的问题。
  • sshd(8):config dump 模式统一使用混合大小写。

可移植性

sshd(8) 重新允许 Match 块内的 PAMServiceName。该选项在 10.4 重构时被误禁(bz3987)。

升级与自查清单

  1. 升级到 10.5。
  2. 检查 sshd_config 是否存在依赖 restrict + 隧道转发的组合。
  3. 检查是否有配置依赖 ChannelTimeout / RekeyLimitMatch 块中生效——此前不生效,升级后行为会变。
  4. agent 转发场景确认 session-bind 行为。
  5. 使用自定义 crypto 构建的,确认 ECC 与 NISTP521 可用。
复制全文 生成海报 OpenSSH SSH 运维安全 Linux

推荐文章

程序员茄子在线接单