LOGJAM Attack on Diffie-Hellman
针对 Diffie-Hellman 的 LOGJAM 攻击
描述
此漏洞表明服务器容易受到 LOGJAM 攻击。这些攻击利用弱 Diffie-Hellman 参数,将 TLS 连接降级为可破解的出口级(export-grade)加密。
当 TLS 服务器支持 DHE_EXPORT 密码套件或使用较弱的 512 位 Diffie-Hellman 参数时,就会发生 LOGJAM 攻击。中间人攻击者可以迫使客户端从强 DHE 密钥交换降级为弱出口级 DH,从而使加密易受离线密码分析的攻击。
攻击原理:
- 攻击者拦截客户端和服务器之间的 TLS 握手。
- 强制将强 DHE 密码降级为弱 DHE_EXPORT(512 位)。
- 捕获具有弱 DH 参数的降级连接。
- 使用预先计算的离散对数表离线破解 512 位 DH。
- 恢复会话密钥并解密所有捕获的流量。
攻击条件:
- 服务器支持 DHE_EXPORT 密码套件或弱 DH 参数。
- 能够强制实施降级的中间人网络位置。
- 针对常见 DH 素数的预先计算数域筛(number field sieve)表。
- 客户端容易受到协议降级攻击。
攻击场景示例: 为了保持兼容性,企业 VPN 服务器支持旧版 DHE_EXPORT 密码。网络上的攻击者拦截员工连接并强制将其降级为 512 位 DH 参数。通过使用预先计算的加密表(生成成本约为 18,000 美元),攻击者可在数小时内破解较弱的 DH 交换并解密所有 VPN 流量,从而暴露企业凭据和敏感数据。
此攻击利用了与 FREAK 相同的 20 世纪 90 年代出口限制,证明了政府强制削弱加密标准的做法是如何在全世界数百万台服务器所使用的 Diffie-Hellman 密钥交换协议中造成持久的漏洞的。
修复建议
为了缓解 LOGJAM 攻击:
主要防御措施 - 禁用出口级 DH 密码:
# Apache - 禁用导出 DH 密码套件
SSLCipherSuite HIGH:!aNULL:!MD5:!EXP:!DHE
# 更好:使用 ECDHE 代替 DHE
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!DHE
# Nginx - 禁用弱 DH 密码套件
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!DHE:!EXPORT:!DES:!RC4:!MD5;
使用强 DH 参数:
如果需要使用 DHE,请生成大于或等于 2048 位的自定义参数:
# 生成强大的 DH 参数
openssl dhparam -out dhparams.pem 2048
# Apache: 使用自定义 DH 参数
SSLOpenSSLConfCmd DHParameters /path/to/dhparams.pem
# Nginx: 指定自定义 DH 参数
ssl_dhparam /path/to/dhparams.pem;
优先使用 ECDHE 而非 DHE:
ECDHE 能够提供更好的性能和安全性:
# 优先使用 ECDHE 密码套件
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-CHACHA20-POLY1305
ECDHE-RSA-CHACHA20-POLY1305
客户端保护:
// Java - disable weak DH
System.setProperty("jdk.tls.disabledAlgorithms", "DH keySize < 1024");
测试 LOGJAM:
# 测试对 DHE_EXPORT 的支持
nmap --script ssl-enum-ciphers -p 443 example.com | grep DHE_EXPORT
# 应该显示没有可用的 DHE_EXPORT 密码套件
openssl s_client -connect example.com:443 -cipher DHE-EXPORT
额外的缓解措施:
- 使用 TLS 1.3,因为该版本已移除了对弱 DH 参数的支持。
- 使用 ECDHE 密钥交换来实现完美前向保密(perfect forward secrecy)。
- 监控是否存在异常的密码协商模式。
- 定期审计 TLS 配置以发现是否使用了弱参数。
根本的修复方案是放弃使用 DHE,转而使用 ECDHE。ECDHE 不仅能提供同等级别的安全性,还能带来更好的性能,而且不存在任何出口级别的漏洞。
链接
标准
- 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
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213