curl非OpenSSL后端静默忽略SSL安全选项漏洞分析

摘要

受影响版本

已在最新的 master 版本(commit 2d5a063121202acaa23bb77975b2739bec4551ce)以及 mbedTLS 3.6 和 4.0 版本上进行测试。

复现步骤

在Linux系统上安装Docker,并运行 test.sh 脚本。该脚本会编译两个版本的curl:一个使用 mbedTLS 后端,另一个使用 OpenSSL 后端。随后,它通过一个自定义的C程序(这是复现漏洞所必需的)测试这三个bug,此外还会在命令行测试 EC_CURVES 漏洞。

预期输出:

=== mbedTLS ===
===========================================
curl 8.19.0-DEV (mbedTLS/4.0.0)
===========================================



  setopt: No error
  perform: No error
  Result: VULNERABLE - silently ignored!


  Setting: "INVALID_CURVE_NAME"
  setopt: No error
  perform: No error
  Result: VULNERABLE - silently ignored!


  Setting: "fake_crl.pem"
  setopt: No error
  perform: Failed to load CRL file (path? access rights?, format?)
  Result: CORRECT - CRL check enforced

===========================================
SUMMARY
===========================================

  CURLOPT_SSL_EC_CURVES     VULNERABLE
  CURLOPT_CRLFILE           OK

FOUND 2 VULNERABILITIES

=== OpenSSL ===
===========================================
curl 8.19.0-DEV (OpenSSL/3.0.13)
===========================================



  setopt: No error




  Setting: "INVALID_CURVE_NAME"
  setopt: No error
  perform: Could not use specified SSL cipher
  Result: CORRECT - EC curve validated


  Setting: "fake_crl.pem"
  setopt: No error
  perform: Failed to load CRL file (path? access rights?, format?)
  Result: CORRECT - CRL check enforced

===========================================
SUMMARY
===========================================

  CURLOPT_SSL_EC_CURVES     OK
  CURLOPT_CRLFILE           OK

No vulnerabilities found.

########################################
# CLI TEST (--curves)
########################################

=== mbedTLS CLI ===
Running: curl --curves INVALID_CURVE https://curl.se
200 -> VULNERABLE (silently ignored)

=== OpenSSL CLI ===
Running: curl --curves INVALID_CURVE https://curl.se
000 -> CORRECT (rejected invalid curve)

########################################
# RESULT
########################################

VULNERABILITIES CONFIRMED: mbedTLS ignores SSL options that OpenSSL enforces

这个问题很可能也存在于使用 Schannel 后端的Windows系统中,但未经过测试。

支持材料/参考资料

附件中包含以下文件:

  • Dockerfile: 使用 mbedTLS 和 OpenSSL 后端构建 curl。
  • test_ssl_options.c: 测试所有SSL选项的测试程序。
  • run_test.sh: 测试脚本(在容器内运行)。
  • test.sh: 构建和运行脚本(宿主机入口点)。

修复建议

修复方法应很简单:对于未实现这些特性的后端,返回 CURLE_NOT_BUILT_IN 错误。



    return CURLE_NOT_BUILT_IN;

这需要:

  1. 每个后端声明其支持的特性。
  2. 在接受选项之前检查支持情况。

影响

总结

  • 加密降级CURLOPT_SSL_EC_CURVES/--curves 选项被忽略,允许服务器(或MITM攻击者)协商比预期更弱的椭圆曲线,从而可能利用已知的加密弱点。
  • 静默失败:最关键的是,这些选项是静默失败的,返回 CURLE_OK 并继续执行,而没有进行安全检查。应用程序无法检测到其安全要求未被强制执行。

受影响平台

所有使用受影响后端的系统。例如 OpenWrt(在新版本中用 mbedTLS 替换了 WolfSSL)、使用 Schannel 的 Windows 构建版本,以及许多物联网设备和 Docker 容器。WolfSSL 可能也存在相同的bug。

攻击面

这些bug同时影响 libcurl 应用程序(通过 curl_easy_setopt())和 curl 命令行用户(通过 --curves--crlfile 标志)。三个漏洞中有两个不仅可以通过自定义程序,也可以通过命令行利用。FINISHED
biOK/hzhVF2yKaGc5mK8oeejIYuUYW8I3RsXQCFCiXWteYlwHYYXwn/OoRebmyRo
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐