TLS Client-Initiated Renegotiation DoS Vulnerability
TLS 客户端发起的重新协商 DoS 漏洞
描述
此漏洞表明服务器允许无限制的客户端发起 TLS 重新协商,这可能被用于拒绝服务攻击(DoS),迫使服务器执行昂贵的密码学操作。
当 TLS 服务器允许客户端在没有足够速率限制(rate limiting)的情况下重复请求重新协商 TLS 参数时,就会发生客户端发起的重新协商漏洞。由于服务器在重新协商期间必须执行计算成本高昂的密码学操作,攻击者可以利用这一点,以极小的代价消耗服务器资源。
工作原理:
- 攻击者与目标服务器建立 TLS 连接。
- 攻击者重复触发 TLS 重新协商请求(可能达到每秒数千次)。
- 服务器的 CPU 在处理这些重新协商握手时达到饱和状态。
- 合法用户会经历严重的性能下降或完全的服务不可用。
要求:
- 允许客户端发起重新协商的 TLS 服务器。
- 对重新协商尝试缺乏速率限制(rate limiting)或节流(throttling)。
- 能够与目标服务器建立连接。
Example Scenario: 攻击者向银行网站的 HTTPS 服务器建立少量连接,然后在每个连接上发起每秒数百次的重新协商请求。随着服务器处理这些密码学操作,其 CPU 使用率飙升至 100%,导致合法交易超时或完全失败。仅凭几个攻击连接,攻击者就能利用极小的带宽实现有效的拒绝服务攻击。
该攻击利用了 TLS 重新协商期间客户端与服务器之间的计算不对称性,其中服务器必须执行比客户端多得多的工作。这使其成为一种特别高效的 DoS 攻击向量,能够影响任何使用 TLS 的服务,包括 HTTPS、SMTP over TLS 以及其他安全协议。
建议
为了缓解 TLS 客户端发起的重新协商漏洞,请实施以下策略:
Primary Mitigations:
-
Disable Client-Initiated Renegotiation - 最有效的缓解措施是完全禁用客户端发起的重新协商,同时在必要时仍允许服务器发起重新协商。
-
Implement Renegotiation Rate Limiting - 如果无法禁用客户端重新协商,请对客户端可以请求重新协商的频率实施严格的速率限制。
-
Update TLS Libraries - 确保更新所有 TLS 实现,以包含针对基于重新协商的 DoS 攻击的保护措施。
Implementation Examples:
# Nginx 配置
# 禁用客户端重新协商
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
# Apache 配置
# 禁用客户端重新协商,同时保留服务器重新协商
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOptions +NoRenegotiate
# OpenSSL 配置 (用于自定义应用)
SSL_CTX_set_options(ctx, SSL_OP_NO_CLIENT_RENEGOTIATION);
For Load Balancers:
# F5 BIG-IP 配置
modify ltm profile client-ssl my_ssl_profile {
renegotiation disabled
}
Additional Safeguards:
- 部署 Web Application Firewall (WAF) 以检测并阻止过量的重新协商请求。
- 在网络层实施连接和请求的速率限制。
- 考虑升级到 TLS 1.3,该版本完全消除了重新协商机制。
- 配置网络超时策略,以关闭那些尝试过度重新协商的连接。
Verifying Your Configuration:
# 使用 OpenSSL 测试客户端重新协商
openssl s_client -connect example.com:443 -tls1_2
# 然后输入 "R" 并按回车键请求重新协商
# 如果连接终止或返回错误,说明客户端重新协商已被禁用
链接
标准
- SOC2_CONTROLS:
- CC_6_7
- CC_7_1
- CCPA:
- CCPA_1798_150
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213
- GDPR:
- ART_32
- PCI_STANDARDS:
- REQ_2_3
- REQ_6_5
- REQ_11_3