HTTP/3/QUIC TLS密码套件配置错误漏洞分析

本文详细分析了curl工具在使用--ciphers选项指定TLS密码套件时与HTTP/3/QUIC协议不兼容导致连接失败的技术问题,包含漏洞复现步骤和影响分析。

TLS密码套件在HTTP/3/QUIC支持中的错误配置

漏洞摘要

当使用curl命令的--ciphers选项手动指定TLS密码套件时会出现此漏洞。在这种情况下,HTTP/3或QUIC无法正常工作,因为QUIC不依赖于为TLS 1.2或更早版本定义的传统TLS密码套件。因此,在使用--ciphers选项时,尝试访问仅支持HTTP/3或QUIC的端点会导致连接失败。

curl实现问题:curl中的--ciphers选项不区分传统TLS协议(TLS 1.2/1.3)和QUIC,在指定不兼容的密码套件时会导致配置冲突。

协议不匹配:HTTP/3使用QUIC,该协议不与--ciphers选项指定的传统TLS密码套件一起工作。

受影响版本

1
2
3
4
curl 8.11.1 (x86_64-pc-linux-gnu) libcurl/8.11.1 OpenSSL/3.3.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.6 c-ares/1.34.3 libidn2/2.3.7 libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.64.0 nghttp3/1.6.0
Release-Date: 2024-12-11
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Largefile libz NTLM PSL SSL threadsafe TLS-SRP TrackMemory UnixSockets zstd

复现步骤

1
curl --disable -v --http3-only --ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA' https://1.1.1.1/cdn-cgi/trace

输出结果:

1
2
3
4
5
6
*   Trying 1.1.1.1:443...
* failed setting cipher list: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:D
* QUIC connect to 1.1.1.1 port 443 failed: Could not use specified SSL cipher
* Failed to connect to 1.1.1.1 port 443 after 0 ms: Could not use specified SSL cipher
* closing connection #0
curl: (59) failed setting cipher list: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:D

即使限制--ciphers参数的长度,仍然无法工作:

1
curl --disable -v --http3-only --ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256' https://1.1.1.1/cdn-cgi/trace

输出结果:

1
2
3
4
5
6
*   Trying 1.1.1.1:443...
* failed setting cipher list: ECDHE-ECDSA-AES128-GCM-SHA256
* QUIC connect to 1.1.1.1 port 443 failed: Could not use specified SSL cipher
* Failed to connect to 1.1.1.1 port 443 after 0 ms: Could not use specified SSL cipher
* closing connection #0
curl: (59) failed setting cipher list: ECDHE-ECDSA-AES128-GCM-SHA256

支持材料/参考文献

影响

尝试将curl与--ciphers选项一起用于HTTP/3或QUIC连接的用户会遇到连接失败问题。此问题可能会破坏依赖curl与HTTP/3/QUIC服务器交互的自动化或脚本。

项目团队回应

bagder (curl staff) 2025年2月7日 22:11 UTC:

请详细说明这如何成为一个安全问题?

jimfuller2024 (curl staff) 2025年2月8日 07:12 UTC:

期望是给定密码套件列表后,curl应该首先过滤出一组合适的密码选项并从中选择吗?如果是这样,这可以作为一个PR提交到curl/curl仓库,我们可以在那里讨论。

我也不明白这如何成为安全问题 - 如果提供错误的输入,有很多方法可以使curl无法工作…在输入不正确的情况下失败是适当的响应。可能发生的情况是您正在动态构建密码列表…构建该列表的任何内容都应该被修复。

bagder (curl staff) 于2025年2月10日 12:26 UTC将报告状态更改为"不适用"并关闭了报告。

bagder (curl staff) 13天前请求披露此报告:

根据项目的透明政策,我们希望所有报告都被披露并公开。

bagder (curl staff) 10天前披露了此报告。

报告详情

  • 报告时间:2025年2月7日 22:09 UTC
  • 报告者:zzq1015
  • 报告对象:curl
  • 报告ID:#2981303
  • 严重程度:无评级 (—)
  • 披露时间:2025年7月6日 21:05 UTC
  • 弱点:无
  • CVE ID:无
  • 赏金:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计