2014年10月14日,击信Google安全团队扔出一颗炸弹:SSL 3.0协议存在一个致命设计缺陷,息泄形成能让攻击者在加密信道里逐字节窃取cookie或密码。露漏这个漏洞被命名为POODLE,击信全称是息泄形成Padding Oracle On Downgraded Legacy Encryption。名字绕口,露漏但攻击逻辑直白得可怕——它利用的击信不是某个程序员写错一行代码,而是息泄形成SSL 3.0协议本身对填充字节的校验规则。
要理解这个漏洞怎么形成,露漏得先回到1996年。击信那年Netscape发布了SSL 3.0,息泄形成当时互联网还处于拨号时代,露漏加密算法普遍只有56位密钥强度。击信协议设计者为了兼容性,息泄形成在CBC模式(密码分组链接)的露漏填充校验上留了个口子:如果解密后的填充数据不符合规范,服务器只返回一个通用的“坏记录”错误,不区分是填充错误还是MAC校验失败。这个看似无关紧要的细节,二十年后成了致命伤。
攻击者要利用这个口子,得先让客户端和服务器都降级到SSL 3.0。这并不难——只要在客户端和服务器之间的网络路径上注入一个TCP重置包,很多老旧的浏览器或服务器就会自动尝试更低版本的协议。一旦双方都退回到SSL 3.0,攻击者就开始扮演中间人,截获加密流量,然后篡改数据块。
具体攻击过程像拆盲盒。攻击者把密文块C[n]复制到C[n+1]的位置,然后修改C[n]的最后一个字节,再把这个改动后的密文发给服务器。服务器解密后,如果填充字节恰好合法(比如最后一个字节是0x00或0x01),就会继续处理并返回不同的响应;如果不合法,就返回错误。这个响应的差异,就是攻击者的“神谕”——通过反复修改最后一个字节并观察服务器反应,攻击者能像猜密码锁一样,逐字节还原出明文内容。每猜一个字节平均只需要256次尝试,而HTTP cookie通常只有几十字节长,几分钟就能完整窃取。
为什么填充校验和MAC校验不能合并成一个错误提示就能防住?因为SSL 3.0的设计文档里明确写了:优先检查填充,填充合法才检查MAC。这个顺序本身没问题,问题在于填充检查失败和MAC检查失败返回的错误码完全一样——但攻击者恰恰利用这个“一样”来区分两种状态。如果协议设计时让MAC校验先于填充校验,或者用不同错误码区分失败类型,POODLE就不会存在。可惜1996年的设计者没预料到二十年后会有人用暴力枚举的方式去猜填充字节。
修复方案也很有意思。OpenSSL在2014年10月15日紧急发布补丁,直接禁用SSL 3.0默认支持。但很多老系统不能立刻升级,于是有人提出TLS_FALLBACK_SCSV机制——客户端明确告诉服务器“我不接受降级”,如果服务器还坚持用SSL 3.0,就直接断开。这个方案治标不治本,因为攻击者可以伪造客户端的降级请求,但至少堵住了大部分主动降级的路径。
回头看这个漏洞,最讽刺的是它源于一个“善意”的设计决策:为了让不支持新协议的旧设备能继续通信,SSL 3.0故意放宽了填充校验的严格性。这种宽容在1996年是合理的,但协议没有内置“过期机制”——当整个生态都升级到TLS 1.0以上时,SSL 3.0本应该被彻底废弃,却因为兼容性包袱一直苟延残喘到2014年。POODLE不是第一个因兼容性而生的漏洞,也不会是最后一个。它提醒每个协议设计者:宽容的校验规则,往往会在未来某个时刻变成攻击者手里的杠杆。
顶: 915踩: 5






评论专区