wolfSSL后端HTTP/3中的证书固定绕过漏洞分析

本文详细分析了一个在curl库中使用wolfSSL后端并启用HTTP/3支持时存在的安全漏洞。该漏洞导致证书固定功能在禁用对等验证时被静默忽略,使得连接可能遭受中间人攻击。

证书固定绕过漏洞:wolfSSL后端与HTTP/3

摘要

当libcurl使用wolfSSL后端并启用HTTP/3支持时,存在一个安全特性绕过漏洞。如果用户同时禁用对等验证(使用 -k--insecure 选项),证书固定功能--pinnedpubkey)会被静默忽略。此行为与其他后端(如OpenSSL)不一致,可能导致连接暴露于中间人攻击之中。

受影响版本

在 curl 8.8.0-DEV 版本上重现。

环境信息

1
2
3
4
curl 8.8.0-DEV (x86_64-pc-linux-gnu) libcurl/8.8.0-DEV wolfSSL/5.7.0 zlib/1.2.13 nghttp2/1.52.0 ngtcp2/1.5.0 nghttp3/1.3.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTP2 HTTP3 IPv6 Largefile libz SSL threadsafe UnixSockets

重现步骤

我们通过一个伪造的固定哈希值(AAAA...)针对一个有效服务器(google.com),对比了标准构建(OpenSSL)与存在漏洞的构建(wolfSSL)的行为。

对照测试(标准OpenSSL)

运行命令:

1
curl -k --pinnedpubkey "sha256//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" https://www.google.com/

结果:

1
curl: (90) SSL: public key does not match pinned public key

(如预期般失败)

漏洞利用测试(存在漏洞的wolfSSL + HTTP/3构建)

运行命令:(使用存在漏洞的Docker环境 smbd/curl-http3-wolfssl:5.7.0

1
docker run --rm smbd/curl-http3-wolfssl:5.7.0 curl -v --http3 -k --pinnedpubkey "sha256//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" https://www.google.com/

结果摘要: 命令成功执行并返回了Google的首页HTML内容,而没有触发预期的证书固定验证错误。这证明了当 -k(禁用验证)与 --pinnedpubkey 一起使用时,wolfSSL后端的证书固定检查未生效。

根本原因分析

问题位于 lib/vquic/vquic-tls.c 文件中。触发固定检查的逻辑(Curl_wssl_verify_pinned)在通过配置禁用主要验证(verifyhost)时,似乎被有条件地跳过或未正确处理。与OpenSSL的实现不同,wolfSSL的QUIC包装器并未将证书固定视为一项独立的检查

影响

此漏洞允许中间人攻击者拦截和解密流量,即使用户已明确配置了证书固定功能来防范此类攻击。

后续验证与修复确认

在报告发布后,测试了包含修复(CVE-2025-5025)的更新版本(curl 8.18.0-DEV with wolfSSL/5.8.4)。使用相同的漏洞测试命令后,客户端正确地返回了错误:

1
curl: (90) SSL: public key does not match pinned public key

这证实了针对CVE-2025-5025漏洞的补丁已覆盖此场景,并且没有出现回归或修复不完整的情况。

报告状态

该报告被 curl 团队标记为 “Not Applicable”(不适用),因为它是一个重复报告,对应的漏洞(CVE-2025-5025)已被修复。根据项目的透明度政策,该报告已被公开披露。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计