1 引言
2014年4月8日,XP宣布正式停止服务的日子,也是OpenSSL爆出大漏洞的日子,这个漏洞被称为Heartbleed或“心脏出血”漏洞。OpenSSL漏洞是本年度爆出最严重的安全漏洞,其涉及范围也非常广泛,利用该漏洞,黑客坐在自己家里电脑前就可以实时获取到很多以https开头网址的用户登录账号密码,包括大批网银、知名购物网站、电子邮件等。因此非常有必要对OpenSSL爆出的安全漏洞进行分析与研究,并提出相应防范对策。
2 SSL 及 OpenSSL
SSL安全套接层协议(Secure Socket Layer),用以保障在Internet上数据传输之安全,利用数据加密技术,可确保数据在网络上之传输过程中不会被截取及窃听。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
OpenSSL是一套开放源代码的软件库包,实现了SSL与TLS( Transport Layer Security)协议。其主要库是以C语言所写成,实作了基本的加密功能。OpenSSL可以运行在绝大多数类Unix操作系统上,OpenVMS与 Microsoft Windows。
OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL 支持一些不同的密码算法,包括对称密码算法,如 AES,DES,IEDA,RC2 等; 非对称密码算法,如 RSA,DSA 等; 信息摘要算法,如 MD5,MD4,SHA-1,MDC-2 等。
3 Heartbleed 漏洞分析
3.1 Heartbleed攻击原理
2014年4月7日OpenSSL发布了安全公告,在OpenSSL1.0.1版本中存在严重漏洞(CVE-2014-0160)。OpenSSL Heartbleed模块存在一个BUG,问题存在于ssl/dl_both.c文件中的心跳部分,当攻击者构造一个特殊的数据包,满足用户心跳包中无法提供足够多的数据会导致memcpy函数把SSLv3记录之后的数据直接输出,该漏洞导致攻击者可以远程读取存在漏洞版本的OpenSSL服务器内存中多达64K的数据,这段内存数据可能包含证书私钥、用户名与密码、聊天信息、电子邮件、重要的商业文档、通信等数据。
TLS Heartbeat 项目源代码提交工作是在 2011 年 12月 31 日星期六午夜期间耗时 61 分钟完成的,因此该漏洞已经存在两年之久,三分之二的活跃网站均在使用这种存在缺陷的加密协议。目前,中国国家信息安全漏洞共享平台 (CNVD) 对该漏洞的评级为“高危”。
3.2 Heartbleed 漏洞分析
TLS 位于传输层和应用层之间,提供数据安全加密。TLS 心跳指的是用户向服务器发送数据包,服务器返回一个相同的数据包以确定彼此在线,以支持持续通信功能。用户向服务器发送的心跳数据中用两个字节表明有效负载数据长度,而服务器端 OpenSSL 将根据这个有效负载长度构造一个新的数据包送给对端。
这一漏洞藏身于OpenSSL的TLS Heartbeat扩展当中:这是一项持续作用型功能,其中一个连接端会向另一端发送任意数据的有效负载,对方则发回对应数据的精确副本以确保传输过程一切正常。根据官方提供的标准说明,Heartbeat信息在C语言中表现为以下形式:
struct
{HeartbeatMessageType type;
uint16 payload_length;
opaque payload[HeartbeatMessage.payload _length];
opaque padding[padding_length];}
HeartbeatMessage;
这条HeartbeatMessage通过SSL3_RECORD结构——一种SSL/TLS通信基础构建块——进行传输。SSL3_RECORD中的关键性字段如下所示,其中length代表接收到的HeartbeatMessage内容为多少字节、data则为指向该HeartbeatMessage的指针。
typedef struct ssl3_record_st
{int type;
unsigned int length;
unsigned int off;
unsigned char * data;
unsigned char * input;
unsigned char * comp;
unsigned long epoch;
unsigned char seq_num[8];
} SSL3_RECORD
更明确地进行解释,SSL3记录中的data指向接收到的HeartbeatMessage的起始位置,而length代表接收到的HeartbeatMessage的字节数量。与此同时,HeartbeatMessage中的payload length代表被发回的随意有效负载的字节数量。
发出HeartbeatMessage的一方对payload length拥有控制权,不过正如我们所看到,SSL3_RECORD中的length字段并没有经过验证,而这一状况就成了攻击者实现内存溢出绝佳机会。
4 Heartbleed 漏洞检测与防范
4.1 Heartbleed 漏洞检测方法
目前一些网站已经推出了测试,检测给定的网站上是否存在心脏出血漏洞,这里做简要整理。
(1) 可以直接利用在线工具检测 https 站点是否存在此漏洞,这种方法快捷、准确,如360提供的在线检测网址为http://wangzhan.360.cn/heartbleed。。
(2) 通过相应命令查看提供加密服务的 OpenSSL 版本是否在受影响的版本范围,主要影响版本 OpenSSL 1.0.1到 OpenSSL 1.0.1f 以及 OpenSSL 1.0.2 Beta1。
4.2 Heartbleed 漏洞防范方法
鉴于本漏洞的严重程度,如果确定本漏洞存在,暂停服务进行修补是一种较好的应对策略。具体修补方式为:OpenSSL版本升级到最新的1.0.1g,重新生成你的私钥,并请求和替换SSL的证书。
5 结束语
Heartbleed漏洞严重性远比想象的严重,而这次漏洞危机的其突发性和危害性也给国内信息安全领域的企业和专家上了重要的一课,同样也希望这次危机能加速推动我国信息安全领域相关科研水平提升和相关安全产品研发。
参考文献
[1] 潘强, 郭毅, 刘志军. 基于SSL技术实现网络通信双向加密[J]. 信息安全与技术 2012.08.
[2] 美国国家标准与技术所. 国家漏洞数据库[EB/OL]. http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-0160.
[3] 中国国家信息安全漏洞共享平台 [EB/OL]. http://www.cnvd.org.cn/flaw/show/CNVD-2014-02175.
[4] SEGGELMANN R,TUEXEN M. Transport Layer Security( TLS) and Datagram Transport Layer Security ( DTLS)Heartbeat Extension[EB / OL]. IETF RFC 6520. ( 2012-02-08) [2014-05-09]https: / / tools. ietf. org / html / rfc6520.
[5] Codenomicon公司. 关于“心脏出血”漏洞的说明[EB/OL].http://heartbleed.com/.
基金项目:
甘肃政法学院校级科研项目(GZF2012XQNLW14)。
作者简介:
张生财(1982- ) 男,硕士,讲师;主要研究方向和关注领域:网络安全、协议分析。