术语表

CRIME (Compression Ratio Info-leak Made Easy)

最后核实

定义

CRIME 是 2012 年公布的攻击(CVE-2012-4929),通过观察 TLS 层压缩对密文长度的影响,从加密连接中还原 Cookie 等秘密。

CRIME 由提出 BEAST 的 Juliano Rizzo 和 Thai Duong 于 2012 年公布。TLS 在加密前先压缩数据时(TLS 1.2 及更早版本可以协商 DEFLATE 压缩),每条加密记录的长度取决于内容的压缩效果。攻击者若能让浏览器发送包含自选文本、且与秘密(例如同一组请求头里的 Cookie)放在一起的请求,并能观察加密后的长度,就可以逐字节猜测秘密:猜对时内容出现重复,压缩后会略短一点。SPDY 的头部压缩也存在同样的问题。

为什么重要

应对方式很直接:浏览器关闭了 TLS 压缩,服务器端的库随后跟进,TLS 1.3 则彻底取消了压缩。HTTP/2 用 HPACK 取代了 SPDY 的头部压缩,HPACK 在设计时就考虑了这种攻击。它留下的教训是:把秘密和攻击者可控的数据一起压缩再加密,长度本身就会泄露信息。2013 年的 BREACH 把同样的思路用到了 HTTP 响应压缩(如 gzip)上,这无法靠 TLS 配置解决,需要在应用层缓解,例如每次请求对 CSRF token 做随机掩码,或不压缩那些同时反射用户输入和包含秘密的响应。

例子

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | grep -i '^Compression'
# Compression: NONE

常见误区

  • 在 Nginx 里关掉 gzip 就能修复 CRIME。 CRIME 针对的是 TLS 层压缩,现行的库早已禁用;gzip 关系到的是另一种攻击 BREACH。
  • 因为 CRIME 应该避免使用 HTTP/2。 HTTP/2 的 HPACK 头部压缩在设计时就专门防范了这类攻击。
  • 加密会隐藏数据的大小。 TLS 隐藏的是内容而不是长度,CRIME 和 BREACH 利用的正是这一点。

延伸阅读