APP下载

OpenSSL HeartBleed漏洞自动化检测工具设计与实现

2018-06-29陈希胡峻洁张亮严义兵雷敏

网络空间安全 2018年1期
关键词:脚本字节漏洞

陈希 胡峻洁 张亮 严义兵 雷敏

摘 要:OpenSSL在实现心跳逻辑时,存在编码上的缺陷,导致了HeartBleed漏洞的发生。由于在没有正确执行边界检查的前提下,就执行memcpy( )函数调用受害用户输入内容作为长度参数,使得攻击者可以利用该漏洞远程读取存在漏洞版本的OpenSSL服务器内存中多达64KB的数据。论文文通过分析OpenSSL的工作原理,阐明了HeartBleed漏洞产生的根本原因;设计并实现自动化检测工具,判断服务器是否存在该漏洞,并在实际测试中被成功应用。

关键词:OpenSSL; HeartBleed漏洞; 自动化检测

中图分类号:TP312 文献标识码:A

Design and implementation of automated detection tool for openssl heartbleed vulnerability

Abstract: Heartbeat logic in OpenSSL has a code flaw, leading to the occurrence of HeartBleed vulnerability. The execution of the memcpy( ) function invokes the victim user input content as a length parameter without the proper execution of the boundary check, allowing the attacker to remotely read up to 64KB of data in the OpenSSL server memory where the vulnerability exists. This paper analyzes the principle of OpenSSL and clarifies the root cause of the HeartBleed vulnerability. On this basis, this paper designs and implements the automated detection tool which is successfully applied in the actual test to judge whether the server exists the vulnerability.

Key words: OpenSSL; heartbleed vulnerability; automated detection

1 引言

OpenSSL是一款功能齊全的安全套接字层密码库,其作用是为了实现网络通信的加密与认证功能。OpenSSL囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL(Secure Sockets Layer,安全套接层)协议,并提供多样的应用程序供使用,保障了网络通信的安全。

2014年4月8日,OpenSSL 曝出一种名为HeartBleed (CVE ID:CVE-2014-0160)[1]的严重安全漏洞。该漏洞首先被Google研究员尼尔·梅塔(Neel Mehta)发现,起因是他可以从特定服务器上随机获取64KB的工作日志。利用该漏洞,黑客可直接对个人电脑发起“心脏出血”攻击,从存在漏洞版本的OpenSSL服务器内存中读取请求存储位置之外的多达64 KB的数据,这段内存数据可能包含用户名与密码、证书私钥、重要的商业文档等数据。OpenSSL所具有的强大功能使其被广泛应用于各大网银、在线支付、电商网站、门户网站、电子邮件等领域,因此HeartBleed漏洞势必引发巨大的网络灾难。目前,中国国家信息安全漏洞共享平台(CNVD)将该漏洞定级为“高危”[2]。

鉴于HeartBleed漏洞的危害程度和影响范围,本文通过研究HeartBleed漏洞原理,设计并编写Python脚本以完成自动化检测的目的[3],帮助用户能够及时发现安全问题所在,并在最后以内网中一台存在OpenSSL HeartBleed漏洞的主机(试验机)为例,测试了脚本的运行结果。

2 漏洞原理

2.1 OpenSSL工作原理

OpenSSL是一款实现了SSL协议和TLS (Transport Layer Security,安全传输层)协议的开源工具,被广泛地应用于互联网各大应用中。

SSL协议位于TCP/IP协议与各种应用层协议之间,是Netscape公司所研究开发的一项用于保障网络安全的协议,其通过传输层对网络连接进行加密保护,保障了互联网传输过程中数据的安全性。

SSL协议主要可分为两个部分[4]。

(1)SSL记录协议(SSL Record Protocol)

记录协议处于可靠的传输协议(如TCP)之上,可以实现高层协议的数据封装、压缩、加密等基本功能。明文传送情况下,SSL记录协议的结构如图1所示。

在图1中,类型、版本和长度统称为“记录头信息”,共为5个字节,其中:类型占1个字节,用来表示该记录携带的数据类型;版本占2个字节,用来表示该记录的协议版本,分为主要版本和次要版本,各占1个字节;长度占2个字节,用来表示所携带数据的长度,但是并不包含记录头信息中的5个字节,因此整个记录的长度应为“长度+5”。

(2)SSL握手协议(SSL Handshake Protocol)

握手协议位于SSL记录协议之上,用于在实际的数据传输开始前,为客户端与服务器提供身份认证、协商加密算法、交换加密密钥等服务[5]。SSL握手协议的过程如图2所示。

TLS位于传输层和应用层之间,其作用是实现数据的安全加密功能。客户端向服务器发送TLS心跳数据包,其中用两个字节表明有效负载数据长度,而服务器端OpenSSL将根据这个有效负载长度构造一个新的数据包返回给用户,用以确认彼此在线,以便实现持续通信功能。此次“心脏出血”事件中的HeartBleed漏洞正是存在于OpenSSL的TLS Hearbeat扩展中,利用了心跳包的正常工作,以获取到持续溢出的“心跳信号”数据。

2.2 漏洞利用方式

OpenSSL在实现TLS心跳逻辑时,存在编码上的缺陷,其心跳处理逻辑并没有检测心跳包中的数据长度是否和返还的数据长度相符合。具体来说,这一漏洞是由于在没有正确进行边界检查的前提下就执行memcpy( )函数调用受害用户输入内容作为长度参数所导致的[6]。攻击者通过追踪OpenSSL所分配的64KB缓存,将超出必要范围的字节信息复制到缓存中再返回缓存内容,这样一来OpenSSL的内存内容就会以每次64KB的速度遭受泄露[7]。

利用这一方式,攻击者可以获取到网站服务器中用于加密信息的网络密钥,而后从中截取用户的个人信息;或者通过直接潜伏在OpenSSL服务器的内存中,达到随时且快捷的获取众多网站用户信息的目的。

根据文献[8]的标准说明,心跳信息在C语言中的表现形式如下:

这条心跳信息使用SSL3_RECORD结构进行传输,进一步观察分析SSL3_RECORD结构的定义:

其中,SSL3记录中的data指向接收到的心跳信息的起始位置;length表示接收到的心跳信息的字节数量;而心跳信息中的payload length则表示被返回的有效负载的字节数量。心跳信息的发送方可以决定payload length,同时SSL3_RECORD结构中的length 字段却没有进行校验,这样便导致了内存溢出情况的发生[9]。

在接收到心跳信息之后,OpenSSL将对其进行如下处理:

其中,p为指向所接收到的HeartbeatMessage的起始处的指针;bp为指向HeartbeatMessage回复起始位置的指针。根据上述代码分析可得:OpenSSL服务器端是根据发送端提供的载荷长度来拷贝数据的,然而发送端用户可以控制变量payload,即心跳載荷长度和pl的心跳数据。

假设攻击者指定了最大的payload为65535字节,但是发往服务器的心跳数据仅为0或1字节,那么memcpy函数就会把服务端内存中这条SSLv3记录之后的数据复制到新分配的最大空间的内存区域,并返回给攻击者。依照上述方法,攻击者可以重复获取服务器大段内存进行数据分析,得到密码内容等重要信息。

3 检测工具的设计与实现

3.1 有效攻击载荷生成

对于检测工具的设计与实现,考虑到Python拥有强大的类库,非常适合用以快速开发,被广泛应用于众多自动化测试项目中,因此本文使用Python语言设计并编写OpenSSL HeartBleed漏洞自动化检测脚本[10]。

通过阅读心跳拓展协议RFC 6520,可以分析得到有效攻击载荷的数据结构为:

依据该结构,脚本设计了如下攻击载荷:

hb = h2bin('''

18 03 02 00 03

01 ff ff

''')

其中,“18”表示Heartbeat Type;“03 02”表示TLS的版本号,此处应为TLS v1.1;“00 03”表示Heartbeat Message的长度,也就是payload的长度;“01”表示heartbeat_request;“ff ff”表示payload length。而payload和padding都不设数据,以便利用漏洞将后续内存中的数据复制出来。

3.2 脚本设计

基于OpenSSL的工作原理以及HeartBleed漏洞的利用方式,本文按照如图3思路设计编写自动化检测脚本,如图3所示。

首先,自动化检测脚本需先建立socket连接,关键代码如下:

Tcp socket建立完成后,发送SSL/TLS Client Hello请求,关键代码如下:

若Server Hello消息返回,则说明SSL/TLS会话已建立成功。其中,在接收服务器返回的数据包时程序调用了recvmsg函数,该函数内容如下:

该函数实现了读取返回信息的功能,在函数执行的第一步时又调用了recvall函数,用以从返回的数据包中读取长度为5个字节的数据,而后函数将所读取的5个字节以1、2、2字节分割,其中typ表示数据包类型,ver表示TSL版本,ln表示数据包长度。recvall函数关键代码如下:

下一步,脚本利用hit_hb函数向服务器发送伪造的心跳包,并读取返回的信息,检测漏洞是否存在:

如果成功接收到溢出的数据,那么则表示服务器存在HeartBleed漏洞,得出检测结果:

3.3 实际测试

实际测试环境为安装了OpenSSL 1.0.1版本的docker镜像,如图4所示,首先使用如下命令拉取镜像到本地:

$ docker pull medicean/vulapps:o_openssl_heartbleed

启动配置好的安装有OpenSSL 1.0.1版本的docker镜像,如图5所示。

接着,运行自动化检测脚本,如图6所示。

查看结果,成功接收到了溢出数据,实现了自动化检测HeartBleed漏洞的目的,如图7所示。

4 结束语

OpenSSL在被广泛应用的同时,其安全性也应受到更多的重视及研究。本文通过分析OpenSSL的工作原理,阐明了HeartBleed漏洞产生的根本原因及可能被利用的方式,提出编写Python脚本以实现自动化检测的目的。用户使用本文所设计的自动化工具,可以在不损害服务器的情况下,对服务器进行漏洞检测,并快速发现安全问题。

参考文献

[1] 美国国家标准与技术所.国家漏洞数据库[EB/OL]. http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-0160.

[2] 中国国家信息安全漏洞共享平台[EB/OL]. http://www.cnvd.org.cn/flaw/show/CNVD-2014-02175.

[3] 丁敏.基于Python语言实现自动化测试的研究[J].数字技术与应用,2010(3):88-88.

[4] 檀亚乐,胡曦明,马苗. SSL协议工作过程探析[J].网络安全技术与应用,2017,(07):36-38.

[5] 胡仁林,张立武.基于模糊综合分析的SSL/TLS协议配置安全评估模型研究[J].信息安全研究,2017,3(06):538-547.

[6] 马虹哲.源代码安全漏洞检测方法探讨[J].网络空间安全,2016,7(Z2):55-58.

[7] 安思华,易平,王春新,李朝峰. OpenSSL Heartbleed漏洞攻击原理及防范方法研究[J]. 通信技术,2014,47(07):795-799.

[8] SEGGELMANN R,TUEXEN M. Transport Layer Security(TLS) and Datagram Transport Layer Security(DTLS) Heartbeat Extension[EB/OL]. IETF RFC6520. https://tools.ietf.oor/html/rfc6520.

[9] 杜江,罗权.基于代码审计技术的OpenSSL脆弱性分析[J].计算机系统应用,2017,26(09):253-258.

[10] 钱劼,雷敏,邹仕洪.Java反序列化漏洞自动检测脚本设计[J].网络安全技术与应用,2017,(08):66-68.

猜你喜欢

脚本字节漏洞
字节跳动瞄准教育等新业务
漏洞在哪里
侦探推理游戏(二)
自动推送与网站匹配的脚本
漏洞在哪儿
举一反三新编
捕风捉影新编
人类进入“泽它时代”
视频、Office漏洞相继爆发
愚公移山