curl的GnuTLS后端默认使用弱加密参数的安全漏洞分析

本文详细分析了curl在使用GnuTLS后端时默认采用弱加密参数的安全问题,包括具体的漏洞细节、复现步骤、潜在影响以及社区讨论的解决方案和补丁建议。

curl built with GnuTLS backend defaults to weak crypto parameters

Timeline nyymi 提交报告至 curl。 2025年10月31日,晚上9:48 (UTC)

摘要

使用GnuTLS后端配置的curl(--with-gnutls)默认使用库的“NORMAL”作为基础加密安全级别。根据GnuTLS文档:

1
2
The message authenticity security level is of 64 bits or more, and the certificate verification profile is set to GNUTLS_PROFILE_LOW (80-bits),
(来源:https://gnutls.org/manual/html_node/Priority-Strings.html)

因此,该库将允许使用弱消息认证(例如1024位DH组或使用DH复合组)的连接。 幸运的是,实际利用所需的不安全服务器配置相当罕见,但即使在今天,也不能完全排除这种可能性。

此问题的发现和报告未使用任何AI辅助工具。

受影响版本

  • 8.16.0
  • 8.17.0-DEV (当前 master 分支)

复现步骤

1
2
./configure --with-gnutls; make
./src/curl https://dh1024.badssl.com/ https://dh-small-subgroup.badssl.com/ https://dh-composite.badssl.com/

建议的修复

建议的修复方法是通过使用SECURE192基础级别,默认采用192位安全级别:

1
2
Means all the known to be secure ciphersuites that offer a security level 192-bit or more. The message authenticity security level is of 128 bits or more, and the certificate verification profile is set to GNUTLS_PROFILE_HIGH (128-bits).
(来源:https://gnutls.org/manual/html_node/Priority-Strings.html)

实现修复的示例补丁:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index c79f192e8..364af7622 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -315,14 +315,14 @@ static gnutls_x509_crt_fmt_t gnutls_do_file_type(const char *type)
   return GNUTLS_X509_FMT_PEM; /* default to PEM */
 }

-#define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509"
+#define GNUTLS_CIPHERS "SECURE192:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509"
 /* If GnuTLS was compiled without support for SRP it will error out if SRP is
    requested in the priority string, so treat it specially
  */
 #define GNUTLS_SRP "+SRP"

 #define QUIC_PRIORITY \
-  "NORMAL:-VERS-ALL:+VERS-TLS1.3:-CIPHER-ALL:+AES-128-GCM:+AES-256-GCM:" \
+  "SECURE192:-VERS-ALL:+VERS-TLS1.3:-CIPHER-ALL:+AES-128-GCM:+AES-256-GCM:" \
   "+CHACHA20-POLY1305:+AES-128-CCM:-GROUP-ALL:+GROUP-SECP256R1:" \
   "+GROUP-X25519:+GROUP-SECP384R1:+GROUP-SECP521R1:" \
   "%DISABLE_TLS13_COMPAT_MODE"

参考资料

影响

允许弱加密连接到配置不当的服务器,从而使处于中间人位置的潜在攻击者能够破解加密。

时间线评论摘要

nyymi (2025年11月1日,上午3:58 UTC): 询问如果NORMAL被记录为“意味着所有已知的安全密码套件”而GnuTLS没有做到这一点,这个bug是否应该提交给GnuTLS。

回复指出,移除SHA1密码套件并不能修复GNUTLS_PROFILE_LOW允许1024位DH组、DH复合组和RSA密钥的问题。优先级字符串同时控制着使用的密码和使用的加密安全参数(GNUTLS_PROFILE_… -> GNUTLS_SEC_PARAM_…),两者都受DEFAULT影响。

bagder (curl 工作人员) (2025年11月1日,上午10:07 UTC): 同意如果NORMAL没有使用“已知的安全密码套件”,那肯定是GnuTLS应该修复的bug。如果这个选项被视为安全问题,问题主要在GnuTLS,但我们可能仍想在代码中修复它以帮助用户。需要与GnuTLS专家讨论以确定必要的调整。

nyymi (2025年11月1日,下午12:34 UTC): 据理解,客户端应用程序无法直接调整安全配置文件。目前只能通过优先级字符串在LOW和HIGH配置文件之间选择(NORMAL,SECURE128使用LOW配置文件,SECURE192和SECURE256使用HIGH配置文件)。HIGH配置文件作为libcurl默认值可能过于严格。

icing (curl 工作人员) (2025年11月1日,下午12:50 UTC): 指出libcurl客户端可以通过CURLOPT_SSL_CIPHER_LIST显式设置gnutls完整优先级字符串。

nyymi (2025年11月3日,上午8:54 UTC): 详细阐述了漏洞利用的实际风险和前提条件,包括1024位RSA和1024位DH组的可利用性、攻击者所需的条件,并与现代OpenSSL的默认行为进行了对比(OpenSSL默认拒绝1024位DH组)。

nyymi (2025年11月3日,上午9:46 UTC): 提出了缓解建议:添加一个配置选项(例如--accept-gnutls-weak-crypto)来指定GnuTLS默认安全级别。如果未设置,默认安全级别为SECURE192。如果指定了该选项,则使用NORMAL。

jimfuller2024 (curl 工作人员) (2025年11月3日,上午10:00 UTC): 认为这有些令人困惑,既然curl用户已有变通方案,curl可能不需要做任何事情,这更可能是GnuTLS需要考虑的事情。

nyymi (2025年11月3日,下午2:21 UTC): 认为curl有责任修复,因为GnuTLS文档明确说明了使用NORMAL作为基线的结果,而curl的期望是默认安全。

nyymi (2025年11月4日,上午3:30 UTC): 发现可以使用%PROFILE_MEDIUM来强制执行中等配置文件。

dueno1 (GnuTLS 维护者) (2025年11月4日,下午12:36 UTC): 同意是时候收紧默认值并更新文档。建议curl暴露一种在构建时指定默认优先级字符串的方法(例如./configure --with-default-gnutls-priority-string=...),将责任推给用户或发行版。

bagder (curl 工作人员) (2025年11月5日,上午7:41 UTC): 同意为构建者提供更改curl构建使用的加密配置的方法是一个公平的建议,但curl不能推卸自己的责任:curl应该构建和提供安全的默认值。认为GnuTLS也需要这样做。

bagder (curl 工作人员) (2025年11月10日,上午9:49 UTC): 将报告状态更改为“信息性”并关闭。如果这被视为安全问题,问题属于GnuTLS而不是curl。对于早于修复版本的GnuTLS,仍应讨论是否在curl中采取某些措施。可能在GnuTLS进行调整之前,不应该在curl中修复它,以免在官方修复之前引起对该问题的注意。

nyymi (2025年11月20日,上午11:03 UTC): 询问鉴于GnuTLS似乎要等到明年才有计划,而指导是在此期间调整应用程序,那么现在是否应该这样做。

bagder (curl 工作人员) (15天前): 希望curl为用户构建得安全,无论他们是否使用发行版。如果用户使用GnuTLS构建,期望默认使用安全选项和密码。发行版可以设置自己的选择,但世界更大。认为发行版不会影响curl中的GnuTLS密码。同意可以暴露构建时指定默认优先级字符串的方法,但这在这里没有帮助,因为希望为默认用户修复构建。认为应该继续采用@nyymi上面的建议,因为感觉等太久不合适。并指出这也将导致我们在公开场合讨论这个问题。

bagder (curl 工作人员) (1天前): 已合并到git:https://github.com/curl/curl/pull/19853

nyymi (1天前): 请求公开此报告。

bagder (curl 工作人员) (1天前): 同意公开此报告。

报告于 2025年10月31日,晚上9:48 UTC 报告者 nyymi 报告对象 curl 报告 ID #3407352 状态 信息性 严重性 无 (0.0) 公开于 2025年12月8日,上午10:45 UTC 弱点 加密强度不足 CVE ID 无 赏金 无

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