curl FTP协议内存泄漏漏洞分析与修复

本文详细分析了curl在FTP协议实现中存在的内存泄漏问题,涉及代理重用场景下的连接结构清理不完整,提供了完整的复现步骤和调试堆栈信息。

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

时间线
catenacyber 向 curl 提交报告
2025年3月5日 10:53 UTC

摘要

存在FTP协议的内存泄漏问题(参见复现步骤和堆栈跟踪)
通过使用 https://github.com/catenacyber/curl-fuzzer/tree/proxy 进行模糊测试发现(在修复了curl中的一个小内存泄漏后)
报告内容较为原始,不确定这是否只是一个不会导致安全漏洞的小泄漏。
看起来存在两个连接结构 struct connectdata *conn,第一个通过 ftp_disconnect 清理,但第二个(来自代理重用的)即使在 ftp_setup_connection 中分配了资源也没有被清理。
不确定错误是在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 的输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
1TLV: type 1 length 37
2Check length of data: 43 
3Remaining length of data: 262 
... [详细的协议交互日志] ...
108=================================================================
109==15473==ERROR: LeakSanitizer: detected memory leaks
110
111Direct leak of 17 byte(s) in 1 object(s) allocated from:
112    #0 0x55ce0ef26f0f in malloc /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:68:3
113    #1 0x55ce0ef92cb7 in curl_dbg_malloc /src/curl/lib/memdebug.c:146:9
114    #2 0x55ce0ef92cb7 in curl_dbg_strdup /src/curl/lib/memdebug.c:200:9
115    #3 0x55ce0f093870 in ftp_setup_connection /src/curl/lib/ftp.c:4381:21
116    #4 0x55ce0f005d5d in setup_connection_internals /src/curl/lib/url.c:2024:14
117    #5 0x55ce0efff415 in create_conn /src/curl/lib/url.c:3522:12
118    #6 0x55ce0efff415 in Curl_connect /src/curl/lib/url.c:3803:12
119    #7 0x55ce0efbadff in state_connect /src/curl/lib/multi.c:2149:21
120    #8 0x55ce0efbadff in multi_runsingle /src/curl/lib/multi.c:2273:12
121    #9 0x55ce0efb64d2 in curl_multi_perform /src/curl/lib/multi.c:2619:16
122    #10 0x55ce0ef67b02 in fuzz_handle_transfer(fuzz_data*) /src/curl_fuzzer/curl_fuzzer.cc:424:5
123    #11 0x55ce0ef669a7 in LLVMFuzzerTestOneInput /src/curl_fuzzer/curl_fuzzer.cc:97:3

影响

附件
1个附件:F4114183: leak-ed83ae30011a435cabd4237bb9a99f920e6d18a8

讨论时间线

bagder (curl staff) 2025年3月5日 13:44 UTC
不幸的是,我现在似乎无法构建模糊测试器,因此无法运行此复现器。
您是在哪个提交上运行的?ftp.c的行号与当前master中的不匹配。
似乎是在某种错误情况下,account或alternative_to_user选项发生了泄漏。
我运行了测试280和294,进行了几次额外的 torture 测试,但没有发现泄漏。

bagder (curl staff) 2025年3月5日 13:47 UTC
无论如何,泄漏太小且不频繁,不足以被视为安全问题。这是一个"常规错误"(如果有的话)。

catenacyber 2025年3月5日 14:04 UTC
您是在哪个提交上运行的?
我运行的是 https://github.com/catenacyber/curl/tree/dummy

无论如何,泄漏太小且不频繁,不足以被视为安全问题。这是一个"常规错误"(如果有的话)。
我认为泄漏确实很小。
一旦 #3022041 被修复,我建议提交PR更新curl-fuzzer,以便oss-fuzz再次发送此问题。

bagder (curl staff) 2025年3月6日 20:14 UTC
我现在已经成功用模糊测试器复现了这个泄漏,正在尝试找出原因。

bagder (curl staff) 2025年3月7日 08:37 UTC
关闭报告并将状态更改为信息性。
这不是安全问题。我们可以在公共问题跟踪器中正常处理这个问题。
我刚为此提交了一个PR:https://github.com/curl/curl/pull/16604
感谢报告!

catenacyber 2025年3月7日 09:24 UTC
如预期的那样,感谢修复。

bagder (curl staff) 2025年7月1日 14:10 UTC
根据项目的透明政策,我们希望所有报告都被公开披露。

catenacyber 2025年7月1日 16:25 UTC
同意披露此报告。

报告披露 2025年7月1日 16:25 UTC

报告详情
报告时间:2025年3月5日 10:53 UTC
报告者:catenacyber
报告对象:curl
报告ID:#3023139
严重性:无 (0.0)
披露时间:2025年7月1日 16:25 UTC
弱点:无
CVE ID:无
赏金:无
账户详情:无

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