GnuTLS与OpenSSL类型混淆漏洞分析

本文详细分析了curl库中GnuTLS与OpenSSL后端类型混淆漏洞的技术细节,包括漏洞成因、影响范围及修复方案,涉及TLS会话处理机制和跨SSL库兼容性问题。

GnuTLS CURLINFO_TLS_SESSION / CURLINFO_TLS_SSL_PTR 类型混淆

漏洞摘要

curl_easy_getinfo函数在处理CURLINFO_TLS_SESSION和CURLINFO_TLS_SSL_PTR时,错误地将GnuTLS后端标识为CURLSSLBACKEND_OPENSSL,导致类型混淆问题。

技术细节

1
2
3
4
struct curl_tlssessioninfo {
  curl_sslbackend backend;
  void *internals;
};

漏洞位于vquic-tls.c文件第211行:

1
2
3
4
5
#elif defined(USE_GNUTLS)
  (void)give_ssl_ctx; /* gnutls always returns its session */
  info->backend = CURLSSLBACKEND_OPENSSL;  // 错误的后端标识
  info->internals = ctx->gtls.session;
  return TRUE;

影响分析

  1. 当调用方根据backend字段动态决策时,会将gnutls_session_t错误解析为SSL_CTX/SSL结构
  2. 可能导致崩溃或其他未知影响,具体取决于应用程序如何处理错误指针
  3. 缓解因素:需同时链接GnuTLS和OpenSSL库的罕见场景才会触发

受影响版本

  • curl 8.15.0

复现步骤

  1. 构建同时支持GnuTLS和OpenSSL的应用程序
  2. 使用curl_easy_getinfo获取CURLINFO_TLS_SESSION或CURLINFO_TLS_SSL_PTR
  3. 当检测到CURLSSLBACKEND_OPENSSL时调用OpenSSL函数

修复方案

已通过PR #17976修复:

1
2
- info->backend = CURLSSLBACKEND_OPENSSL;
+ info->backend = CURLSSLBACKEND_GNUTLS;

补充说明

  • HTTP/3不支持MultiSSL特性,降低了实际影响
  • 该问题更倾向于普通bug而非安全漏洞
  • 项目方基于透明度原则选择公开披露
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计