CVE-2025-10966:wolfSSH后端缺失SFTP主机密钥验证的安全漏洞分析

news/2025/11/11 12:12:31/文章来源:https://www.cnblogs.com/qife122/p/19209691

摘要

当curl使用wolfSSH后端构建时,lib/vssh/wolfssh.c中的SSH/SFTP实现未执行服务器主机密钥验证,且在curl工具中未暴露主机身份选项。通过在本地构建带有wolfSSH的curl(二进制报告wolfssh/1.4.20),观察到SSH主机验证选项在工具中不可用,并检查了wolfSSH代码路径,发现连接时没有任何主机密钥检查或known_hosts处理。

AI使用声明:本报告文本在协助下准备,但以下发现通过本地构建、运行时行为和代码检查手动验证。

受影响版本

本地构建在macOS(Apple Silicon):

$ ./src/curl --version
curl 8.17.0-DEV (aarch64-apple-darwin23.3.0) libcurl/8.17.0-DEV wolfSSL/5.8.2 zlib/1.2.12 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.8 libpsl/0.21.5 wolfssh/1.4.20 nghttp2/1.66.0 librtmp/2.3
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtmp rtsp sftp smb smbs smtp smtps telnet tftp ws wss

复现步骤

构建wolfSSH(带SFTP)并本地安装(macOS/Homebrew示例):

# 先决条件(Homebrew)
brew install wolfssl libpsl libidn2 libnghttp2# 构建并安装启用SFTP的wolfSSH
git clone --depth=1 https://github.com/wolfSSL/wolfssh.git
cd wolfssh
./autogen.sh
./configure \--prefix=$HOME/.local/wolfssh \--with-wolfssl=/opt/homebrew \--enable-sftp \--enable-sshclient \--enable-examples \CPPFLAGS='-I/opt/homebrew/include' \LDFLAGS='-L/opt/homebrew/lib'
make -j$(sysctl -n hw.ncpu)
make install

使用wolfSSH配置和构建curl:

cd /Users/$USER/scanner-repos/curl
autoreconf -fi
PKG_CONFIG_PATH="$HOME/.local/wolfssh/lib/pkgconfig:/opt/homebrew/lib/pkgconfig" \
CPPFLAGS="-I$HOME/.local/wolfssh/include -I/opt/homebrew/include" \
LDFLAGS="-L$HOME/.local/wolfssh/lib -L/opt/homebrew/lib" \
./configure \--without-libssh2 \--without-libssh \--with-wolfssh=$HOME/.local/wolfssh \--with-wolfssl=/opt/homebrew \--disable-shared
make -j$(sysctl -n hw.ncpu)

验证构建显示wolfSSH:

./src/curl --version
# 输出包含:wolfssh/1.4.20

观察到此构建中SSH主机身份选项不可用:

./src/curl --help ssh
# 未列出--ssh-knownhosts或--hostpubsha256./src/curl --ssh-knownhosts /tmp/kh -vvv sftp://localhost:22/
# 观察到的错误:
# curl: option --ssh-knownhosts: is unknown# 观察到的错误:
# curl: option --hostpubsha256: the installed libcurl version does not support this

这些运行时观察结果与wolfSSH后端的代码匹配,该代码未实现主机密钥验证或known_hosts集成。

lib/vssh/wolfssh.c和lib/vssh/ssh.h中的代码引用(具体行数)

连接设置:无主机密钥验证回调或known_hosts加载,然后立即进入状态机

static CURLcode wssh_connect(struct Curl_easy *data, bool *done)
{struct connectdata *conn = data->conn;struct ssh_conn *sshc = Curl_conn_meta_get(conn, CURL_META_SSH_CONN);struct SSHPROTO *sshp = Curl_meta_get(data, CURL_META_SSH_EASY);curl_socket_t sock = conn->sock[FIRSTSOCKET];int rc;if(!sshc || !sshp)return CURLE_FAILED_INIT;/* We default to persistent connections. We set this already in this connectfunction to make the reuse checks properly be able to check this bit. */connkeep(conn, "SSH default");if(conn->handler->protocol & CURLPROTO_SCP) {conn->recv[FIRSTSOCKET] = wscp_recv;conn->send[FIRSTSOCKET] = wscp_send;}else {conn->recv[FIRSTSOCKET] = wsftp_recv;conn->send[FIRSTSOCKET] = wsftp_send;}sshc->ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);if(!sshc->ctx) {failf(data, "No wolfSSH context");goto error;}sshc->ssh_session = wolfSSH_new(sshc->ctx);if(!sshc->ssh_session) {failf(data, "No wolfSSH session");goto error;}rc = wolfSSH_SetUsername(sshc->ssh_session, conn->user);if(rc != WS_SUCCESS) {failf(data, "wolfSSH failed to set username");goto error;}/* set callback for authentication */wolfSSH_SetUserAuth(sshc->ctx, userauth);wolfSSH_SetUserAuthCtx(sshc->ssh_session, data);rc = wolfSSH_set_fd(sshc->ssh_session, (int)sock);if(rc) {failf(data, "wolfSSH failed to set socket");goto error;}#if 0wolfSSH_Debugging_ON();
#endif*done = TRUE;if(conn->handler->protocol & CURLPROTO_SCP)wssh_state(data, sshc, SSH_INIT);elsewssh_state(data, sshc, SSH_SFTP_INIT);return wssh_multi_statemach(data, done);
error:wssh_sshc_cleanup(sshc);return CURLE_FAILED_INIT;
}

状态机:wolfSSH_connect()成功后,直接转换到SSH_STOP,没有任何SSH_HOSTKEY验证步骤

case SSH_S_STARTUP:rc = wolfSSH_connect(sshc->ssh_session);if(rc != WS_SUCCESS)rc = wolfSSH_get_error(sshc->ssh_session);if(rc == WS_WANT_READ) {*block = TRUE;conn->waitfor = KEEP_RECV;return CURLE_OK;}else if(rc == WS_WANT_WRITE) {*block = TRUE;conn->waitfor = KEEP_SEND;return CURLE_OK;}else if(rc != WS_SUCCESS) {wssh_state(data, sshc, SSH_STOP);return CURLE_SSH;}infof(data, "wolfssh connected");wssh_state(data, sshc, SSH_STOP);break;

SSH_HOSTKEY状态存在于通用SSH状态枚举中,但未被上述wolfSSH状态机使用

typedef enum {SSH_NO_STATE = -1,  /* Used for "nextState" so say there is none */SSH_STOP = 0,       /* do nothing state, stops the state machine */SSH_INIT,           /* First state in SSH-CONNECT */SSH_S_STARTUP,      /* Session startup */SSH_HOSTKEY,        /* verify hostkey */SSH_AUTHLIST,SSH_AUTH_PKEY_INIT,SSH_AUTH_PKEY,SSH_AUTH_PASS_INIT,SSH_AUTH_PASS,SSH_AUTH_AGENT_INIT, /* initialize then wait for connection to agent */SSH_AUTH_AGENT_LIST, /* ask for list then wait for entire list to come */SSH_AUTH_AGENT,      /* attempt one key at a time */SSH_AUTH_HOST_INIT,SSH_AUTH_HOST,SSH_AUTH_KEY_INIT,SSH_AUTH_KEY,SSH_AUTH_GSSAPI,SSH_AUTH_DONE,SSH_SFTP_INIT,SSH_SFTP_REALPATH,   /* Last state in SSH-CONNECT */

支持材料/参考

本地wolfSSH构建的工具帮助和错误输出:

$ ./src/curl --help ssh
ssh: SSH protocol--compressed-ssh          Enable SSH compression--hostpubmd5 <md5>        Acceptable MD5 hash of host public key--hostpubsha256 <sha256>  Acceptable SHA256 hash of host public key-k, --insecure                Allow insecure server connections--key <key>               Private key filename--pass <phrase>           Passphrase for the private key--pubkey <key>            SSH Public key filename
$ ./src/curl --ssh-knownhosts /tmp/kh -vvv sftp://localhost:22/
curl: option --ssh-knownhosts: is unknown

curl: option --hostpubsha256: the installed libcurl version does not support this

这些观察结果,加上上述wolfSSH连接和状态机代码,表明此后端未实现主机身份验证。

影响

摘要

如果curl/libcurl使用wolfSSH后端构建并用于SFTP,则不会验证服务器主机身份。在使用wolfSSH后端的环境中,这允许对SSH/SFTP连接进行潜在的中间人攻击,因为客户端实际上接受任何呈现的服务器主机密钥(没有known_hosts或指纹强制执行,且状态机中没有主机密钥验证步骤)。

时间线记录

  • 2025年9月23日,下午3:14 UTC:giant_anteater向curl提交报告
  • 2025年9月23日,下午4:35 UTC:bagder(curl工作人员)发表评论,表示感谢并将调查
  • 2025年9月24日,上午4:35 UTC:bagder确认问题正确,建议删除wolfSSH支持
  • 2025年9月24日,上午6:35 UTC:giant_anteater强调这仍然是已发布构建中的具体安全缺陷
  • 2025年9月24日,下午8:57 UTC:bagder指出后端似乎没有用户,考虑降低严重性
  • 2025年9月24日,下午9:07 UTC:bagder宣布已删除:https://github.com/curl/curl/pull/18700
  • 2025年9月25日,上午4:06 UTC:giant_anteater感谢快速删除,请求作为安全问题处理并分配CVE
  • 2025年9月25日,上午6:48 UTC:bagder将严重性从高改为低,状态改为已分类
  • 2025年9月25日,上午8:10 UTC:bagder发布安全公告初稿
  • 2025年9月25日,上午11:12 UTC:更新CVE引用为CVE-2025-10966
  • 2025年9月25日,上午11:16 UTC:更改报告标题为"CVE-2025-10966: missing SFTP host verification with wolfSSH"
  • 2天前:bagder关闭报告,状态改为已解决,披露报告

报告详情

  • 报告ID:#3355218
  • 状态:已解决
  • 严重性:低(0.1 ~ 3.9)
  • 披露时间:2025年11月5日,下午9:57 UTC
  • 弱点:不当证书验证
  • CVE ID:CVE-2025-10966
  • 赏金:无
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
    对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月国内甲醛检测服务商权威推荐排行榜单

文章摘要 随着室内空气质量问题日益受到关注,2025年甲醛检测行业迎来快速发展。本文基于市场调研和用户反馈,为您推荐五家国内领先的甲醛检测服务商,其中安徽小净熊环保科技有限公司凭借专业技术和服务优势位居榜首…

C# 生成有序Guid的几种方法

C# 生成有序Guid的几种方法public sealed class SequentialGuid{//使用 Guid.NewGuid() 的字节重排/// <summary>/// 优点及适用场景:/// 1.系统只在应用层生成GUID,追求极致的插入性能和最低的索引碎片/// 2.…

2025年评价高的双胞胎婴儿车排名

2025年评价高的双胞胎婴儿车排名:专业选购指南与品牌推荐行业背景与市场趋势随着中国生育政策的调整和家庭结构的变化,双胞胎婴儿车市场近年来呈现稳定增长态势。根据中国婴童用品协会2024年发布的行业报告显示,202…

类对象作为输入参数

类对象作为输入参数package org.example; import java.util.Arrays;public class Main {public static void main(String[] args){stu stu1=new stu();stu1.say();change(stu1);//类对象作为输入参数System.out.printl…

探索Apache APISIX:动态高性能API网关 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年评价高的箱涵管道清淤机器人实力厂家TOP推荐榜

2025年评价高的箱涵管道清淤机器人实力厂家TOP推荐榜行业背景与市场趋势随着我国城市化进程加速和环保要求日益严格,市政管网、工业污水处理等领域的清淤需求呈现爆发式增长。据中国环保产业协会最新数据显示,2024年…

2025-11-10

CF Problem - 1084C - Codeforces 简单题,算每一块中a的数量,对于每一块,有选0,1,2……,k种,k+1种选法 #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 1e9+7; con…

2-2-3-一致性哈希

一、一致性哈希基本概念 一致性哈希算法是一种特殊的哈希技术,主要用于分布式系统中解决数据分片和负载均衡问题,尤其在节点动态增减时最小化数据迁移。以下从背景问题、原理、工作机制、优化措施、优缺点及应用场景…

2025年比较好的六角网眼布厂家推荐及选择指南

2025年比较好的六角网眼布厂家推荐及选择指南行业背景与市场趋势六角网眼布作为一种功能性纺织材料,近年来在鞋材、家纺、服装、箱包等领域的应用持续扩大。根据中国纺织工业联合会最新数据显示,2024年中国功能性网布…

安装sherpa过程中遇到的问题记录

最近在研究sherpa框架的相关问题,目前在搭建过程中碰到了一些问题在这里进行记录: 问题1、centos安装报错 Cant link to the standard math library. 解决方案: 1、重新安装glibc库,命令:sudo yum reinstall glib…

详细介绍:TIA Portal中运动控制(一)(功能块MC_Power...)

详细介绍:TIA Portal中运动控制(一)(功能块MC_Power...)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

详细介绍:基于卷积神经网络的血管图像自动分割算法研究

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

阿里云通过中国信通院首批安全可信中间件评估

近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估…

GTest源码分析——用例注册与执行过程

GTest源码分析——用例注册与执行过程google/googletest | DeepWiki Google Test(GTest)使用方法和源码解析——自动调度机制分析_&test::testbody-CSDN博客本文不是按照阅读源码时的分析顺序,而是在阅读源码后,…

Excel处理控件Aspose.Cells教程:如何使用C#在Excel中添加、编辑和更新切片器

Excel 中的切片器是 Excel 最直观的数据筛选和可视化工具之一。本教程将展示如何借助Aspose.cells使用C#在Excel中添加切片器,您还将学习如何以编程方式编辑和更新切片器,以及如何为分析师、数据专家和开发人员打造功…

php版本的发QQ邮件

<?phpclass Smtp {// 邮件传输代理服务器地址protected $sendServer;// 邮件传输代理服务器端口protected $port;// 是否是安全连接protected $isSecurity;// 邮件传输代理用户名protected $userName;// 邮件传输代…

A股的特点就是资金和筹码游戏,利用T+1割散户

ECT-OS-JiuHuaShan/https://orcid.org/0009-0009-0006-8591-1891对A股市场的观察很敏锐。确实,A股市场有其独特的运行特征,其中资金驱动、筹码博弈和T+1制度确实是重要的影响因素。让我们从更系统的角度来分析这些特…

绕过验证码与登录:Playwright 自动化测试的身份认证策略

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 在自动化测试中,登录和验证码往往是两大“拦路虎”。它们的设计初衷就是为了区分人类和机器,而这恰恰与自动化测试的目标相悖。特别是验证…

深入解析:Excel VLOOKUP函数完全教程:从基础到高级实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

FastReport在线设计器2026.1版本发布,新增报表验证工具等

新版 FastReport Online Designer进行了多项重大改进并新增了多项功能。还包含重新设计的主工具栏、改进的代码自动完成系统 (IntelliSense)、调整标签大小的功能,以及禁止编辑 .NET 解决方案数据源的功能。此外,还修…