DROWN (Decrypting RSA with Obsolete and Weakened eNcryption)
定义
DROWN 是 2016 年公布的跨协议攻击(CVE-2016-0800),借助任何支持 SSLv2 的服务器,解密使用同一 RSA 密钥的 TLS 会话。
DROWN 由一个学术研究团队于 2016 年 3 月公布。SSLv2 早已过时多年,但当时仍有大量服务器接受它,而它的出口级密码和握手缺陷使其成为针对 RSA 的 Bleichenbacher 式填充预言机。攻击者先记录使用 RSA 密钥交换的 TLS 连接,再向任何持有同一 RSA 密钥的服务器发送大量精心构造的 SSLv2 握手,利用响应解密之前记录的 TLS 会话。TLS 服务器本身不必支持 SSLv2,只要它的密钥或证书与某台支持 SSLv2 的服务器共用即可。
为什么重要
DROWN 说明一个端口或一台主机上的弱协议,可以连累其他地方的强 TLS:如果邮件服务器开着 SSLv2,与它共用证书和私钥的网站即使从未提供 SSLv2 也会受影响。漏洞公开时,相当大比例的 HTTPS 服务器存在风险,主要原因就是这类密钥共用。缓解办法:在所有地方禁用 SSLv2(OpenSSL 从 1.1.0 起已移除 SSLv2 支持);不要在配置不同的服务之间共用私钥;优先使用 ECDHE 密钥交换,因为 DROWN 只能解密使用 RSA 密钥交换的会话。很多企业把一张通配符证书同时部署在网站、邮件、VPN 等多处,排查时尤其要把这些服务都算进去。
例子
检查所有使用同一证书的主机和端口,而不只是网站:
nmap --script sslv2 -p 443,25,465,587,993,995 mail.example.com
常见误区
- 我的网站没开 SSLv2,就不受 DROWN 影响。 任何使用同一 RSA 密钥的其他服务器,例如老旧的邮件或 VPN 服务器,都足以构成威胁。
- TLS 1.2 会话不受影响。 使用 RSA 密钥交换的 TLS 1.2 会话正是攻击目标;具备前向保密的 ECDHE 会话无法用这种方式解密。
- 换一张证书就解决了。 只有新私钥不再与开启 SSLv2 的主机共用时才有效,根本办法是禁用 SSLv2。