霞之彼端

🚀 善国峻的个人站点 🌏

0%

SSL/TLS v1.0~v1.3 各版本的区别与改进

TLS 简介

传输层安全性协议(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议,主要用于用于在两个通信应用程序之间提供保密性和数据完整性。它的前身是安全套接字协议(Secure Sockets Layer,SSL)。

1999 年,由 IETF 将 SSL 进行标准化,并于年公布第一版 TLS 标准文件。目前,TLS 已经发展到 1.3 版本,且仍然是互联网上主流的保密通信工业标准。

SSL 与 TLS 的关系

SSL 是 TLS 的前身。

SSL 是位于可靠的面向面接的网络层协议和应用层协议之间的一种协议层。SSL 通过相互认证、使用数字签名保证完整性、使用加密算法保证私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL 记录协议和 SSL 握手协议。

SSL 核心作用:

  • 保密性(加密算法)
  • 完整性(MAC)
  • 身份认证(CA 证书)

而 TLS 可以理解为 SSL 协议的补充版本和官方版本。TLS 也写入了 RFC 中。

TLS 密码组

TLS 大致是由 3 个组件拼成的:

  • 对称加密传输组件,例如 AES-128-GCM(这几个例子都是当前2015年最主流的选择)
  • 认证密钥协商组件,例如 RSA-ECDHE
  • 密钥扩展组件,例如 TLS-PRF-SHA256

这些组件可以再拆分为 5 类算法,在 TLS 中,这 5 类算法组合在一起,称为一个 CipherSuite(密码组):

  • authentication(认证算法)
  • encryption(加密算法 )
  • message authentication code(消息认证码算法 简称 MAC)
  • key exchange(密钥交换算法)
  • key derivation function(密钥生成算法)

TLS 协议设计之初就考虑到了这每一类算法的演变,所以没有定死算法,而是设计了一个算法协商过程,来允许加入新的算法,可以说是软件可扩展性设计的典范。

尽管 1.1 版本较 1.0 版本做了一些改进,但 1.1 版本依旧不支持一些更强的密码套件,还在使用一些已经被发现存在致命漏洞的算法。这也导致了 2018 年 1.0 和 1.1 版本一起退出了历史舞台。

各版本算法的改进

1.0 -> 1.1

在分组密码的模式(CBC)中增加了初始化向量(IV)

在 1.0 版本中并没有 IV 字段,CBC 模式中的剩余部分(residue)和掩模(mask)是相同的。在 1.1 中增加了 IV 字段以防止 CBC 攻击(即针对 CBC 的自适应选择明文攻击)。

改进填充错误处理

将填充错误视为错误的消息验证代码,而不是解密失败。使用 bad_record_mac 警报而不是 decryption_failed 警报来防止 CBC 攻击。

由 IANA 来协调管理密码组

互联网数字分配机构(The Internet Assigned Numbers Authority,IANA)是负责协调一些使 Internet 正常运作的机构。同时,由于 Internet 已经成为一个全球范围的不受集权控制的全球网络,为了使网络在全球范围内协调,存在对互联网一些关键的部分达成技术共识的需要,而这就是 IANA 的任务。

1.1 -> 1.2

删除了 IDEA 和 DES 密码套件

随着计算机算力的加强,两种加密算法已经多次被分布式计算攻破。

伪随机函数(PRF)中的 MD5/SHA-1 组合的方式被替换为 P_SHA256

MD5/SHA-1 已不再安全。这提高了哈希函数的安全性。SHA-1 也存在被用于 SLOTH 攻击的风险。

添加了使用关联数据(AEAD)加密套件进行身份验证的加密

Authenticated Encryption with Associated Data(AEAD)是一种同时具备保密性,完整性和可认证性的加密形式。简单来说,其主要是在单纯的加密算法之上,加上一层验证手段,来确认解密步骤是否正确。常见的 AEAD 算法有 AES-128-GCM(主要是桌面和服务器)、ChaCha20-IETF-Poly1305(主要是移动设备)。

1.2 -> 1.3

删去了 CBC 模式和 RC4

在 TLS 不长的生命期内, CBC 模式和 RC4 算法都爆出了很多致命漏洞。比较典型的有 CBC 的 Lucky Thirteen 攻击和 RC4 在理论上也可存在单字节差分攻击和双字节差分攻击的风险。

删去了静态 RSA 和 Diffie-Hellman 密码套件

RSA/DH 密钥交换缺陷和会话恢复的缺陷被证明可用于三次握手攻击。此外,RSA 不支持前向安全性,其本身也爆出过不少漏洞,比如 POODLE 攻击和 Bleichenbacher 攻击。而 Diffie-Hellman 密码套件曾出现过 CVE-2016-0701 漏洞。

增加了 0-RTT 模式,使用新的密钥交换暨身份认证机制 PSK

以某些安全属性为代价,为某些应用程序数据节省了连接设置的往返时间。

ServerHello 之后的所有握手消息现在都已加密

新引入的 EncryptedExtension 消息允许在 ServerHello 中明确发送的各种扩展,同时享受机密性保护。

重新设计了密钥派生函数

使用基于 HMAC 的 HKDF 算法来取代 PRF。由于新的设计具有密钥分离特性,密码学家能够更轻松地对算法进行分析。

设计了一个新的握手协议

新的握手状态机经过重大调整,可以更加一致,并可以删除多余的消息。

将椭圆曲线算法纳入基本算法

并且加入了新的椭圆曲线签名算法,例如 ED25519 和 ED448。

TLS 使用过的算法曾出现过的部分漏洞

利用协议的兼容性

降级弹性

降级攻击是攻击者使用一些策略,让服务器和客户端采用比较弱的协议或者加密方式的一种攻击。类似于 TLS,SSH,IPsec 和 ZRTP 之类的密钥交换协议是高度可配置的,能够支持多种版本的协议,加密算法和参数等。这也是为了让协议能够具有更好的应用范围,所具备的兼容性使得在两个对等体之间实际执行的密钥交换取决于嵌入在交换中的协商阶段。在确保实际的协议实现方面,兼容性已被证明其重要性。但是对算法兼容性的支持为降级攻击提供了机会,在这种攻击中,主动网络攻击者干扰协商,使对方降级使用较旧的协议版本从而使用较弱的密码模式。

CBC

Lucky Thirteen 攻击

利用填充的不确定性,攻击者能够通过修改填充的内容来进行测试。攻击者作为中间人拦截 TLS 数据包,并对数据包进行篡改,通过修改填充字节并观察服务器做出的响应和响应时间,从而提取相关信息,判断修改的内容是否正确。

RSA

POODLE 攻击

如果对填充内容不做限定,那么CBC会暴露出巨大的漏洞。而 POODLE 攻击在此漏洞基础上利用了填充的最后一个字节固定为填充长度的特性,从而进一步扩大了 CBC 的漏洞。造成 POODLE 攻击的根本原因是 CBC 模式在设计上的缺陷,CBC 只对明文进行了身份验证,而没有对填充字节部分进行完整性验证。TLS 1.0 (SSL 3.0) 在填充方式上是保留密文的最后一字节,填写为填充的长度。但是,规范中没有规定的填充的具体数据内容,也没有被 MAC 验证,所以就没有规则来确认填充的内容是否被篡改过,只能验证填充的长度是否正确。攻击的主要思路是攻击者针对较大的的 URL 和较小的请求体,通过缩短 URL,每次一个字节,直到找到正确填充长度。通过提交足够多次的修改来破解一个字节,最后同步修改URL内容和请求体的大小并循环破解剩余部分。

Bleichenbacher 攻击

默认情况下,在建立通信之后,服务器会保存会话密钥副本,以便后续用来识别每个客户端。但由于 RSA 算法并不安全,如果会话密钥通过 RSA 算法加密,而填充系统为 PKCS #1 1.5,攻击者可简单将随机会话密钥发送给 TLS 服务器,并询问是否有效,TLS 服务器将会以简单的 “是” 或 “否” 给出回应。这意味着攻击者可通过简单的暴力破解攻击猜测这个会话密钥,并解密在TLS(HTTPS)服务器和客户端(浏览器)之间交换的所有 HTTPS 消息。

DROWN 攻击

Bleichenbacher 攻击进一步升级。根据 Bardou 发表的论文,Bleichenbacher 攻击需要大约百万级以上的查询次数。而 DROWN 攻击则利用了一些特殊的攻击技巧来提升攻击效率,使用 Trimmer 来剪切截获的经过 RSA 加密的明文信息,然后精心构造 00|02|PS|00| 密文消息的结构。之后利用 SSL 协议的出口协议来弱化会话密钥,攻击者将截断会话密钥至 5 字节。然后进行 Oracle 查询,一旦成功查询,便可以对成功篡改的密文做多次平移操作,从而对未知长明文消息做分段攻击。最后将各个小段的解密信息组合起来,构成解密明文信息。

RC4

单字节偏差攻击

通过统计分析、贝叶斯分析等方法发现,密钥流中的第二字节倾向于为 0 的概率比一般情况要高,为 1/128 而不是正常的 1/256 。这种类型的偏差在密码学中是极其危险的,只要知道了 RC4 密钥流中的第二字节倾向于 0,那么就能够知道经过加密的密文的第二字节。

双字节偏差攻击

除了单字节偏差,在 RC4 流中还发现了存在多字节偏差。与单字节偏移相反,大多数所识别的多字节偏移不是单一位置,而是以规则间隔周期性连续出现在加密流中。虽然目前对于在 TLS 中使用 RC4 加密的攻击还没达到实际可被利用的程度,但是被利用的可能性的存在还是不得不让 TLS 的设计人员考虑废除 RC4 算法的使用。

密钥交换缺陷和会话恢复

三次握手攻击

三次握手攻击主要是利用 TLS 协议的 RSA/DH 密钥交换缺陷和会话恢复的缺陷来绕过防护措施。三次握手攻击在实际进行的时候需要利用恶意网站进行中间人攻击。

客户端把自己生成的预主密钥和随机值发送给恶意网站,而恶意网站作为正常的接受方,可以通过正常方式解密客户端的预主密钥。然后恶意网站再与目标服务器发送请求,建立新的连接,并使用从客户端接收到预主密钥和随机值,并把服务器端的随机值转发给客户端。当握手过程结束的时候,恶意网站就拥有了和客户端,服务器相同的主密钥,并分别和客户端,服务器建立了连接。但是由于两个连接使用的证书是不一样的,而且每个连接都拥有不同的 verify_data 值。这就需要利用会话恢复的机制来进行下一步的破解。在会话恢复的时候,不要求进行证书的验证,也没有身份的验证。而仅仅通过主密钥进行通讯双方的身份认证,从而导致在握手结束的时候,Finished 消息将一致,verify_data 相同。这时攻击者再发起重协商,利用客户端的证书伪造自己的身份,从而控制两边的连接,发送任意修改的数据内容。从而完成攻击。

这个攻击攻破了所谓安全的 TLS 连接,警醒设计者对协议的重新设计思考。作者也提出一些比较可靠的解决方案,如禁用重协商,只启用 ECDHE 加密套件和对所有网站都要求验证客户端证书等,但是每种解决方案都有一定的适用范围。

SHA-1

TLS 1.0 和 1.1 的完整性都依赖于交换消息运行的 SHA-1 散列。这使得能够执行 2772^{77} 操作的攻击者对握手执行降级攻击成为可能,大大低于可接受的现代安全阈值。

类似地,握手的身份验证依赖于使用 SHA-1 散列或 MD-5 和 SHA-1 散列的不强连接所生成的签名,这允许攻击者在服务器能够破坏严重削弱的 SHA-1 散列时模拟服务器。

无论是 TLS 1.0 还是 1.1,都不允许对等方在 ServerKeyExchange 或 CertificateVerify 消息中为签名选择一个更强的散列,从而使惟一的升级路径使用一个新的协议版本。

SLOTH 攻击

SLOTH(security losses from obsolete and truncated transcrip thashes)是攻击者迫使使用弱哈希算法,如客户端 TLS 1.2 版本可以利用 MD5 进行降级攻击。在握手的初期,客户端将 ClientHello 数据包发生给服务器;数据包中声明了服务器可以使用的签名和加密算法。然而,攻击者可以截获该数据包,并且向客户端发送一个要求更改算法的数据包,迫使客户端接受。至此,攻击者就开始了冒充目标服务器的攻击过程。位于客户端和服务器端之间的攻击者通过发送 ServerHello 、Certificate 和 ServerKeyExchange 数据包响应客户端请求。在 Server Key Exchange 中,攻击者使用 RSA-MD5 算法替换客户端实际指定的算法。客户端接收到“服务器端”的响应,并最终使用弱哈希算法。随后,客户端再次发送 Client Key Exchange 响应,握手成功。TLS被降级后,中间人攻击者就可以冒充服务器,解密所有加密的流量。SLOTH 也可以反向进行,导致服务器端被使用 MD5 降级攻击。针对这个攻击,最好的方案是在 TLS 1.2 后的版本中删除 MD5/SHA-1 等弱哈希算法的支持,当然对于 SSH 和 VPN 也需要进行同样的更改。


  • RFC:TLS 1.0
  • RFC:TLS 1.1
  • RFC:TLS 1.2
  • RFC:TLS 1.3
  • RFC: 弃用 TLS 1.0 & 1.1 的原因
  • SSL/TLS的近年相关攻击研究综述(一)
  • SSL/TLS的近年相关攻击研究综述(二)
  • 本文作者: 善国峻
  • 联系邮箱: me@ohmysites.com
  • 本文链接: https://www.ohmysites.com/archives/14/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!