OpenSSL分配失败引发的Use After Free漏洞分析

本文详细分析了在OpenSSL内存分配失败时触发的Use After Free漏洞,包括漏洞复现步骤、堆栈跟踪和修复方案,涉及curl和OpenSSL的交互问题。

报告 #3264469 - OpenSSL分配失败引发的Use After Free(或断言触发)

提交者: catenacyber
提交时间: 14天前

摘要

当某些内存分配失败时,可能触发堆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
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(unsigned long, char const*) /src/curl_fuzzer/nallocinc.c:250:9
    ...(详细堆栈跟踪)

(此处省略详细堆栈跟踪,原文中包含多个malloc失败和断言触发的调用链)

CI运行显示

1
2
3
4
5
6
=================================================================
==23==ERROR: AddressSanitizer: heap-use-after-free on address 0x50700001f528 at pc 0x55df6b54ed4a bp 0x7ffcfa45d090 sp 0x7ffcfa45d088
READ of size 8 at 0x50700001f528 thread T0
SCARINESS: 51 (8-byte-read-heap-use-after-free)
    #0 0x55df6b54ed49 in EVP_DigestUpdate /src/curl_fuzzer/build/openssl/src/openssl_external/crypto/evp/digest.c:390:15
    ...(详细堆栈跟踪)

(此处省略详细的AddressSanitizer输出,包括内存释放和分配的历史记录)

影响

bagder (curl staff) 评论于14天前:
感谢您的报告!我们将花时间调查您的报告,并尽快回复您详细信息和可能的后续问题!很可能在接下来的24小时内。

我们始终努力尽快修复报告的问题。低或中等严重性的问题我们会合并到普通发布周期的下一个版本中。只有更严重的问题我们可能会提前发布修复。

后续讨论摘要

  • 讨论了malloc失败的含义(返回NULL)
  • 确认fuzzer可以模拟分配失败
  • 发现Curl_HMAC_init中缺少错误检查
  • 提出了修复方案:在hashparams->hinit调用后添加NULL检查
  • 讨论了漏洞利用的可行性(认为理论上可能但实际利用困难)
  • 最终将问题视为普通bug而非安全问题
  • 修复PR:https://github.com/curl/curl/pull/18008

报告状态: 已公开
严重性: 无评级 (—)
弱点: Use After Free
CVE ID: 无
赏金: 无

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计