作者:Conrado Gouvêa
上周,又发布了一次攻击事件,该事件影响了用于互联网安全通信的 SSL/TLS 协议。它被称为 DROWN(“使用过时和弱化的加密解密 RSA”),是涉及 SSL 协议及其在 OpenSSL 库中的实现的一系列错误的结果。它允许破坏客户端和服务器之间的连接的机密性,即使使用协议的现代版本。如果服务器支持 SSLv2 并且存在某些缺陷,则该服务器很容易受到攻击。要了解这种攻击,首先需要了解 SSL 协议的历史。
SSL 的发展历程如下:
- SSLv2(1995年)
- SSLv3(1996年)
- TLSv1.0(1999年)
- TLSv1.1(2006年)
- TLSv1.2(2008年)
SSLv2 采用后不久,人们发现它完全不安全。该协议已被大幅修改,SSLv3 已修复其中许多缺陷。目前,没有理由使用 SSLv2。甚至装有 Internet Explorer 6.0 的 Windows XP 也已经能够使用 SSLv3(尽管存在问题,但并不像 SSLv2 那样完全不安全)。
理解 DROWN 所需的另一个要素是针对 RSA 加密版本 PKCS#1 v1.5 的填充预言攻击,该攻击由 Daniel Bleichenbacher 于 1998 年发现。使用 RSA 加密数据时,需要在加密消息之前添加“填充”。这种填充是一系列字节,可以防止一类重要的攻击;如果没有它,RSA 就会变得完全不安全。当解码消息时填充不正确时,实现会返回一些错误代码。填充预言攻击利用了这一事实。
填充预言攻击是致命的,原因如下:如果攻击者操纵加密消息,并且操纵的消息恰好具有正确的填充,则服务器将不会返回错误。这样,攻击者就会发现他所操纵的加密消息对应的消息具有正确的填充。通过使用不同的操作多次重复此操作,攻击者可以发现原始消息。
通过仔细实施(当存在无效填充时返回随机数据而不是报告错误)可以防止这种攻击。此保护已在 OpenSSL(包括 SSLv2)中实现。然而,正如我们将看到的,这还不够。
最后,为了理解 DROWN,必须记住 SSL 在使用 RSA 密钥协议时通常按如下方式操作:
- 客户端生成对称密钥;
- 客户端使用服务器的RSA公钥(使用PKCS#1 v1.5)加密此密钥并将其发送给服务器;
- 服务器解密(验证填充)并获取客户端选择的对称密钥,从而允许使用该密钥进行通信。
因此,多种因素共同导致了此次袭击:
SSLv2 具有可导出的加密套件。此类套房是应美国政府的要求,于 90 世纪 XNUMX 年代增设的。我们在 关于FREAK攻击的帖子.
- 由于此类导出套件的密钥很小(40 位),因此即使受到 OpenSSL 的保护,攻击者也有可能使用填充 oracle 攻击。为此,它使用导出套件和暴力攻击来发现加密消息的填充是否正确。
- OpenSSL 导出套件代码中的另一个缺陷使得填充预言机更加有效,从而允许实时进行攻击。
- 由于 OpenSSL 中存在一个错误,即使禁用 SSLv2 也可以使用 SSLv2 密码套件,从而增加了易受攻击的服务器数量。
- TLS/SSL 协议的最新版本仍然具有类似于 SSLv2 的结构(使用 RSA 密钥的对称密钥加密,但使用前向保密时除外)。这使得攻击者可以拦截使用 RSA 密钥加密的消息(对称密钥),并通过尝试连接到同一服务器(但使用 SSLv2 和拦截的加密消息)来利用填充 oracle 来破解它。
这样, 淹 是一种跨协议攻击:它通过拦截安全协议中的一段通信,并在不安全的协议中使用该段通信,从而破坏安全协议。在这种情况下, SSLv2.
还需要注意的是,许多服务器对多种服务使用相同的私钥。因此,例如,如果 Web 服务器配置正确并且不允许使用 SSLv2,则在支持 SSLv2 的邮件服务器上使用相同的密钥仍然可以破解。
DROWN 的通用版本允许在 8 小时内断开连接,计算成本为 440 美元。如上所述,特殊版本允许实时攻击。
作为开发人员或负责 SSL/TLS 服务器的人员:
- 将 OpenSSL 更新至 1.0.1s 或 1.0.2g
- 禁用 SSLv2(如果可能,也禁用 SSLv3)
作为开发人员或 SSL/TLS 客户端管理员,或者作为最终用户:
- 没有什么可以做的:攻击只依赖于易受攻击的服务器。