OpenSSL HTTP/3 中 CURLINFO_TLS_SSL_PTR 返回无效指针的安全漏洞分析
摘要
curl_easy_getinfo CURLINFO_TLS_SSL_PTR
在 OpenSSL HTTP/3 连接中返回无效的 SSL 连接指针。使用此 SSL 连接会导致崩溃,并可能产生其他影响。此问题在 libcurl 8.14.1 中未出现,表明该漏洞存在于 libcurl 本身(或 libcurl 8.14.1 未触发其他支持库中的漏洞)。一些调试输出表明这可能是一个释放后使用/悬空指针问题。如果是这样,该问题可能导致远程代码执行。在撰写本报告时,这一点尚未得到确认。
受影响版本
- 8.15.0(发布版本)
- 8.15.1-DEV(7c23e88d17e0939b4e01c8d05f430e167e148f4b)
复现步骤
- 使用 OpenSSL 3.5.1 及足够新的 nghttp2、nghttp3 和 ngtcp2 编译 libcurl(
--with-openssl --with-nghttp2 --with-ngtcp2 --with-nghttp3
)。 - 使用
-fsanitize=address
编译以下概念验证应用:
|
|
- 执行 PoC:
|
|
支持材料/参考
本报告不含 AI 生成内容,供您愉快阅读。停止垃圾内容!
影响
摘要
- 至少:访问 HTTP/3 站点时导致拒绝服务。
- 潜在:如果返回的指针指向已释放的内存,可能导致内存损坏。根据目标平台的不同,可能实现远程代码执行。需要进一步分析以确定完整影响。
详细分析
问题根源
在 OpenSSL HTTP/3 连接中,curl_easy_getinfo CURLINFO_TLS_SSL_PTR
返回的指针实际上是另一个 OpenSSL 对象的指针,而非有效的 SSL 连接指针。此错误在 libcurl 8.15.0 中引入,仅影响 HTTP/3 连接。
潜在利用向量
- 拒绝服务(DoS):使用返回的无效指针会导致应用程序崩溃。
- 内存损坏:如果返回的指针指向已释放的内存,可能导致内存损坏。
- 远程代码执行(RCE):如果攻击者能够通过堆操纵构造有效的函数指针,可能实现远程代码执行。但此利用需要满足多个复杂条件,包括堆地址泄露和特定的堆布局。
利用条件
- 应用程序必须使用此回调。
- 恶意代码必须与应用程序共享同一堆,并能够以特定方式操纵堆。
- 攻击者代码必须能够触发应用程序执行 HTTP/3 请求,并在堆设置完全符合预期时触发此回调。
- 应用程序在回调中必须仅使用一组相当罕见的 OpenSSL 函数,且回调在未成功利用时立即崩溃。
- 成功的攻击很可能需要获取堆地址,这需要通过此错误之外的其他信息。
修复建议
已提交修复 PR:https://github.com/curl/curl/pull/18066
结论
尽管此漏洞理论上可能导致远程代码执行,但由于利用条件复杂且要求严格,实际安全影响有限。建议用户升级到修复版本以避免潜在问题。