内存泄漏报告 #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