跳转至

LOGJAM Common Prime Vulnerability

LOGJAM 常见素数漏洞 (LOGJAM Common Prime)

描述

此漏洞表明服务器使用了广泛共享的 Diffie-Hellman(DH)素数,这使得高效的预计算攻击成为可能,允许国家级攻击者被动解密大量的互联网流量。

LOGJAM-common_primes 发生于服务器使用相同的标准 DH 参数(素数),这些参数在数百万个安装实例中共享。虽然以前认为使用共享素数是安全的,但数域筛法(number field sieve algorithm)允许攻击者对每个素数进行一次昂贵的加密表预计算,然后快速破解使用该素数的任何连接。

原理:

  1. 攻击者识别出广泛使用的 DH 素数(例如,默认的 Apache/OpenSSL 参数)。
  2. 对目标素数进行昂贵的预计算(数周的计算时间)。
  3. 被动捕获任何使用该素数的服务器的 DH 密钥交换。
  4. 使用预计算的表在几分钟内破解各个连接。
  5. 将攻击扩展到数百万共享相同素数的服务器。

要求:

  • 服务器使用常见/默认的 DH 素数(1024 位或更小)。
  • 初始预计算需要大量的计算资源(1024 位约耗资 1 亿美元)。
  • 能够捕获目标连接的网络流量。
  • 不需要中间人(MITM)能力——这是一种纯被动攻击。

示例场景: 一家主要的云提供商在数千台服务器上使用了默认的 1024 位 DH 参数。一个国家级攻击者花费数月时间为这个特定的素数预计算加密表。完成后,他们可以被动监控互联网流量并实时解密任何到这些服务器的 TLS 连接,影响数百万用户,而没有任何主动干扰或被检测到。

破解最常见的 1024 位素数将允许对 18% 的顶级 HTTPS 域进行被动窃听,而破解两个最常见的素数将危及全球 66% 的 VPN 服务器和 26% 的 SSH 服务器。

建议

为了缓解 LOGJAM 常见素数攻击:

主要防御 - 生成唯一的 DH 参数:

# 生成唯一的 2048 位 DH 参数
openssl dhparam -out unique-dhparams.pem 2048

# Apache: 使用自定义参数
SSLOpenSSLConfCmd DHParameters /path/to/unique-dhparams.pem

# Nginx: 指定唯一参数  
ssl_dhparam /path/to/unique-dhparams.pem;

避免使用默认/常见素数:

切勿使用这些已被广泛攻破的素数: - 默认的 Apache 512 位素数(数百万台服务器使用)。 - 默认的 OpenSSL 512 位素数(自 1995 年以来在 SSLeay 中存在)。 - RFC 5114 标准素数(可能受 NSA 影响)。

迁移至 ECDHE:

最佳解决方案 - 完全消除 DH 漏洞:

# Apache: 优先使用 ECDHE 而非 DHE
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!DHE

# Nginx: 仅使用 ECDHE 密码套件
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!DHE;

使用至少 2048 位的参数:

如果需要使用 DHE:

# 确保最小密钥大小
ssl_dhparam_size 2048;  # Nginx

测试常见素数:

# 从服务器提取 DH 参数
openssl s_client -connect example.com:443 -cipher DHE 2>&1 | \
  openssl dhparam -inform PEM -text -noout

# 与已知的易受攻击的素数进行对比
# 检查素数是否与 Apache 默认值或其他常见值匹配

额外保护措施:

  • 使用完全消除有限域 DH 的 TLS 1.3。
  • 实施证书固定(certificate pinning)以检测 MITM 尝试。
  • 监控表明大批量流量分析的异常连接模式。
  • 在选择密码套件时考虑完全前向保密(Perfect Forward Secrecy)的影响。

关键见解: 即使是强 1024 位 DH 参数,如果在许多服务器之间共享也会变得脆弱,因为预计算成本可以被摊销。唯一性与大小同样重要。

链接

标准

  • SOC2_CONTROLS:
    • CC_6_7
    • CC_7_1
  • CCPA:
    • CCPA_1798_150
  • GDPR:
    • ART_32
  • PCI_STANDARDS:
    • REQ_4_1
    • REQ_6_2
    • REQ_11_3