OpenSSL HTTP/3漏洞分析
漏洞概述
curl_easy_getinfo
的CURLINFO_TLS_SSL_PTR
在OpenSSL HTTP/3连接中返回了无效的SSL连接指针。使用此SSL连接会导致崩溃,并可能产生其他影响。
受影响版本
- 8.15.0 (release)
- 8.15.1-DEV (7c23e88d17e0939b4e01c8d05f430e167e148f4b)
复现步骤
-
使用OpenSSL 3.5.1编译libcurl,并配置足够新的nghttp2、nghttp3和ngtcp2
1
--with-openssl --with-nghttp2 --with-ngtcp2 --with-nghttp3
-
使用地址消毒剂编译PoC应用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <curl/curl.h> #include <openssl/ssl.h> #include <stdio.h> static size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata) { // 回调函数实现 } int main(void) { // 主函数实现 }
漏洞影响
最低影响:访问HTTP/3站点时导致拒绝服务
潜在影响:如果返回的指针指向已释放的内存,可能导致内存损坏。根据目标平台不同,可能实现远程代码执行。
技术分析
漏洞源于将OpenSSL不透明指针错误地指向了另一个OpenSSL对象。这个错误是在libcurl 8.15.0中引入的,仅影响HTTP/3连接。
攻击者需要满足以下条件才能利用此漏洞:
- 应用程序使用此回调
- 加载与应用程序共享堆的恶意代码
- 能够以特定方式操作堆
- 触发应用程序执行HTTP/3请求并在堆设置完全符合预期时触发此回调
修复方案
GitHub上已提交修复PR:curl/curl#18066
时间线
- 2025-07-20 漏洞报告提交
- 2025-07-28 漏洞公开披露