libssh 全局已知主机覆盖漏洞 (CVE-2025-15079) 详解

本报告详细介绍了 curl 项目中与 libssh 库集成的安全问题 CVE-2025-15079。当用户指定自定义 known_hosts 文件时,由于未正确设置全局 known_hosts 选项,libcurl 可能意外接受系统默认文件中的主机身份验证,从而绕过用户限制。

CVE-2025-15079: libssh 全局已知主机覆盖

报告 ID: #3477116

时间线

  • nyymi 向 curl 提交报告。
    • 2025年12月24日,UTC 4:45

摘要: libssh 具有 SSH_OPTIONS_GLOBAL_KNOWNHOSTS 选项,用于指定一个全局的 known_hosts 文件。当在 SSH_OPTIONS_KNOWNHOSTS 指定的文件中找不到主机时,将使用此全局文件。libcurl 的 CURLOPT_SSH_KNOWNHOSTS 选项没有为 SSH_OPTIONS_GLOBAL_KNOWNHOSTS 指定一个无效(或 /dev/null)路径,导致 libcurl 可能接受默认全局文件中指定的任何主机身份。当用户试图将已知主机限制在其自己指定的文件中时,这一点尤其重要,因为如果在用户指定的文件中没有找到匹配项,系统将检查全局文件。

默认情况下,这个全局文件是 /etc/ssh/ssh_known_hosts,普通用户无法修改(至少在主要平台上)。因此,在大多数情况下,攻击者无法通过主动修改此文件来利用此问题。这限制了这个缺陷的影响。

受影响版本: 8.17.0

复现步骤:

  1. 配置并编译 curl,启用 --with-libssh
  2. host.example 的有效主机条目添加到 /etc/ssh/ssh_known_hosts
  3. echo "" > knownhosts
  4. curl --knownhosts knownhosts user@host.example

主机身份验证应失败,但实际上却成功了。

修复建议: 使 CURLOPT_SSH_KNOWNHOSTSSSH_OPTIONS_GLOBAL_KNOWNHOSTS 设置为 /dev/null(或某个不存在的路径)。

支持材料/参考链接:

影响: 主机验证意外成功。

后续讨论与处理:

  • bagder (curl 员工) 回复感谢报告并确认调查。
  • jimfuller2024 (curl 员工) 确认这是给 libssh 的“一份大圣诞礼物”。
  • bagder 将状态改为“已分类”,认为该缺陷允许系统级 known hosts 文件覆盖用户设置,但严重性不应太高。
  • bagder 提交了首个补丁提案:0001-libssh-set-both-knownhosts-options-to-the-same-file.patch
  • nyymi 确认补丁有效,并同意问题严重性为“低”。
  • jimfuller2024bagder 确认“低”严重性合适。
  • bagder 更新了严重性等级,并提供了补丁的拉取请求链接和咨询草案。
  • 报告标题更新为“CVE-2025-15079: libssh global knownhost override”。
  • nyymi 对咨询草案提出了细微的格式修正。
  • nyymi 提到了 libssh 与 libssh2 在默认 known_hosts 行为上的不一致性(非直接相关)。
  • bagder 通知了 distros@openwall 邮件列表。
  • bagder 将报告状态改为“已解决”并关闭。
  • curl 表示该报告不符合项目赏金资格,但建议向 Internet Bug Bounty 提交奖励请求。
  • bagder 请求根据项目透明政策公开报告。
  • nyymi 同意公开报告。

报告详情:

  • 报告于: 2025年12月24日,UTC 4:45
  • 报告人: nyymi
  • 报告对象: curl
  • 状态: 已解决
  • 严重性: 低 (0.1 ~ 3.9)
  • 公开日期: 2026年1月7日,UTC 8:04
  • 弱点类型: 对主机不匹配证书的验证不当
  • CVE ID: CVE-2025-15079
  • 赏金: 无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计