2,222 views

SSL/TLS协议的演化 12–安全问题 – CRIME和BREACH缺陷

image

CRIME是“Compression Ratio Info-leak Made Easy”的缩写。BREACH是Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext的缩写。又是一对故意拼凑的名字。前者缩写后是英文“犯罪”的意思,后者是“违背,违反”的意思。

CRIME是BREACH的基础,也是由前文BEAST, POODLE攻击的发现者,Google的研究人员最先搞出来的。Google这几个好基友算是把SSL这口井深挖,然后榨干了。由于他们的研究结果都是新的攻击机制,注定名垂青史。

1.准备知识 –  压缩算法

CRIME攻击和压缩算法相关,需要事先理解。数据压缩也是一个艰深的课题,书店里也翻过压缩算法的厚厚专著。现在手机下载一部两个小时的大片,只需一百几十兆的存储,就是压缩算法最大的功劳。不过这一定是有损压缩。在HTTP中用到的压缩都是无损的。

1.1 概念辨析

有关HTTP压缩,有几个容易搞晕的术语:zlib压缩格式,gzip压缩格式和deflate压缩算法。这几个概念分别定义在RFC1950,1951到1952之中,先辨析清楚。

image

上图是GZIP文件格式,可以看出,GZIP就是在DEFLATE压缩格式的基础上包装了一下。

image

上图是RFC1950中定义的zlib压缩格式,也是在deflate压缩数据基础上打了一个包。

综上可见,DEFLATE是压缩算法,zlib格式和gzip格式是一个层次的,都是在deflate算法基础上的简单封装,属于压缩封装机制。这两种机制都是可以扩展的,但是这几个RFC都仅支持DEFLATE一种算法。

1.2 DEFLATE压缩算法

然后再看DEFLATE工作原理。DEFLATE其实是LZ77压缩算法和哈夫曼编码的组合算法。对于待压缩数据,首先进行使用LZ77压缩,然后使用哈夫曼树编码。哈夫曼编码都学过,容易理解,这里仅仅描述LZ77算法。

image

【gzip原理与实现】有详细的实现分析,总结为上图,基于输入待数据流对于LZ77算法做一个注解,其中有几个关键点。

1.算法维护一个滑动窗口,通常是32K,冗余字串的消除要在这个前向的滑动窗口范围内进行。

2.冗余串匹配算法是Lazy match的算法,针对上图红圈内部的数据。

下面是其中一个例子:

A)初始串如下

0abc bcde abcde ,假设现在匹配到第8字节‘a’,这个时候a是上图红圈起始位置。

B)匹配到10字节的时候得到冗余串abc

0abc bcde [abc]de

C)但是如果从第9字节匹配可以得到如下更长的冗余结果

0abc bcde a[bcde]

因此C步骤会一直进行下去,直到最后找不到符合最小匹配长度的冗余串,则Lazy Match算法结束。

3.完成Lazy match后,会选出匹配阶段找到的红圈范围内最长的冗余字串,将这个字串替换为<distance, length>二元组。其中distance为选定串和上一个冗余串的距离,length是串的长度。

Lazy算法有最小匹配长度这个限制,如果没有这个限定,对于长度为1的冗余字串编码后的<distance, length>二元组比被替换的串长度还要长,则压缩没有意义。这个最小匹配长度的极值就是这样计算的,具体长度和<distance, length>编码长度有关。

 

2.CRIME攻击原理

2.1攻击原理

【CRIME】抽象了如下的攻击本质,即观察下面的表达式的变化:

“len(encrypt(compress(input + public + secret)))”

input     黑客可以控制的部分,例如URL参数

public    黑客无法控制的header部分,例如Agent。

Secret  “cookie=abcdefgh”之类的想要偷窃的信息。

因为public部分攻击过程中不会变化,encrypty部分并不影响压缩后的长度,因此表达式可以做如下简化:

“len(compress(input + secret))”

回忆前面的LZ77算法,如果黑客控制input部分(例如URL参数),使得部分输入和secret部分有重合,压缩算法就会把冗余部分取出来。通过控制重合部分的长度就可以影响压缩后的长度。因为LZ77算法的Lazy Match进行压缩最长的冗余串。

我们无法看到密文,这个冗余多少的控制也是靠选择明文尝试出来的。

例如,假设cookie的内容如下“cookie=abcdefg”

首先注入参数“cookie=*”,来猜测第一字节,直到“*”为a的时候,冗余部分从的“cookie=”变成了“cookie=a”,这样压缩后的信息长度减小了。然后再猜测“cookie=a*”,以此类推。

2.2什么样的协议会被攻击?

在Application层有如下压缩实现方式:

1.SPDY头部压缩

前面HTTP/2系列介绍了SPDY的HTTP首部压缩,也使用DEFLATE,可以被CRIME攻击。只能disable首部压缩。

2.HTTP Response的GZIP压缩,针对Body

压缩不涉及Cookie部分,不被攻击。

3.TLS压缩

压缩整个HTTP报文,因为涉及HTTP头部,可以被CRIME攻击。只能disable压缩。

 

3.BREACH攻击是什么?

攻击描述在【BREACH】里面,但是语焉不详。攻击原理和CRIME一样,因此并列在一起。上一节提到,如果TLS仅仅使能HTTP压缩,则只有HTTP body被压缩,攻击者无法猜测cookie,但是body本身呢?

BREACH就是猜测body的,其攻击的原理是:

1.用户输入会反映到server的response里面。

2.Server回来的response带有敏感信息,例如信用卡号等。

这样可以通过控制用户输入,观察response大小恢复response携带的明文。

 

因为HTTP的头部和Body都包括有价值的信息,我们只好禁用HTTP相关的各个层面的压缩了:-(

 

【参考】

1.CRIME – https://docs.google.com/presentation/d/11eBmGiHbYcHR9gL5nDyZChu_-lCa2GizeuOfaLU2HOU/edit#slide=id.g1d134dff_1_222

2.RFC 1590 – ZLIB Compressed Data Format Specification version 3.3

3.RFC 1591 – DEFLATE Compressed Data Format Specification version 1.3

4.RFC 1592 – GZIP file format specification version 4.3

5.gzip原理与实现 – http://staff.ustc.edu.cn/~yuzhang/ds/gzip/gzip_principle.htm

6.BREACH – https://media.blackhat.com/us-13/US-13-Prado-SSL-Gone-in-30-seconds-A-BREACH-beyond-CRIME-Slides.pdf

发表评论

电子邮件地址不会被公开。 必填项已用*标注