OpenSSL密钥日志回调中的释放后使用漏洞分析

本文详细分析了OpenSSL密钥日志回调中存在的释放后使用漏洞,通过SSL_get_ex_data()函数可能导致程序崩溃或信息泄露。包含漏洞复现步骤、影响评估及开发团队回应,适合安全研究人员和开发者参考。

Use-After-Free in OpenSSL Keylog Callback via SSL_get_ex_data() in libcurl

报告摘要

在OpenSSL的SSL_CTX_set_keylog_callback设置后,libcurl中存在一个释放后使用(UAF)漏洞。当通过SSL_free()释放相关的SSL对象后,回调可能仍被调用,导致访问悬空指针,并通过SSL_get_ex_data()可能造成程序崩溃或信息泄露。

该漏洞可通过手动或意外方式触发,当在回调内部访问ex_data且SSL对象不再有效时发生。

安全影响:在特定条件下(当配置了密钥日志回调时),会导致分段错误(拒绝服务)。如果可能进行堆整理或ex_data滥用,可能进一步导致代码执行。

受影响版本

测试环境:

  • curl 8.8.0 (OpenSSL 3.3.0)
  • 发布日期:2024-06-26
  • 平台:Termux (Android 11, aarch64)
  • OpenSSL:3.3.0(从源代码构建)

复现步骤

构建以下最小C程序(使用gcc -o segv segv.c -lssl -lcrypto测试):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <stdio.h>
#include <stdlib.h>

void my_keylog_cb(const SSL *ssl, const char *line) {
    printf("Keylog callback: %s\n", line);
    // UAF: SSL已释放
    void *ptr = SSL_get_ex_data((SSL *)ssl, 0);  // 强制转换移除const
    printf("Data: %p\n", ptr);
}

int main() {
    SSL_library_init();
    SSL_load_error_strings();

    SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
    SSL_CTX_set_keylog_callback(ctx, my_keylog_cb);

    SSL *ssl = SSL_new(ctx);
    int idx = SSL_get_ex_new_index(0, "mydata", NULL, NULL, NULL);
    char *data = strdup("hello");
    SSL_set_ex_data(ssl, idx, data);

    SSL_free(ssl);  // 释放SSL
    // 在释放后触发回调
    my_keylog_cb(ssl, "CLIENT_RANDOM deadbeef...");

    SSL_CTX_free(ctx);
    free(data);
    return 0;
}

运行二进制文件:

1
2
3
4
$ ./segv
Keylog callback: CLIENT_RANDOM deadbeef...
Data: 0x0
Segmentation fault

AI参与情况

否,该漏洞是通过手动审计和测试发现的。然而,AI(ChatGPT)仅用于协助编写文档和估算CVSS/弱点分类(例如,CWE-416)。

影响评估

在特定条件下(当配置了密钥日志回调时),会导致分段错误(拒绝服务)。如果可能进行堆整理或ex_data滥用,可能进一步导致代码执行。

开发团队回应

dfandrich (curl staff)
您的概念验证程序根本没有使用libcurl。您是在报告libcurl还是OpenSSL中的问题?

jimfuller2024 (curl staff)
您是否忘记了包含curl.h示例?如果提交者省略信息或说话"含糊其辞",我们真的无法认为他们的提交有效…看不到(curl)安全问题。

bagder (curl staff)
您是如何"发现"这个问题的?我猜涉及了AI?

在curl的回调代码中,我们根本不会访问"相关的SSL对象"。那么这怎么又是一个问题呢?

在libcurl代码中,SSL_get_ex_data()的使用次数恰好为零。

报告状态更新
bagder将报告状态更改为"不适用",并请求披露此报告。根据项目透明政策,希望所有报告都被披露并公开。

brobagazzzx
明白了,感谢澄清。您说得对——这不会直接影响libcurl。感谢审核和透明度。

报告详情

  • 报告时间:2025年7月9日 03:04 UTC
  • 报告者:brobagazzzx
  • 报告对象:curl
  • 严重程度:高(7 ~ 8.9)
  • 披露时间:2025年7月9日 13:45 UTC
  • 弱点类型:释放后使用
  • CVE ID:无
  • 奖金:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计