一 心脏滴血介绍
心脏滴血漏洞(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字节。接下来,它会存储请求信号的加密数据到内存缓冲区,然后读取数据并将其发送回你的浏览器,来证明连接仍然存在。
(2) 心脏滴血
心脏出血漏洞的出现是因为,**OpenSSL的心跳功能缺少了一个至关重要的安全维护手段:计算机接受心跳请求时从不检查该请求和它声称的内容是否一致,及从不检查所请求的数据长度是否和声称的数据长度一致,导致响应方返回额外长度的数据,具体如下图所示:
客户端心跳请求:abcdefghij,,心跳长度为10字节 。
服务器端:接收心跳数据后,没有对心跳请求数据长度和声称 的10字节长度进行检查,直接分配200字节缓存区,存储心跳数据。返回数据时,从缓冲区读取200字节的数据返回给客户端。这时候缓冲区可能会存在密钥,用户名,密码等隐私信息(可想而知payload需要精心构造以读取有用的隐私信息,这里仅仅简单描述攻击原理)。
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 网上在线检测
参考:
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