最近,根据某国际安全小组的研究表明,金融巨头Visa旗下部分受HTTPS保护的网站最近被发现了一种漏洞,它的存在可以让黑客注入恶意代码,访客浏览器将会访问到恶意内容。
据统计,受影响一共有184台服务器,其中部分属于德国证券交易所(Deutsche Börse)和波兰银行协会(Zwizek Banków Polskich),它们被发现容易受到某加密技术漏洞的攻击,我们称之为“Forbidden Attack”。此外,还有7万台web服务器被发现存在风险,虽然实际执行攻击会比较困难。这些数据来自于1月份的全网扫描,当时Deutsche Börse就修补了这个漏洞。但是在上周三的时候,研究人员发现Visa和Zwizek Banków Polskich的漏洞似乎仍然存在,而且官方并没有回复安全研究员私下 提交 的漏洞信息。
该漏洞源于不正确的 传输层安全协议 ,在数据被加密时,错误重用了相同的 加密随机数 。TLS的规范其实已经写明,这些数据只能使用一次,当多次重用时,则会导致 Forbidden Attack 。这种攻击能让黑客自行生成密钥去认证网站内容。这个漏洞利用的首次提交,是 以评论的形式写给国家标准技术研究所的 。之所以叫这个名字,是因为其正确加密的基本原则,是必须临时而独特的。
在TLS握手中,那184台HTTPS服务重复使用了客户端浏览器首次连接到HTTPS网站的那个随机数,违背了加密的基本原则。因此,黑客只要有能力监控连接传输的内容,比如处于同一个不安全的wifi环境下,他们就可以将恶意内容注入到传输数据流里,而客户端浏览器并不能检查出任何差错。
研究人员在一篇名为《 忽视随机数的恶果:TLS GCM实战伪造内容攻击 》的paper中写道:“这是可靠性验证的失败,即使只在同一个时间段里重用一个随机数,也能让黑客通过HTTPS进行伪造内容攻击。”这项研究的结果,也将作为 8月份拉斯维加斯黑帽的大会某议题 的基础材料。
黑客污染HTTPS认证过的内容的中间人攻击,已经击破了TLS的基本保证。黑客可以绕过保护,添加恶意JS代码或者添加能诱惑访客输入密码、社会安全码或者其他敏感数据的WEB内容。虽然这个漏洞让Forbidden Attack很好的文档规范化了,新的研究结果仍值得我们注意如何利用它去对抗HTTPS保护的网站,网上也有相应的 POC代码 。
下面则是一段演示视频:
https://www.youtube.com/watch?v=qByIrRigmyo
这篇paper是由研究人员Hanno Böck、Aaron Zauner、Sean Devlin、 Juraj Somorovsky、and Philipp Jovanovic共同撰写,里面警告我们网上约7万HTTPS服务器,可能会因为伪随机数算法生成的“随机数”而遭受这类攻击。只要有足够多的WEB请求,黑客就有很大可能性去重用其中一个来执行攻击。然而这样所需WEB请求的数量是比较大的,约 2的30次方 个请求里取得重复随机数的可能性为3%, 2的35次方个请求 后能100%成功。正如paper的标题所述,Forbidden Attack针对的是AES-GCM,世界上最广泛的TLS对称加密协议。
在研究人员发现的7万站点中,黑客需要往WEB连接里填充TB级别的数据,从而创建足够多的请求。因此,这种攻击的理论性可能会高于实际意义。但是,这仍然被大多数运用HTTPS保护的组织当作不可接受的风险。研究人员目前确定了几个TLS实例中生成了伪随机数,其中有IBM的DominoWEB服务器,已于 3月打上了补丁 。还有个Radware的负载均衡器的案例,也 已经修复 了。
自研究人员发布扫描结果后,许多漏洞网站已经修复了。但是只有工程师们深刻意识到这个问题,事情才能显著改善,这也是研究人员发布这篇paper的原因。
Zauner 在邮件中写道,“我敢肯定一年以后我再去扫描一遍,还是会有很多的漏洞案例。可能还有更多方法可以利用它,谁知道呢?”
那么,像GCM或者类似CTR模式的CCM,为什么不能在发送的信息中进行随机数重用呢?下面我们将就GCM的工作机制进行解释一番:
当使用AES GCM时,我们并不会运行AES加密的数据。而我们会使用AES去加密标志自增计数器创建的各区块,这就造就了不可预知的比特流(密钥数据流)。然后,我们会用需要加密的数据流与之进行XOR运算。而最初的计数区块,就是用来与其他加密文本一起生成身份验证标记的。
如果我们单独看AES加密算法,可以知道用相同的密钥去加密相同的数据,是会得到相同的加密文本的,这也是我们为啥需要CBC模式下的IV。那么我们在GCM里面重用相同的随机数会发生什么呢?
假设有两个不同的消息A和B,我们如果在其中使用了同一随机数 N,这些消息的第一个区块会被这样加密:
Cᴬ₁ = AES(counter(N,1)) ⊕ A₁ Cᴮ₁ = AES(counter(N,1)) ⊕ B₁
这基本上意味着,我们如果使用相同计数器和相同的随机数去XOR两个加密的区块,会得到XOR的文本:
Cᴬ₁ ⊕ Cᴮ₁ = B₁ ⊕ A₁
如果我们知道其中一个纯文本,我就可以用加密文本与之XOR,从而得到密钥数据流。最后,我们就能解密另一段使用同样的密钥和随机数加密的文本了(这点受限于已知文本长度)。
*参考来源: AR 、 BS ,FB小编dawner编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)