curl FTP协议内存泄漏漏洞分析(含代理重用场景)

本文详细分析了curl在FTP协议处理过程中出现的内存泄漏问题,特别是在代理连接重用场景下。包含漏洞复现步骤、堆栈跟踪信息和修复方案,涉及curl-fuzzer模糊测试技术。

内存泄漏报告 #3023139 - FTP协议(含代理重用)

漏洞摘要

存在FTP协议相关的内存泄漏问题(参见复现步骤和堆栈跟踪) 该漏洞是通过使用 https://github.com/catenacyber/curl-fuzzer/tree/proxy 进行模糊测试发现的(在修复了curl中的一个小的内存泄漏之后)

报告内容较为原始,不确定这是否只是一个不会导致安全漏洞的小泄漏。 看起来有两个连接结构体 struct connectdata *conn,第一个通过 ftp_disconnect 清理,但第二个(来自代理重用的)即使在 ftp_setup_connection 中分配了资源也没有被清理

甚至不确定这个bug是在curl中,还是在curl_fuzzer中

受影响版本

curl 8.13.0-DEV (x86_64-apple-darwin23.6.0) libcurl/8.13.0-DEV OpenSSL/1.0.2n zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 nghttp2/1.55.1 librtmp/2.3

发布日期:[未发布] 协议:dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp ws wss 特性:alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IDN IPv6 Largefile libz NTLM PSL SSL threadsafe TLS-SRP UnixSockets

复现步骤

运行附带的模糊测试复现器,使用以下构建目标:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
diff --git a/projects/curl/Dockerfile b/projects/curl/Dockerfile
index 1dc106a53..23245c9bf 100644
--- a/projects/curl/Dockerfile
+++ b/projects/curl/Dockerfile
@@ -16,11 +16,11 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-RUN git clone --depth 1 https://github.com/curl/curl.git /src/curl
-RUN git clone --depth 1 https://github.com/curl/curl-fuzzer.git /src/curl_fuzzer
+RUN git clone --depth 1 --branch dummy https://github.com/catenacyber/curl.git /src/curl
+RUN git clone --depth 1 --branch proxy https://github.com/catenacyber/curl-fuzzer.git /src/curl_fuzzer
 
 # Use curl-fuzzer's scripts to get latest dependencies.
 RUN $SRC/curl_fuzzer/scripts/ossfuzzdeps.sh
 
 WORKDIR $SRC/curl_fuzzer

支持材料/参考

运行 FUZZ_VERBOSE=1 ./curl_fuzzer_ftp ./minimized-from-5ab60dd6d34f13da35bcebf1f965f8dd6e409e88 的输出

详细日志显示了FTP协议交互过程,包括:

  • TLV类型数据的处理
  • 套接字管理器的使用
  • FTP命令序列(USER、PWD、CWD、EPSV、PASV等)
  • 连接建立和数据传输过程

关键错误信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
=================================================================
==15473==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 17 byte(s) in 1 object(s) allocated from:
    #0 0x55ce0ef26f0f in malloc /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:68:3
    #1 0x55ce0ef92cb7 in curl_dbg_malloc /src/curl/lib/memdebug.c:146:9
    #2 0x55ce0ef92cb7 in curl_dbg_strdup /src/curl/lib/memdebug.c:200:9
    #3 0x55ce0f093870 in ftp_setup_connection /src/curl/lib/ftp.c:4381:21
    #4 0x55ce0f005d5d in setup_connection_internals /src/curl/lib/url.c:2024:14
    #5 0x55ce0efff415 in create_conn /src/curl/lib/url.c:3522:12
    #6 0x55ce0efff415 in Curl_connect /src/curl/lib/url.c:3803:12
    #7 0x55ce0efbadff in state_connect /src/curl/lib/multi.c:2149:21
    #8 0x55ce0efbadff in multi_runsingle /src/curl/lib/multi.c:2273:12
    #9 0x55ce0efb64d2 in curl_multi_perform /src/curl/lib/multi.c:2619:16
    #10 0x55ce0ef67b02 in fuzz_handle_transfer(fuzz_data*) /src/curl_fuzzer/curl_fuzzer.cc:424:5
    #11 0x55ce0ef669a7 in LLVMFuzzerTestOneInput /src/curl_fuzzer/curl_fuzzer.cc:97:3

影响分析

该内存泄漏问题较小且不频繁,不被视为安全问题,属于"常规bug"。

处理过程

  • 2025年3月5日:catenacyber提交报告
  • 2025年3月5日:bagder确认无法立即复现,询问具体提交版本
  • 2025年3月6日:bagder成功复现泄漏问题
  • 2025年3月7日:bagder关闭报告并将状态改为"信息性",提交PR #16604修复
  • 15天前:报告被请求公开披露
  • 15天前:报告同意公开披露

最终修复方案已在GitHub提交:https://github.com/curl/curl/pull/16604

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