OpenSSL是实现用于Web认证的SSL / TLS协议的流行通用加密库,最近遭受了几个漏洞。例如CVE-2017-3731:截断数据包可能导致OpenSSL中的拒绝服务和SSL死亡警报(CVE-2016-8610)可能导致OpenSSL服务器的拒绝服务。现在探讨另一个高度严重的错误CVE-2017-3733,Encrypt-Then-MAC重新协商崩溃可能导致拒绝服务。
在SSL / TLS加密数据之前,它运行握手和ChangeCipherSpec协议。在握手阶段,客户端和服务器决定使用哪些加密算法。一旦协商完成,客户端和服务器就会发送一个ChangedCipherSpec消息,之后通过协商的算法对流量进行加密。
加密数据以SSL / TLS中的消息认证码(MAC)的两种方式之一发送。
1. MAC-then-encrypt:该方法计算纯文本的MAC,并将其与纯文本进行连接,并在其上运行加密算法。
2. Encrypt-then-MAC:密文通过加密明文生成,然后附加加密明文的MAC。
如果ClientHello消息不包含Encrypt-Then-Mac扩展名,则默认值为MAC-then-encryption模式,如果ClientHello具有Encrypt-Then-Mac扩展名,服务器将在加密数据后计算MAC。
如果客户端或服务器希望更改用于加密的算法,则可以重新协商他们已经同意的Cipher_Suites。这可以通过发起新的握手在数据传输期间发生,这种情况发生在现有的SSL连接上
触发漏洞
OpenSSL提供了这个解释:
如果Encrypt-Then-Mac扩展名在原始握手中不协调(或反之亦然),则在重新协商握手过程中,这可能导致OpenSSL崩溃(取决于密码)。客户端和服务器都受到影响。“
说客户端使用默认的MAC-then-encryption模式与服务器启动TLS握手。如果客户端稍后重新协商启用了Encrypt-then-MAC扩展,并在ChangeCipherSpec消息之前以该模式发送加密数据,则服务器将崩溃,导致拒绝服务。
当客户端触发此漏洞时,服务器会在ssl3_get_record函数的ssl3_record.c文件中崩溃:
崩溃发生在352行当检查mac_size是否小于EVP_MAX_MD_SIZE(64字节)时:
在if函数中会检查是否在服务器中设置了Encrypt-then-MAC标志。if条件中的宏:
在重新协商时使用Encrypt-then-MAC扩展名发送ClientHello数据包时,TLS1_FLAGS_ECRYPT_THEN_MAC标志已被设置。所以控制将进入if条件。但是由于ChangeCipherSpec消息尚未传递给服务器,因此不知道它必须使用Encrypt-then-MAC。
在行号上设一个断点352和检查mac_size变量显示值0xffffffff,大于EVP_MAX_MD_SIZE(64)。因此if条件失败,服务器崩溃。
我们来看看代码,找到mac_size变量如何获取值0xffffffff。EVP_MD_CTX_size函数计算mac_size。
当消息摘要值为null时,返回-1。0xffffffff是-1的二进制补码。这意味着“s-> read_hash”返回null,因为服务器尝试使用MAC-then-encrypt模式计算哈希。
提示所有管理员应将OpenSSL更新为最新版本。
参考来源:https://securingtomorrow.mcafee.com/mcafee-labs/vulnerable-openssl-handshake-renegotiation-can-trigger-denial-service/,信息安全实验室小编翻译整理,转载请注明来自CFCA信息安全实验室