报告 #3264469 - OpenSSL分配失败引发的释放后使用(或断言触发)
漏洞摘要
当某些内存分配失败时,可能触发堆的释放后使用(use after free)或断言失败。虽然不确定是否将分配失败视为安全问题,也不确定问题在于curl还是OpenSSL,但认为需要修复。
未使用AI发现或生成此报告。
受影响版本
使用提交48c6927f3b708fc6b6c0cd65d7971380798c8696复现。
复现步骤
- 使用 https://github.com/curl/curl-fuzzer/pull/173 并查看失败的运行
- 运行
FUZZ_VERBOSE=1 /out/curl_fuzzer_http repro,其中repro为 echo AJ4AAAACfkIAAQAAAAVAMT86PQ== | base64 -d > repro
- 观察到以下堆栈跟踪
堆栈跟踪(部分)
1
2
3
4
5
|
failed malloc(32)
#0 0x561a08afee21 in __sanitizer_print_stack_trace /src/llvm-project/compiler-rt/lib/asan/asan_stack.cpp:87:3
#1 0x561a08b33df2 in nalloc_backtrace_exclude /src/curl_fuzzer/nallocinc.c:250:9
#2 0x561a08b33df2 in nalloc_fail /src/curl_fuzzer/nallocinc.c:278:13
...
|
多次malloc失败后触发断言:
1
2
|
crypto/core_namemap.c:277: OpenSSL internal error: Assertion failed: ret != 0
==181== ERROR: libFuzzer: deadly signal
|
CI运行结果显示
AddressSanitizer检测到堆释放后使用:
1
2
3
4
5
|
==23==ERROR: AddressSanitizer: heap-use-after-free on address 0x50700001f528
READ of size 8 at 0x50700001f528 thread T0
#0 0x55df6b54ed49 in EVP_DigestUpdate /src/curl_fuzzer/build/openssl/src/openssl_external/crypto/evp/digest.c:390:15
#1 0x55df6b150692 in Curl_HMAC_init /src/curl/lib/hmac.c:92:5
...
|
根本原因分析
在Curl_HMAC_init函数中缺少错误检查:
1
2
|
// /src/curl/lib/hmac.c:86
hashparams->hinit(ctxt->hashctxt2); // 缺少错误检查
|
当my_sha256_init中的条件运行时:
1
2
3
4
|
if(!EVP_DigestInit_ex(ctx->openssl_ctx, EVP_sha256(), NULL)) {
EVP_MD_CTX_destroy(ctx->openssl_ctx);
return CURLE_FAILED_INIT;
}
|
这导致了在Curl_HMAC_init中的释放后使用问题。
修复方案
在lib/hmac.c中添加错误检查:
1
2
3
4
5
|
- hashparams->hinit(ctxt->hashctxt1);
- hashparams->hinit(ctxt->hashctxt2);
+ if(!hashparams->hinit(ctxt->hashctxt1) ||
+ !hashparams->hinit(ctxt->hashctxt2))
+ return NULL;
|
影响评估
虽然存在理论上的利用可能性,但由于需要OpenSSL内存分配失败的特殊条件,此问题被视为普通bug而非安全漏洞。修复PR:https://github.com/curl/curl/pull/18008
时间线
- 2025年7月22日:报告提交
- 2025年7月24日:报告公开披露
- 状态:信息性(Informative)
- 严重性:未评级
- CVE ID:无
- 赏金:无