SSLv3 POODLE 攻击分析
攻击场景:
(攻击场景有点苛刻!)
如A和C通信,攻击者需作为中间人B,B还得可以通过JS脚本操作A发送SSL3的请求(B可以是一个基于JS的代理请求),并可以窃取A发送到C的SSL密文。然后通过CBC模式的Padding Oracle攻击还原加密中的cookie。
攻击原理:
CBC解密过程为:(图片转自wiki)
SSLv3是采用末尾填充机制,块大小一般8字节或者16字节,最后一个块为填充块。且SSLv3没有规定padding填充块字节的内容,只校验填充块最后一个字节。
我们以8字节为例:
假设密文块为:
C0,C1,C2 ... Cn
解密为:
P1,P2,P3 .. Pn
最后一个填充块填充数据为:*******7
则服务器解密后会检测Pn末尾字节是否为7。
攻击者利用这个原理,把密文块中任意一块Ci 覆盖最后一个填充块 Cn ,发送到服务器检测最后一个字节是否为7,只要服务器检测成功,就可以通过如下公式,反推出Ci 块最后一个字节的明文。
=======================
证明如下:(Ci 覆盖 Cn)
Pn [7] = Dk (Ci[7] ) xor Cn-1[7] = 7
推出:
Dk(Ci[7]) = Pi[7] xor Cn-1[7] = 7 xor Cn-1[7]
则:
Pi[7] = Dk(Ci[7]) xor Ci-1[7] = 7 xor Cn-1[7] xor Ci-1[7]
因为作为中间人,C1,C2...Cn所有密文攻击者是知道的,则可得Pi[7]这个字节的明文。
========================
为了解密cookie,攻击者B需要能控制A发送构造HTTP请求,满足:
(1)Padding是填充后面一整个块
(2)要解密的cookie字节刚好在Ci块的最后一个字节
然后劫持A发送到B的SSL密文,把Ci 块覆盖到 Cn 块,发送到服务器,一般来说有1/256概率服务器会验证通过。
接下来,因为解密窗口只有一个,攻击者要做的就是构造HTTP请求路径长度,如 GET / ,GET/a,GET/aa ... 把需要解密的字节顶到解密窗口,每次解密一个字节需要发送256个请求。
参考:
(1)https://www.imperialviolet.org/2014/10/14/poodle.html
(2)http://googleonlinesecurity.blogspot.nl/2014/10/this-poodle-bites-exploiting-ssl-30.html
(3)https://www.openssl.org/~bodo/ssl-poodle.pdf