CVE-2014-0160_OpenSSL心脏滴血漏洞

Catalogue
  1. 1. 漏洞触发
  2. 2. 攻击流程示例
  3. 3. 检测思路
  4. 4. 判断总结

​ OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议。OpenSSL 1.0.1中的TLS和DTLS在实现上没有严格处理Heartbeat扩展包,心跳处理逻辑没有检测心跳包中的长度字段是否和后续的数据字段相符合,用此漏洞攻击者可以通过特制的数据包触发缓冲区溢出读操作,获得通信中的敏感信息。允许攻击者从内存中读取多达64KB的数据。

漏洞触发

​ OpenSSL心脏滴血(CVE-2014-0160),存在于含有心跳扩展机制的TLS版本:TLSv1.0(0x0301),TLSv1.1(0x0302),TLSv1.2(0x0303)三种版本中。

​ 此漏洞主要通过攻击者模拟向服务器端发送自己编写的Heartbeat心跳数据包,主要是Heartbeat Message的长度与payload length进行匹配,若payload lenght长度大于HeartbeatMes sage的length,则会在服务器返回的response响应包中产生数据溢出,造成有用数据泄露。

TLS数据包格式

心跳包字段 长度 说明
ContentType 1byte 心跳包类型,IANA组织把type编号定义为24(0x18)
ProtocolVersion 2bytes TLS的版本号,目前主要包括含有心跳扩展的TLS版本:TLSv1.0,TLSv1.1,TLSv1.2
length 2bytes HeartbeatMessage的长度
HeartbeatMessageType 1byte Heartbeat类型 01表示heartbeat_request 02表示heartbeat_response
payload_length 2bytes payload长度
payload payload_length个bytes payload的具体内容
padding >=16bytes padding填充,最少为16个字节

​ 如下图所示,心跳包标识(\x18),SSL协议标识(\x03\x03),Heartbeat Message的length为3字节(\x00\x03),而请求数据字段(payload length)的值为65535字节(\xff\xff),有可能存在攻击,因为攻击者想获得更多的信息,所以一般请求数据长度(payload length)设置为最大值65535(\xff\xff),而且wireshark一般会对畸形心跳包进行标识,显示此Heartbeat Request数据包的payload length异常。

攻击流程示例

心跳请求包

​ 攻击者发送特征的心跳请求包,是只设置了payload length,但是没有payload数据。Heartbeat Message的length为3字节(\x00\x03)说明没有payload数据,而请求数据字段(payload length)的值为16384字节(\x40\x00),说明请求服务器返回16384字节长度的心跳返回包数据。而且wireshark一般会对畸形心跳包进行标识,显示此Heartbeat Request数据包的payload length异常。

心跳响应包

​ 受漏洞影响的服务器一般会返回,攻击者发送的心跳请求包的请求数据字段(payload length)相同大小的数据,此次为16384字节。可以看到泄漏的数据为16384字节。

检测思路

​ OpenSSL心脏滴血(CVE-2014-0160)一般的检测思路是从泄漏角度来判断匹配的是心跳响应数据包,一般返回的心跳包不会很大,如果超过返回的心跳数据大于16384字节,可能在泄漏内存数据。但是存在一种加密的心跳响应数据包,虽然TLS协议已经规定TLSCiphertext.fragment 的长度(以字节为单位)不能超过2^14 + 2048(16384 + 2048字节长度)。但是,实际的部分场景中存在,加密心跳响应数据包的长度超过规定值,所以存在误报。

​ 由于心跳数据包被加密如果攻击者无主密钥也无法解密。一般明文的心跳数据包,误报的可能性较低。

​ 另一种检测思路是从心跳请求包角度来判断,不仅判断心跳请求包长度(length),并且对请求数据长度字段值(payload length)大小判断,可信度较高,误报可能性较低。

判断总结

  OpenSSL心脏滴血(CVE-2014-0160)的产生主要由于OpenSSL的心跳处理逻辑没有检测心跳包中的长度字段(payload length)是否和后续实际的数据内容长度(payload)相对应,导致攻击者构造异常数据包,来直接获取心跳数据所在的内存区域的后续数据。主要特征有:

  • heartbleed漏洞主要存在于有心跳机制的OpenSSL协议中。
  • IANA组织把开启心跳扩展机制的SSL数据包type类型定义为24(0x18)。
  • heartbleed漏洞主要存在于TLS和DTLS两种协议中,在含有heartbleed漏洞的OpenSSL协议中需要开启心跳扩展机制(beartbeat),而含有心跳扩展机制的TLS版本主要包含在TLSv1.0(0x0301),TLSv1.1(0x0302),TLSv1.2(0x0303)三种版本中。
  • heartbleed漏洞攻击主要由于攻击者构造异常的心跳数据包,即心跳包中的长度字段(payload length)与后续实际的数据内容长度(payload)不相符合,来获取心跳数据所在的内存区域的后续数据。

​ 综上所述我们可以通过对线网中的数据首先进行判断是否为含有OpenSSL的数据包,同时通过对数据包中的type类型判断数据包是否为心跳数据包(\x18),然后对TLS的版本进行匹配找到相应的含有心跳扩展机制的心跳数据包,最后通过对心跳包中的实际数据长度(payload)与长度字段(payload length)定义的值比较,如果心跳包中的与后续实际的数据内容长度(payload)小于定义的长度字段(payload length)则该数据包即为含有heartbleed漏洞的数据包。