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
复现步骤:
- 配置并编译 curl,启用
--with-libssh。 - 将
host.example的有效主机条目添加到/etc/ssh/ssh_known_hosts。 echo "" > knownhostscurl --knownhosts knownhosts user@host.example
主机身份验证应失败,但实际上却成功了。
修复建议:
使 CURLOPT_SSH_KNOWNHOSTS 将 SSH_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 确认补丁有效,并同意问题严重性为“低”。
- jimfuller2024 和 bagder 确认“低”严重性合适。
- 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
- 赏金: 无