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-required和verify-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):修复ChannelTimeout与RekeyLimit未在sshd_config的Match块中生效的问题。sshd(8):config dump 模式统一使用混合大小写。
可移植性
sshd(8) 重新允许 Match 块内的 PAMServiceName。该选项在 10.4 重构时被误禁(bz3987)。
升级与自查清单
- 升级到 10.5。
- 检查
sshd_config是否存在依赖restrict+ 隧道转发的组合。 - 检查是否有配置依赖
ChannelTimeout/RekeyLimit在Match块中生效——此前不生效,升级后行为会变。 - agent 转发场景确认 session-bind 行为。
- 使用自定义 crypto 构建的,确认 ECC 与 NISTP521 可用。