跳转至

TLS Client-Initiated Renegotiation DoS Vulnerability

TLS 客户端发起的重新协商 DoS 漏洞

描述

此漏洞表明服务器允许无限制的客户端发起 TLS 重新协商,这可能被用于拒绝服务攻击(DoS),迫使服务器执行昂贵的密码学操作。

当 TLS 服务器允许客户端在没有足够速率限制(rate limiting)的情况下重复请求重新协商 TLS 参数时,就会发生客户端发起的重新协商漏洞。由于服务器在重新协商期间必须执行计算成本高昂的密码学操作,攻击者可以利用这一点,以极小的代价消耗服务器资源。

工作原理:

  1. 攻击者与目标服务器建立 TLS 连接。
  2. 攻击者重复触发 TLS 重新协商请求(可能达到每秒数千次)。
  3. 服务器的 CPU 在处理这些重新协商握手时达到饱和状态。
  4. 合法用户会经历严重的性能下降或完全的服务不可用。

要求:

  • 允许客户端发起重新协商的 TLS 服务器。
  • 对重新协商尝试缺乏速率限制(rate limiting)或节流(throttling)。
  • 能够与目标服务器建立连接。

Example Scenario: 攻击者向银行网站的 HTTPS 服务器建立少量连接,然后在每个连接上发起每秒数百次的重新协商请求。随着服务器处理这些密码学操作,其 CPU 使用率飙升至 100%,导致合法交易超时或完全失败。仅凭几个攻击连接,攻击者就能利用极小的带宽实现有效的拒绝服务攻击。

该攻击利用了 TLS 重新协商期间客户端与服务器之间的计算不对称性,其中服务器必须执行比客户端多得多的工作。这使其成为一种特别高效的 DoS 攻击向量,能够影响任何使用 TLS 的服务,包括 HTTPS、SMTP over TLS 以及其他安全协议。

建议

为了缓解 TLS 客户端发起的重新协商漏洞,请实施以下策略:

Primary Mitigations:

  1. Disable Client-Initiated Renegotiation - 最有效的缓解措施是完全禁用客户端发起的重新协商,同时在必要时仍允许服务器发起重新协商。

  2. Implement Renegotiation Rate Limiting - 如果无法禁用客户端重新协商,请对客户端可以请求重新协商的频率实施严格的速率限制。

  3. 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