Page 1

“心脏出血”漏洞始末深度分析报告 POWERED BY 伯威安全实验室


BUGWE 伯 威 新一代漏洞披露媒体

目录 CONTENTS

一 概述

1

二 影响范围

2

三 厂商反应

5

四 漏洞危害和修复方案

6

五 普通用户如何应对

8

六 企业用户如何应对

11

七 事态发展时间轴

12

八 技术原理分析

14

九 总结

18


BUGWE 伯 威 新一代漏洞披露媒体

一 概述 SSL是一种流行的加密技术,可以保护用户通过互联网传输的隐私信息。 OpenSSL是一套互联网上广泛使用的加密协议库,用于保护网站信息等的安全传输,防止 信息被窃听。 SSL协议的心跳包用于通信的两端的确认,一段可以发送心跳包给另一端,获取对端的反 馈。OpenSSL在处理TLS心跳扩展部分存在漏洞,由于缺少边界检查,会导致内存信息泄露。 通过发送恶意心跳包,攻击者可以获取大量内存数据,比如用于加密通信的密钥,甚至是网站 用户的用户名和密码以及其他秘密文件。利用密钥攻击者进而可以窃听网站与用户之间的通 信。 在实际测试中发现,可获取到X.509证书的私钥,用户名和密码信息,以及其他一些私人 信息。 由于该漏洞特殊性可引发服务端的内存信息泄漏,导致大量网站用户登录的相关信息被攻 击者获取,如COOKIE、用户名、密码等。密码的泄漏会造成其他一些影响,如相同密码登录 其他网站和服务等,进而带来更大范围的威胁。 服务器证书的泄漏,会导致网站用户与服务器之间的通信内容被解密,被窃听。而其他隐 私数据如信用卡数据,则有可能造成用户经济上的损失。邮件网站的密码泄漏,会造成用户的 私人邮件的泄漏,以及其他使用邮件作为密码保护措施的服务受到巨大的威胁。

PAGE - 1


BUGWE 伯 威 新一代漏洞披露媒体

二 影响范围 由于OpenSSL的广泛使用,该漏洞会导致大量网站的X.509证书的私钥泄漏,以及其他一 些内存中存在的信息,如用户http请求、Cookie、账号、密码等。通过泄漏的私钥,攻击者可 以解密通信中的数据。任何基于x.509证书的加密或者是签名都可以被解密。用户cookie信息 以及用户名密码可以直接以该用户的身份登录网站,进而进行其他的操作。 市场上总占有率超过66%的开源WEB服务器Apache和nginx使用OpenSSL加密库。邮件 服务如SMTP、POP、IMAP协议以及SSL VPN也使用Open SSL作为其加密库。

受影响的版本: OpenSSL 1.0.1 – 1.0.1f版本、1.0.2-beta1 不受影响的版本: OpenSSL 0.9.8、1.1.0、1.0.1g OpenSSL 1.0.1的发布日期为2012年3月14日。可以看出,受影响的版本已经存在2两 年,并且被广泛使用。

PAGE - 2


BUGWE 伯 威 新一代漏洞披露媒体

可能存在该漏洞的操作系统发行版本

Debian Wheezy (stable)

Ubuntu 12.04.4 LTS

OpenSSL 1.0.1e-2+deb7u4

OpenSSL 1.0.1-4ubuntu5.11

CentOS 6.5

Fedora 18

OpenSSL 1.0.1e-15

OpenSSL 1.0.1e-4

OpenBSD 5.3 and 5.4

FreeBSD 8.4 (OpenSSL 1.0.1e) and 9.1

OpenSSL 1.0.1c 10 May 2012

(OpenSSL 1.0.1c)

NetBSD 5.0.2 (OpenSSL 1.0.1e)

PAGE - 3

OpenSUSE 12.2 (OpenSSL 1.0.1c)


BUGWE 伯 威 新一代漏洞披露媒体

大部分使用OpenSSL代码库的网站也受到较大的影响。如大量电商、网上银行、网络借贷、 网络邮箱等系统均可能遭受入侵和刷库。

PAGE - 4


BUGWE 伯 威 新一代漏洞披露媒体

三 厂商反应 谷歌发言人表示:“我们已经评估了SSL漏洞,并且给谷歌的关键服务都打上了补丁。” 由于谷歌安全人员也发现了该漏洞,所有谷歌公司修复比较及时。 雅虎发言人表示:“我们的团队已经在雅虎的主要资产中成功部署了适当的修复措施,我 们目前正在努力为旗下的其他网站部署修复措施。”雅虎邮箱受到这次漏洞的影响,成功利用 此漏洞可以获取用户的密码信息等。 微软发言人表示:“我们正在关注OpenSSL问题的报道。如果确实对我们的设备和服务有 影响,我们会采取必要措施保护用户。” 目前已经有网站通知用户尽快修改密码以保证安全。GitHub已经重置用户的Session,并 且更新了SSL密钥以保证用户的安全。各大网站都在积极进行升级的工作。 已经有人利用此漏洞获取了NASA的部分用户帐户信息并且公布于网上,而更多地下信息 泄漏不为人知。

PAGE - 5


BUGWE 伯 威 新一代漏洞披露媒体

四 漏洞危害和修复方案 此次Heartbleed漏洞,攻击者已经成功利用该漏洞获取受影响网站用户的明文帐号和密 码,网站的证书私钥,用户登录的cookie等敏感信息。尤其是购物、支付等用户帐号价值较高 的网站,攻击者往往通过拿到的明文密码等信息,消费受害者的余额,转移受害者的资金,使 其遭受重大损失,对于受影响的邮箱帐号,往往是受害者找回密码的入口,攻击者会通过掌握 受害者的邮箱找回受害者大量的网站帐号密码,造成更严重的损失,影响波及深远。

图 用户的明文帐号和密码

图 用户的Cookie

据不完全统计国内443端口统计有33303个受本次OpenSSL漏洞的影响。列举影响较大的网 站: 按行业分类: 购物类:苏宁易购,淘宝网,京东 金融货币类:比特币中国,okcoin,中国银联,支付宝 邮箱类:163邮箱,126邮箱 社交类:YY语言,陌陌,微信网页版,微信公众号 生活服务类:12306铁道部,奇虎360,盛大网络,雅虎主站,搜狗

PAGE - 6


BUGWE 伯 威 新一代漏洞披露媒体

此次OpenSSL的Heartbleed漏洞影响以下Openssl版本: 1.0.1f, 1.0.1e, 1.0.1d, 1.0.1c, 1.0.1b, 1.0.1a, 1.0.1 OpenSSL 1.0.1g ,OpenSSL 1.0.0 ,OpenSSL 0.9.8 版本不受此次漏洞的影响。

很多操作系统默认安装受影响版本的OpenSSL: Debian Wheezy (stable), OpenSSL 1.0.1e-2+deb7u4 Ubuntu 12.04.4 LTS, OpenSSL 1.0.1-4ubuntu5.11 CentOS 6.5, OpenSSL 1.0.1e-15 Fedora 18, OpenSSL 1.0.1e-4 OpenBSD 5.3 and 5.4 (OpenSSL 1.0.1c 10 May 2012) FreeBSD 8.4 (OpenSSL 1.0.1e) and 9.1 (OpenSSL 1.0.1c) NetBSD 5.0.2 (OpenSSL 1.0.1e) OpenSUSE 12.2 (OpenSSL 1.0.1c)

以下操作系统不受影响: Debian Squeeze (oldstable), OpenSSL 0.9.8o-4squeeze14 SUSE Linux Enterprise Server

PAGE - 7


BUGWE 伯 威 新一代漏洞披露媒体

五 普通用户如何应对

1. 理论上涉及到https的网站(如下图)最近都不应当登录,尤其是涉及到金钱,购物等敏感 信息的网站。

PAGE - 8


BUGWE 伯 威 新一代漏洞披露媒体

五 普通用户如何应对

2. 在4月8号上午到4月9号之间登录过上述受影响的网站的用户,强烈建议在确认网站修复漏 洞后修改密码。检测网站是否修复:可通过此在线检测的工具检测:Test your server for Heartbleed (CVE-2014-0160)

PAGE - 9


BUGWE 伯 威 新一代漏洞披露媒体

五 普通用户如何应对

3. 确认网站修复完漏洞之后,重新更换证书。从网站上下载证书文件,然后导入证书安装。

PAGE - 10


BUGWE 伯 威 新一代漏洞披露媒体

六 企业用户如何应对 第一步:检测漏洞是否存在 1.

可通过此在线检测的工具检测:Test your server for Heartbleed (CVE-2014-0160)

2.

直接使用下面的OpenSSL命令来判断

/usr/local/bin/openssl s_client -connect $website:443 -tlsextdebug 2>&1| grep 'TLS server extension "heartbeat" (id=15), len=1'

第二步:修复: 1.

更新OpenSSL 更新OpenSSL到1.0.1g版本 wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz cd openssl-1.0.1g ./config make && make install

或者在OpenSSL编译时去掉下列选项: -DOPENSSL_NO_HEARTBEATS 2.

更新证书并通知用户重新下载证书 证书的密钥也会泄漏,厂商可以重新申请颁发,并通知用户更新证书。

3.

加强登录策略 统计4月8号上午到4月9号登录的用户,对密码可能被盗取的用户进行额外的风险控制措

施。例如:增加严格的IP登陆地址检查,对资金变动异常操作进行监控,发现异常通知用户更 改密码。对于cookie泄漏的用户,对其进行强制重新登录,并增加cookie泄漏对抗策略。

PAGE - 11


BUGWE 伯 威 新一代漏洞披露媒体

七 事态发展时间轴 2014年4月7日 Openssl官方发布了最新补丁(CVE_2014_0160,https://www.openssl.org/news/secadv_ 20140407.txt),该漏洞由来自谷歌的安全工程师Neel Mehta提交。 2014年4月8日7时 国外一名ID号为“Sean Cassidy”的网友发布了一条twitter信息,随后引发轩然大波,安全 圈内的网友开始研究和讨论该漏洞。

2014年4月8日9时 国外名为“Jared Stafford”的安全工作者发布漏洞检测脚本ssltest.py,利用该脚本可检测目 标站点是否存在CVE-2014-1060漏洞并可获取漏洞服务器的内存数据。

PAGE - 12


BUGWE 伯 威 新一代漏洞披露媒体

2014年4月8日14时起 国内白帽子和安全工程师对各大站点展开测试,伯威漏洞预警平台在14:15分收到匿名白 帽子提交淘宝漏洞并附带部分泄漏用户的帐户信息。

PAGE - 13


BUGWE 伯 威 新一代漏洞披露媒体

八 技术原理分析 本次漏洞(CVE-2014-0160)的问题代码主要存在于OpenSSL的Heartbleed模块中,当 恶意攻击者构造特制的数据包,导致memcpy函数将SSLv3记录之后的数据直接输出,该漏洞 导致攻击者可远程读取存在漏洞版本的openssl服务器内存中长达64K的数据。 OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取 多达64 KB的数据。一些安全研究员表示: 无需任何特权信息或身份验证,我们就可以从我们自己的(测试机上)偷来X.509证书的 私钥、用户名与密码、聊天工具的消息、电子邮件以及重要的商业文档和通信等数据。(来 源:http://blog.existentialize.com)

漏洞分析 本次漏洞主要存在于源码文件ssl/d1_both.c中的dtls1_process_heartbeat函数中,该函 数代码如下(见下页):

PAGE - 14


BUGWE 伯 威 新一代漏洞披露媒体

Int dtls1_process_heartbeat(SSL *s) { /*代码段1*/ unsigned char *p = &s->s3->rrec.data[0], *pl; unsigned short hbtype; unsigned int payload; unsigned int padding = 16; /* Use minimum padding */ /*代码段1*/ /*代码段2*/ /* Read type and payload length first */ hbtype = *p++; n2s(p, payload); pl = p; /*代码段2*/ if (s->msg_callback) s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, &s->s3->rrec.data[0], s->s3->rrec.length, s, s->msg_callback_arg); if (hbtype == TLS1_HB_REQUEST) { /*代码段3*/ unsigned char *buffer, *bp; int r; /* Allocate memory for the response, size is 1 byte * message type, plus 2 bytes payload length, plus * payload, plus padding */ buffer = OPENSSL_malloc(1 + 2 + payload + padding); bp = buffer; /*代码段3*/ /*代码段4*/ /* Enter response type, length and copy payload */ *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload); /*代码段4*/ bp += payload; /* Random padding */ RAND_pseudo_bytes(bp, padding); r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); if (r >= 0 && s->msg_callback) s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding, s, s->msg_callback_arg); OPENSSL_free(buffer); ...

PAGE - 15


BUGWE 伯 威 新一代漏洞披露媒体

从“代码段1”可看到,首先将指针p指向了一个SSLv3结构体中数据段的指针。 unsigned unsigned unsigned unsigned

char *p = &s->s3->rrec.data[0], *pl; short hbtype; int payload; int padding = 16; /* Use minimum padding */

其中结构体SSL的定义如下所示: typedef struct ssl3_record_st { /*r */ int type; /* type of record */ /*rw*/ unsigned int length; /* How many bytes available */ /*r */ unsigned int off; /* read/write offset into 'buf' */ /*rw*/ unsigned char *data; /* pointer to the record data */ /*rw*/ unsigned char *input; /* where the decode bytes are */ /*r */ unsigned char *comp; /* only used with decompression - malloc()ed */ /*r */ unsigned long epoch; /* epoch number, needed by DTLS1 */ /*r */ unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */ } SSL3_RECORD;

从以上结构体可看出,每条SSLv3记录中包含一个类型域(type)、一个长度域(length)和 一个指向记录数据的指针(data)。 程序执行到“代码段2”: /* Read type and payload length first */ hbtype = *p++; n2s(p, payload); pl = p; 将该SSLv3记录的心跳包类型赋值给变量hbtype。宏n2s是从指针p指向的数据中提取出前两 个 字 节,并 把 它 们 存 入 变 量 payload 中,及 将 心 跳 包 的 长 度 域(length)赋 值 给 变 量 payload。可发现该段代码并未对心跳包的真实长度进行检查。变量pl则指向用户请求的心跳 包的数据。

PAGE - 16


BUGWE 伯 威 新一代漏洞披露媒体

程序执行到“代码段3”: if (hbtype == TLS1_HB_REQUEST) { unsigned char *buffer, *bp; int r; /* Allocate memory for the response, size is 1 byte * message type, plus 2 bytes payload length, plus * payload, plus padding */ buffer = OPENSSL_malloc(1 + 2 + payload + padding); bp = buffer; 当用户发起的心跳请求包类型是“TLS1_HB_REQUEST”时,程序将分配一段由访问者控制大 小的内存区域,该段内存区域最大为65554(1+2+65535+16)个字节。变量bp将指向这段 新分配的内存块。

程序执行到“代码段4”: /* Enter response type, length and copy payload */ *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload); 首先将bp中的心跳包类型设置为“TLS1_HB_RESPONSE”,宏s2n的功能与n2s相反:s2n读 入16 bit长的值,然后将其存成双字节值,所以s2n会将与请求的心跳包长度相同的长度值存 入变量payload中。 #define s2n(s,c) ((c[0]=(unsigned

char)(((s)>>

8)&0xff),c[1]=(unsigned

char)(((s))

&0xff)),c+=2) 随后,将pl(访问者提交的心跳包数据)中长度为payload的数据拷贝到bp中。随后,通过函 数dtls1_write_bytes将所有数据发送给访问者。 如果访问者没有在心跳包中提供足够多的数据,如pl指向的数据只有一个字节,则memcpy会 将该条SSLv3记录之后的数据全部复制出来,这部分数据可能包含用户的用户名、明文密码、 COOKIE信息等。

PAGE - 17


BUGWE 伯 威 新一代漏洞披露媒体

九 总结 OpenSSL是目前互联网上应用最广泛的安全传输方法(基于SSL即安全套接层协议)。可 以近似地说,它是互联网上销量最大的门锁。此次4月8号爆出的Heartbleed OpenSSL 溢出 漏洞堪称互联网安全界的“核弹”。几乎所有大型网站的运维人员彻夜修复漏洞,这一夜,互 联网门户洞开。而Heartbleed漏洞涉及广大行业包括SSLVPN,libSSL等,未来几天可能还将 会陆续有各类行业问题爆出,厂商和用户应当合理应对在发生更大的损失前及时得到弥补。

PAGE - 18

“心脏出漏”洞始末深度分析报告  
Read more
Read more
Similar to
Popular now
Just for you