1. 概述
OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷。OpenSSL的心跳处理逻辑没有检测心跳包中的长度字段是否和后续的数据字段相符合,攻击者可以利用这一点,构造异常的数据包,来获取心跳数据所在的内存区域的后续数据。这些数据中可能包含了证书私钥,用户名,用户密码,用户邮箱等敏感信息。该漏洞允许攻击者从内存中读取多达64KB的数据。
2. 数据包分析
SSL(Secure Socket Layer 安全套接层)及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS和SSL在传输层对网络连接进行加密。所以通过SSL或TLS协议加密后的数据包再通过wireshark软件进行对数据包的抓取时,抓取到的数据也是经过加密处理的数据。
DTLS(Datagram Transport Layer Security)数据包传输层安全协议。TLS不能用来保证UDP上传输的数据的安全,因此Datagram TLS试图在现存的TLS协议架构上提出扩展,使之支持UDP,即成为TLS的一个支持数据报传输的版本。DTLS1.0基于TLS1.1,DTLS1.2基于TLS1.2
心脏出血漏洞主要通过攻击者模拟向服务器端发送自己编写的Heartbeat心跳数据包,主要是HeartbeatMessage的长度与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个字节 |
DTLS数据包格式
心跳包字段 | 长度 | 说明 |
---|---|---|
ContentType | 1byte | 心跳包类型,IANA组织把type编号定义为24(0x18) |
ProtocolVersion | 2bytes | DTLS的版本号,DTLS1.0基于TLS1.1,DTLS1.2基于TLS1.2 |
epoch | 2bytes | 为一个计数器,每一个加密状态改变时加一。主要用来区分在一个多次重 |