Sweet32 (CVE-2016-2183)
定义
Sweet32 是 2016 年公布的生日攻击(CVE-2016-2183),针对 3DES 等 64 位分组密码的 CBC 模式,可从超长连接中还原 Cookie 等秘密。
Sweet32 由 Karthikeyan Bhargavan 和 Gaëtan Leurent 于 2016 年公布。分组长度为 64 位的密码,主要是 3DES 和 Blowfish,在 CBC 模式下按生日界大约加密 2^32 个分组(约 32 GB 数据)后就会开始出现密文块碰撞。一次碰撞会暴露两个明文块的异或值;如果其中一个已知、另一个包含反复出现的秘密(如 Cookie),攻击者就能把秘密还原出来。研究者通过保持单条连接并持续制造大量请求,分别演示了对使用 3DES 的 HTTPS 和使用 Blowfish 的 OpenVPN 的攻击。
为什么重要
攻击需要在一条连接上产生海量流量,实施并不容易,但它证明了 64 位分组密码已不适合今天的数据量。此后浏览器和 TLS 库的默认配置都逐步淘汰了 3DES,TLS 1.3 只允许 AEAD 算法,例如 AES-GCM 和 ChaCha20-Poly1305。服务器端的实际修复,就是把所有 3DES 套件(如 TLS_RSA_WITH_3DES_EDE_CBC_SHA)从密码套件列表中删掉。漏洞扫描或安全测评报告里出现 SWEET32 或 CVE-2016-2183 时,处理方式也是如此;Windows 服务器则需要在系统的密码套件设置中禁用 3DES。
例子
nmap --script ssl-enum-ciphers -p 443 example.com | grep -i 3des
没有输出说明未提供 3DES 套件。一个不含 3DES 的 Nginx 套件列表示例:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
常见误区
- 3DES 密钥够长,所以安全。 Sweet32 攻击的不是密钥,而是 64 位的分组长度,密钥再长也无济于事。
- Sweet32 能很快解密任何 3DES 连接。 它需要在单条连接上传输几十 GB 甚至更多数据;结论是淘汰 64 位分组密码,而不是所有短连接都已暴露。
- 去掉 3DES 会让现代客户端连不上。 当前所有浏览器都支持 AES-GCM 或 ChaCha20-Poly1305,只有非常老的客户端依赖 3DES。