libcurl与rustls集成中的双重释放漏洞分析与修复

报告详细描述了libcurl在使用rustls后端时,因NoServerCertVerifier条件导致的应用程序双重释放漏洞。该漏洞存在于v8.13.0至v8.17.0版本中,并已在后续提交中修复。文章提供了完整的复现步骤、根因分析和代码补丁建议。

Double-free vulnerability in libcurl with rustls via NoServerCertVerifier condition leads to application crash

报告编号: #3427670 提交日期: 2025年11月16日 7:32 UTC 报告人: xkernel 提交至: curl

摘要: libcurl与rustls结合使用时存在一个双重释放漏洞。根本原因已被报告,并已在 https://github.com/curl/curl/pull/19425 中修复,尽管我当时并未尝试评估实际触发条件。未使用AI来发现此问题或生成报告。

受影响版本: 该漏洞通过提交 088f0e6a5b8d934073a0e089ebecd14ca75120c4 于2025年3月25日引入。影响了从v8.13.0到v8.17.0的官方版本。

复现步骤:

  1. 安装: (1) 通过 https://github.com/rustls/rustls-ffi/releases/download/v0.15.0/librustls_0.15.0_amd64.deb.zip 安装rustls-ffi。 (2) 从源代码构建curl-8_17_0。(我的配置是:"./configure --enable-debug --enable-static --disable-shared --with-rustls"

  2. 编译PoC程序: 通过命令 "gcc -o test_rustls_fail test.c -I./include ./lib/.libs/libcurl.a -lnghttp2 -lpsl -lrustls -lpthread -lz -fsanitize=address -g" 编译基础的PoC程序(PoC程序的源代码已附上)。基本目标是触发 rustls_client_config_builder_build() 处的 NoServerCertVerifier

  3. 漏洞触发分析: 在 cr_init_backend 函数中,lib/vtls/rustls.c 的第1046-1067行 用于设置验证器。一旦 !conn_config->verifypeerssl_config->native_ca_store(ca_info_blob || ssl_cafile) 这些条件不满足,验证器将不会被初始化。

  4. 运行PoC程序: 运行PoC程序。输出/内存检测器(sanitizer)信息将显示双重释放问题。

注意: 我并未完全尝试 rustls_client_config_builder_build() 所有其他不成功的可能性。PoC只是一个真实的触发案例,用于证明双重释放的存在。 根据我的个人分析,这主要影响libcurl,并且很难在curl工具中以可控的方式复现。 然而,在内存耗尽(oom)场景下,curl仍存在崩溃的风险。 例如,API rustls_client_config_builder_dangerous_set_certificate_verifier 返回OK,但由于 rustls/rustls-ffi client.rs第218行 的oom,验证器可能并未成功设置。 也许我们也可以像下面这样更早地防止它:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
else if(ca_info_blob || ssl_cafile) {
  result = init_config_builder_verifier(data,
                                        config_builder,
                                        conn_config,
                                        ca_info_blob,
                                        ssl_cafile);
  if(result != CURLE_OK) {
    rustls_client_config_builder_free(config_builder);
    return result;
  }
}
+ else {
+    rustls_client_config_builder_free(config_builder);
+    return CURLE_SSL_CONNECT_ERROR;
+ }

支持材料/参考文献: PoC程序的源代码。 请查看附件文件 test.c

时间线:

  • 12天前: xkernel 向curl提交了报告。
  • 12天前: bagder (curl团队成员) 发表了评论:“感谢您的报告!我们将花些时间调查您的报告,并尽快给您反馈详情和可能的后续问题!很可能在接下来的24小时内。我们始终努力尽快修复报告的问题。我们将低或中严重性的问题合并到普通发布周期的下一个版本中。只有更严重的问题我们可能会提前发布修复。”
  • 12天前: bagder (curl团队成员) 关闭了报告并将状态改为“信息性”。

    Rustls支持在curl中仍被视为并标记为实验性功能,这意味着我们不认为与之相关的问题是安全问题。我们强烈建议用户不要在生产中使用实验性代码。 因此,我没有花很多时间思考这个具体问题的其他细节。 这是一个bug,现在已经修复。如果后端不是实验性的,它可能会成为一个安全问题。

  • 12天前: bagder (curl团队成员) 请求公开此报告。

    根据项目的透明政策,我们希望所有报告都能公开并公之于众。

  • 12天前: xkernel 发表了评论。

    感谢快速回复。 我理解rustls后端目前被标记为实验性。虽然这只是一个免责声明,我尊重项目的相关政策。我希望这个发现至少有助于使实验性后端在其未来可能的稳定版本中更加健壮。

  • 12天前: bagder (curl团队成员) 发表了评论。

    谢谢 @xkernel,我们感谢您的帮助!

  • 11天前: bagder (curl团队成员) 公开了此报告。

报告详情:

  • 严重性: 未评级 (—)
  • 状态: 已公开
  • 公开日期: 2025年11月16日 10:40pm UTC
  • 弱点: 无
  • CVE ID: 无
  • 赏金: 无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计