TLS攻击之心脏滴血

一 心脏滴血介绍

心脏滴血漏洞(CVE-2014-0160) 是一个出现在加密程序库OpenSSL的安全漏洞,openssl是用于实现TLS协议的库。

受影响的版本: OpenSSL1.0.1、1.0.1a 、1.0.1b 、1.0.1c 、1.0.1d 、1.0.1e、1.0.1f、Beta 1 of OpenSSL 1.0.2等版本

影响范围:只要使用的是存在缺陷的OpenSSL实例,无论是服务器还是客户端,都可能因此而受到攻击。 因为缺陷在于OpenSSL的实现,而不是SSL/TLS协议本身,所以除了OpenSSL之外的其他TLS实现方式,如GnuTLS、Mozilla的网络安全服务(NSS)和Windows平台的TLS实现都不受影响。

漏洞原理:在实现TLS的心跳扩展时没有对输入进行适当验证(缺少边界检查,因此漏洞的名称来源于“心跳”(heartbeat)。该程序错误属于缓冲区过读,即可以读取的数据比应该允许读取的还多 。

二 漏洞原理分析

2.1 心跳机制

TLS / SSL协议的一个重要组成部分被称为“心跳”。从本质上讲,心跳就是两台电脑互相通信从而让对方知道它们仍然相连,即使用户没有下载或上传任何东西。

(1) 正常心跳检测

每过一段时间,浏览器会发送一个加密的数据到服务器端,这被称为心跳请求,至关重要的是,心跳请求里包含自己的长度信息。例如下图中,

客户端:内容为abcdefghij,,自己的长度为10字节 。

服务器:收到消息时,会分配一个内存缓冲区(一个物理内存区域用以存储信息),该区域的存储空间和心跳请求信号里的长度一致,即10字节。接下来,它会存储请求信号的加密数据到内存缓冲区,然后读取数据并将其发送回你的浏览器,来证明连接仍然存在。

1599116465905

(2) 心脏滴血

心脏出血漏洞的出现是因为,**OpenSSL的心跳功能缺少了一个至关重要的安全维护手段:计算机接受心跳请求时从不检查该请求和它声称的内容是否一致,及从不检查所请求的数据长度是否和声称的数据长度一致,导致响应方返回额外长度的数据,具体如下图所示:

客户端心跳请求:abcdefghij,,心跳长度为10字节 。

服务器端:接收心跳数据后,没有对心跳请求数据长度和声称 的10字节长度进行检查,直接分配200字节缓存区,存储心跳数据。返回数据时,从缓冲区读取200字节的数据返回给客户端。这时候缓冲区可能会存在密钥,用户名,密码等隐私信息(可想而知payload需要精心构造以读取有用的隐私信息,这里仅仅简单描述攻击原理)。

1599117066503

2.2 心脏出血错误代码

导致心脏出血漏洞的编程错误可以归于一行代码:

memcpy(bp, pl, payload);

memcpy()是复制数据的命令。bp是被复制的数据的存储区域,pl是被复制的数据的来源,payload是被复制的数据长度。问题在于,该命令没有检验pl复制的数据是否和payload给予的长度相符。

3 修复心脏滴血漏洞

修补心脏出血漏洞的方式是更新最新的OpenSSL版本,你可以在官网上获取相关链接 https://www.openssl.org/source/

因为OpenSSL是开源的,以下是修复过的代码: 代码的第一部分的功能是确定心跳请求的大小不是0KB,不然可能会出错。第二部分用来检验心跳的长度是否和它声称的相符。

* Read type and payload length first*/
if (1 + 2 + 16 > s->s3->relent)
return 0;
/silently discard */
hbtype = *p++;
n2s(p, payload);
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0;
/ silently discard per RFC 6520 sec. 4 */
pl = p;

4 心脏滴血漏洞检测

4.1 nmap

nmap -p 443 --script ssl-heartbleed 66.175.219.225
或者
nmap -sV --script=ssl-heartbleed 111.X.X.53 -p 443

其他检测TLS工具也可检测,具体见:TLS检测小工具

4.2 网上在线检测

http://possible.lv/tools/hb/

http://filippo.io/Heartbleed/

参考:

1 https://www.aqniu.com/news-views/28453.html 通俗易懂

2 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160 漏洞详情

3 https://blog.csdn.net/yaofeiNO1/article/details/54428021 可利用的payload

4 https://www.cnblogs.com/KevinGeorge/p/8029947.html POC

5https://zh.wikipedia.org/wiki/%E5%BF%83%E8%84%8F%E5%87%BA%E8%A1%80%E6%BC%8F%E6%B4%9E wiki

文章目录
  1. 一 心脏滴血介绍
  2. 二 漏洞原理分析
    1. 2.1 心跳机制
    2. 2.2 心脏出血错误代码
  3. 3 修复心脏滴血漏洞
  4. 4 心脏滴血漏洞检测
    1. 4.1 nmap
    2. 4.2 网上在线检测
  5. 参考: