一 : 关于OpenSSL“心脏出血”漏洞的分析
当我分析GnuTLS的漏洞的时候,我曾经说过,那不会是我们看到的最后一个TLS栈上的严重bug。然而我没想到这次OpenSSL的bug会如此严重。
OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取最多64 KB的数据。一些安全研究员表示:
无需任何特权信息或身份验证,我们就可以从我们自己的(测试机上)偷来X.509证书的私钥、用户名与密码、聊天工具的消息、电子邮件以及重要的商业文档和通信等数据。
这一切是如何发生的呢?让我们一起从代码中一探究竟吧。
0x01 Bug
请看ssl/dl_both.c,漏洞的补丁从这行语句开始:
- int
- dtls1_process_heartbeat(SSL*s)
- {
- unsignedchar*p=&s->s3->rrec.data[0],*pl;
- unsignedshorthbtype;
- unsignedintpayload;
- unsignedintpadding=16;/*Useminimumpadding*/
一上来我们就拿到了一个指向一条SSLv3记录中数据的指针。结构体SSL3_RECORD的定义如下(译者注:结构体SSL3_RECORD不是SSLv3记录的实际存储格式。一条SSLv3记录所遵循的存储格式请参见下文分析):
- typedefstructssl3_record_st
- {
- inttype;/*typeofrecord*/
- unsignedintlength;/*Howmanybytesavailable*/
- unsignedintoff;/*read/writeoffsetinto'buf'*/
- unsignedchar*data;/*pointertotherecorddata*/
- unsignedchar*input;/*wherethedecodebytesare*/
- unsignedchar*comp;/*onlyusedwithdecompression-malloc()ed*/
- unsignedlongepoch;/*epochnumber,neededbyDTLS1*/
- unsignedcharseq_num[8];/*sequencenumber,neededbyDTLS1*/
- }SSL3_RECORD;
每条SSLv3记录中包含一个类型域(type)、一个长度域(length)和一个指向记录数据的指针(data)。我们回头去看dtls1_process_heartbeat:
- /*Readtypeandpayloadlengthfirst*/
- hbtype=*p++;
- n2s(p,payload);
- pl=p;
SSLv3记录的第一个字节标明了心跳包的类型。宏n2s从指针p指向的数组中取出前两个字节,并把它们存入变量payload中——这实际上是心跳包载荷的长度域(length)。注意程序并没有检查这条SSLv3记录的实际长度。变量pl则指向由访问者提供的心跳包数据。
这个函数的后面进行了以下工作:
- unsignedchar*buffer,*bp;
- intr;
- /*Allocatememoryfortheresponse,sizeis1byte
- *messagetype,plus2bytespayloadlength,plus
- *payload,pluspadding
- */
- buffer=OPENSSL_malloc(1+2+payload+padding);
- bp=buffer;
所以程序将分配一段由访问者指定大小的内存区域,这段内存区域最大为 (65535 + 1 + 2 + 16) 个字节。变量bp是用来访问这段内存区域的指针。
- /*Enterresponsetype,lengthandcopypayload*/
- *bp++=TLS1_HB_RESPONSE;
- s2n(payload,bp);
- memcpy(bp,pl,payload);
宏s2n与宏n2s干的事情正好相反:s2n读入一个16 bit长的值,然后将它存成双字节值,所以s2n会将与请求的心跳包载荷长度相同的长度值存入变量payload。然后程序从pl处开始复制payload个字节到新分配的bp数组中——pl指向了用户提供的心跳包数据。最后,程序将所有数据发回给用户。那么Bug在哪里呢?
0x01a 用户可以控制变量payload和pl
如果用户并没有在心跳包中提供足够多的数据,会导致什么问题?比如pl指向的数据实际上只有一个字节,那么memcpy会把这条SSLv3记录之后的数据——无论那些数据是什么——都复制出来。
很明显,SSLv3记录附近有不少东西。
说实话,我对发现了OpenSSL“心脏出血”漏洞的那些人的声明感到吃惊。当我听到他们的声明时,我认为64 KB数据根本不足以推算出像私钥一类的数据。至少在x86上,堆是向高地址增长的,所以我认为对指针pl的读取只能读到新分配的内存区域,例如指针bp指向的区域。存储私钥和其它信息的内存区域的分配早于对指针pl指向的内存区域的分配,所以攻击者是无法读到那些敏感数据的。当然,考虑到现代malloc的各种神奇实现,我的推断并不总是成立的。
当然,你也没办法读取其它进程的数据,所以“重要的商业文档”必须位于当前进程的内存区域中、小于64 KB,并且刚好位于指针pl指向的内存块附近。
研究者声称他们成功恢复了密钥,我希望能看到PoC。如果你找到了PoC,请联系我。
0x01b 漏洞修补
修复代码中最重要的一部分如下:
- /*Readtypeandpayloadlengthfirst*/
- if(1+2+16>s->s3->rrec.length)
- return0;/*silentlydiscard*/
- hbtype=*p++;
- n2s(p,payload);
- if(1+2+payload+16>s->s3->rrec.length)
- return0;/*silentlydiscardperRFC6520sec.4*/
- pl=p;
这段代码干了两件事情:首先第一行语句抛弃了长度为0的心跳包,然后第二步检查确保了心跳包足够长。就这么简单。
0x02 前车之鉴
我们能从这个漏洞中学到什么呢?
我是C的粉丝。这是我最早接触的编程语言,也是我在工作中使用的第一门得心应手的语言。但是和之前相比,现在我更清楚地看到了C语言的局限性。
从GnuTLS漏洞和这个漏洞出发,我认为我们应当做到下面三条:
花钱请人对像OpenSSL这样的关键安全基础设施进行安全审计;
为这些库写大量的单元测试和综合测试;
开始在更安全的语言中编写替代品。
考虑到使用C语言进行安全编程的困难性,我不认为还有什么其他的解决方案。我会试着做这些,你呢?
作者简介:Sean是一位关于如何把事儿干好的软件工程师。现在他在Squadron工作。Squadron是一个专为SaaS应用程序准备的配置与发布管理工具。
测试版本的结果以及检测工具:
OpenSSL 1.0.1 through 1.0.1f (inclusive) are vulnerable
OpenSSL 1.0.1g is NOT vulnerable
OpenSSL 1.0.0 branch is NOT vulnerable
OpenSSL 0.9.8 branch is NOT vulnerable
二 : 什么是SSL?什么是OpenSSL心脏出血漏洞?
4月9日上午消息,美国新闻网站Vox周二撰文,对当天公布的OpenSSL“心脏流血”漏洞进行了全面解读。[www.61k.com]
以下为文章全文:
什么是SSL?
SSL是一种流行的加密技术,可以保护用户通过互联网传输的隐私信息。当用户访问Gmail.com等安全网站时,就会在URL地址旁看到一个“锁”,表明你在该网站上的通讯信息都被加密。
这个“锁”表明,第三方无法读取你与该网站之间的任何通讯信息。在后台,通过SSL加密的数据只有接收者才能解密。如果不法分子监听了用户的对话,也只能看到一串随机字符串,而无法了解电子邮件、Facebook帖子、信用卡账号或其他隐私信息的具体内容。
SSL最早在1994年由网景推出,1990年代以来已经被所有主流浏览器采纳。最近几年,很多大型网络服务都已经默认利用这项技术加密数据。如今,谷歌、雅虎和Facebook都在使用SSL默认对其网站和网络服务进行加密。
什么是“心脏出血”漏洞?
多数SSL加密的网站都使用名为OpenSSL的开源软件包。本周一,研究人员宣布这款软件存在严重漏洞,可能导致用户的通讯信息暴露给监听者。OpenSSL大约两年前就已经存在这一缺陷。
工作原理:SSL标准包含一个心跳选项,允许SSL连接一端的电脑发出一条简短的信息,确认另一端的电脑仍然在线,并获取反馈。研究人员发现,可以通过巧妙的手段发出恶意心跳信息,欺骗另一端的电脑泄露机密信息。受影响的电脑可能会因此而被骗,并发送服务器内存中的信息。
该漏洞的影响大不大?
很大,因为有很多隐私信息都存储在服务器内存中。普林斯顿大学计算机科学家艾德·菲尔腾(Ed Felten)表示,使用这项技术的攻击者可以通过模式匹配对信息进行分类整理,从而找出密钥、密码,以及信用卡号等个人信息。
丢失了信用卡号和密码的危害有多大,相信已经不言而喻。但密钥被盗的后果可能更加严重。这是是信息服务器用于整理加密信息的一组代码。如果攻击者获取了服务器的私钥,便可读取其收到的任何信息,甚至能够利用密钥假冒服务器,欺骗用户泄露密码和其他敏感信息。
谁发现的这个问题?
该漏洞是由Codenomicon和谷歌安全部门的研究人员独立发现的。为了将影响降到最低,研究人员已经与OpenSSL团队和其他关键的内部人士展开了合作,在公布该问题前就已经准备好修复方案。
谁能利用“心脏流血”漏洞?
“对于了解这项漏洞的人,要对其加以利用并不困难。”菲尔腾说。利用这项漏洞的软件在网上有很多,虽然这些软件并不像iPad应用那么容易使用,但任何拥有基本编程技能的人都能学会它的使用方法。
当然,这项漏洞对情报机构的价值或许最大,他们拥有足够的基础设施来对用户流量展开大规模拦截。我们知道,美国国家安全局(以下简称“NSA”)已经与美国电信运营商签订了秘密协议,可以进入到互联网的骨干网中。用户或许认为,Gmail和Facebook等网站上的SSL加密技术可以保护他们不受监听,但NSA却可以借助“心脏流血”漏洞获取解密通讯信息的私钥。
虽然现在还不能确定,但如果NSA在“心脏流血”漏洞公之于众前就已经发现这一漏洞,也并不出人意料。OpenSSL是当今应用最广泛的加密软件之一,所以可以肯定的是,NSA的安全专家已经非常细致地研究过它的源代码。
有多少网站受到影响?
目前还没有具体的统计数据,但发现该漏洞的研究人员指出,当今最热门的两大网络服务器Apache和nginx都使用OpenSSL。总体来看,这两种服务器约占全球网站总数的三分之二。SSL还被用在其他互联网软件中,比如桌面电子邮件客户端和聊天软件。
发现该漏洞的研究人员几天前就已经通知OpenSSL团队和重要的利益相关者。这让OpenSSL得以在漏洞公布当天就发布了修复版本。为了解决该问题,各大网站需要尽快安装最新版OpenSSL。
雅虎发言人表示:“我们的团队已经在雅虎的主要资产中(包括雅虎主页、雅虎搜索、雅虎电邮、雅虎财经、雅虎体育、雅虎美食、雅虎科技、Flickr和Tumblr)成功部署了适当的修复措施,我们目前正在努力为旗下的其他网站部署修复措施。”
谷歌表示:“我们已经评估了SSL漏洞,并且给谷歌的关键服务打上了补丁。”Facebook称,在该漏洞公开时,该公司已经解决了这一问题。
微软发言人也表示:“我们正在关注OpenSSL问题的报道。如果确实对我们的设备和服务有影响,我们会采取必要措施保护用户。”
用户应当如何应对该问题?
不幸的是,如果访问了受影响的网站,用户无法采取任何自保措施。受影响的网站的管理员需要升级软件,才能为用户提供适当的保护。
不过,一旦受影响的网站修复了这一问题,用户便可以通过修改密码来保护自己。攻击者或许已经拦截了用户的密码,但用户无法知道自己的密码是否已被他人窃取。
三 : OpenSSL又现高危漏洞,心脏又要大出血?
还记得那个因为“心脏出血”而一夜成名的OpenSSL协议吗?它又有漏洞了。一组负责为加密协议OpenSSL做技术支持的开发人员,发现了一个新的神秘“高危”漏洞。
OpenSSL是诸如Apache和Nginx这样的开源网络服务器所使用的安全协议,这些网站占到世界上所有网站的66%。当2014年一个代号为Heartbleed的巨大安全漏洞被发现时,全世界都知道了这种少有人知的后台技术。
Heartbleed很危险,因为黑客可以利用OpenSSL,通过网站和服务器窃取数据,即使这些数据是加密的。具体情况可阅读雷锋网的相关文章。
OpenSSL新漏洞的本质仍然是未知数,但工程师对它“高危”的定性已经引起了人们的担忧。OpenSSL项目组将高危漏洞定义为,"影响共(www.61k.com]同配置的漏洞问题,比如服务器拒绝服务,服务器内存泄漏和远程代码执行等。”
用普通话来说,这意味着漏洞可以被黑客用于各种目的,从令使用了OpenSSL的网络和服务器掉线,到在受害者的系统上安装恶意软件,无所不能。
有关漏洞的进一步细节仍然未知,OpenSSL项目组不想在7月9号漏洞修复之前,为黑客提供任何可利用的信息。
这不是OpenSSL项目组自Heartbleed以来发布的第一个补丁。OpenSSL项目组5月份发布过一个修复14个漏洞的安全补丁,其中两个也是高危漏洞。
当然,并不是所有人都讨厌漏洞,比如美国和英国政府部门对OpenSSL等安全协议很不满。FBI在六月初声称,执法和情报机构在对付恐怖主义和犯罪时,需要采取一些方法来读取加密的信息流。
四 : 心脏出血漏洞:心脏出血漏洞-概述,心脏出血漏洞-受影响的OpenSSL版本
心脏出血漏洞(英语:Heartbleed bug),也简称为心血漏洞,是一个出现在开源加密库OpenSSL的程序错误,可允许攻击者读取服务器的内存信息。
心血漏洞_心脏出血漏洞 -概述
2014年4月7日,OpenSSL宣布的OpenSSL1.0.2-beta及1.0.1系列(除1.0.1g)的所有版本中,在其所实现的TLS心跳扩展存在严重的内存处理错误。它可以被用于让每个心跳包显示应用程序至多64千字节的内存内容。它的CVE号为CVE-2014-0160。
[www.61k.com]该漏洞是通过发送1个畸形的心跳请求至服务器,以引起服务器内存响应而引发。由于缺乏边界检查,OpenSSL不会验证心跳请求的有效性,从而可以带给攻击者不恰当的服务器响应。
自2011年12月31日,漏洞就已经存在,而且随着OpenSSL版本1.0.1于2012年3月14日释出,有缺陷的代码被广泛使用。通过读取网络服务器内存,攻击者可以访问敏感数据,从而危及服务器及用户的安全。潜在的敏感数据,包括服务器的专用主密钥,可使攻击者得以通过被动中间人攻击,解密当前或存储的传输信息(如果服务器和客户端未使用完全正向保密),或使用了完全正向保密时发动主动中间人攻击。攻击者无法控制服务器返回的数据,因为服务器会使用1个随机内存块作为响应。
漏洞还可能暴露其他用户的敏感请求和响应,包括用户任何形式的POST请求数据,会话cookie和密码,这能使攻击者可以劫持其他用户的服务身份。在其披露时,约有17%或五十万通过认证机构认证的互联网安全网络服务器被认为容易受到攻击。电子前哨基金会,Ars Technica,和布鲁斯·施奈尔都认为心脏出血漏洞是“灾难性的”。
心血漏洞_心脏出血漏洞 -受影响的OpenSSL版本
最后更新于2014年4月9日,据Heartbleed和OpenSSL网站上的信息。
受影响
? OpenSSL1.0.2-beta
? OpenSSL1.0.1-OpenSSL1.0.1f
不受影响
? OpenSSL1.0.2-beta2(将来版本)
? OpenSSL1.0.1g
? OpenSSL1.0.0(及1.0.0的分支版本)
? OpenSSL0.9.8(及0.9.8的分支版本)
要解决此漏洞,建议服务器管理员或使用1.0.1g版,或使用-DOPENSSL_NO_HEARTBEATS选项重新编译OpenSSL,从而禁用易受攻击的功能,直至可以更新服务器软件。
心血漏洞_心脏出血漏洞 -回应
在公告发布之日,Tor在其博客发布公告,并表示任何在互联网上寻求“强健的匿名或隐私”的人应该“在事情解决之前,接下来的几天里完全远离互联网“。他们还建议,Tor中继运行者和隐蔽服务运行者在修补OpenSSL后,应撤销及生成新密钥,但也指出,Tor中继使用两套密钥和多跳设计最大限度地减少了窃取单一中继的影响。
加拿大税务局(CRA)因心脏出血安全漏洞,关闭了电子服务网站。
平台维护者,如维基媒体基金会,建议他们的用户更改密码。
GitHub上的1个统计数据分析了2014年4月8日前1000个访问量最大的网站,发现受影响的网站包括Yahoo、Imgur、StackOverflow、Slate和DuckDuckGo。安全的网站包括Google、Facebook、Wikipedia、Twitter及Amazon。
心血漏洞_心脏出血漏洞 -公众响应
下面的网站已经发布公告,因受漏洞影响,建议用户更改密码:
? Akamai Technologies
? Amazon Web Services
?Ars Technica
?GitHub
?LastPass-LastPass自身并没有被影响,但建议用户修改所有储存在LastPass的受影响网站账户的密码,特别是有GitHub、OkCupid或雅虎帐户的“每个人”。LastPass提供了1个页面,公众可以检查网站是否受影响。2014年4月9日,LastPass开始向用户报告已知受心脏出血影响的存储了密码的网站。
? Mojang
? PeerJ
? SoundCloud
? SparkFun
? Stripe (company)
?Tumblr
? Wikimedia
? Wunderlist
心血漏洞_心脏出血漏洞 -修复
该漏洞被归为缓冲过度读取。缓冲过度读取错误是软件可以读取比应该被允许还多的数据。
OpenSSL版本1.0.1g增加了一些边界检查,以防止过度读取缓冲。例如,测试if(1+2+16>s->s3->rrec.length)return0;/*silentlydiscard*/
已添加在行hbtype=*p++;
的前面。 更改的完整列表,请参阅git.openssl.org。
单独应用这个补丁并不能修复漏洞。还必须重新启动相关服务和/或重启服务器,这样修补过的OpenSSL才能被应用,然后重新生成所有的私钥和密码。
五 : OpenSSL再爆高危漏洞"心脏"继续大出血
继2014年4月9日爆出OpenSSL心脏出血漏洞,2015年1月8日连续爆发八个高危漏洞之后,7月9日再度爆发高危漏洞,CVE代号为:CVE-2015-1793。
该漏洞的成因是OpenSSL在证书验证过程中,第一次连接失败时会尝试寻找1个替代证书,而攻击者可以利用这一点,通过1个中级证书去冒充证书颁发机构来绕过OpenSSL的证书验证。整个问题导致了可以实现中间人攻击,并且可能导致应用程序(如浏览器)把不受信任或者无效的证书标记显示为信任有效,危害十分严重。该漏洞受影响版本为:1.0.2c, 1.0.2b, 1.0.1n 和 1.0.1o。
【小贴士】中间人攻击:是1种“间接”的入侵攻击, 这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。然后入侵者把这台计算机模拟一台或两台原始计算机,使“中间人”能够与原始计算机建立活动连接并允许其读取或篡改传递的信息,然而2个原始计算机用户却认为他们是在互相通信,因而这种攻击方式并不很容易被发现。所以中间人攻击很早就成为了黑客常用的1种古老的攻击手段,并且一直到今天还具有极大的扩展空间。
纽盾安全研究院收到该信息后,针对政府、金融、电子商务及重要在线系统,立即着手研究,在抽样了500万台主机,发现使用OpenSSL的主机共计38505台,其中受该高危漏洞影响的主机共12498台,占OpenSSL使用总数的32.5%,其中受影响最大的地区为广东、北京、香港、浙江和中国台湾。
网络安全方面所面临的挑战不容乐观,任何应用程序都可能具有潜在的弱点并暴露在攻击的威胁中。
有数据显示,近年全球网络攻击频发且成几何式增长。全球公司每年因数据泄露造成的平均损失从350万美元上升至380万美元。系统漏洞和黑客攻击事件不断增加,攻击泛滥已成互联网行业重病。
2015已经悄然走过了一半,网络安全风暴有风起云涌之势,数据安全、信息泄露事件如同暴风雨一样愈演愈烈。目前的黑客攻击分为2大类,第一是大流量的攻击导致企业和网站瘫痪不能正常运作,第二也是破坏性更大的是窃取机密数据,对企业来说就是用户资料、企业发展前景规划等。这些机密数据一旦泄漏,后果不堪设想。
网络犯罪集团一直努力不懈以改进其攻击手法,而且百折不挠。没有什么威胁是微不足道的。黑客不需太复杂的恶意程序就能让目标瘫痪。1个简单的信息清除程序,一旦渗透到企业防御内部,就能对企业造成毁灭性影响。
为了实现企业的自我保护,必然要采用相应的防护手段。“纽盾安全研究院”,基于用户现实需求与全面的市场调研相结合的严格的产品研发标准,着力于研究国内外新的网络安全热点和漏洞。立足于漏洞,研发保护网。我院的团队成员来自全球各地网络安全行业的顶级公司和院校,在该领域拥有最先进的计算机技术和最丰富的实战经验。虽然漏洞屡禁不鲜,且绝对意义上的安全并不存在,但我们能做的是竭尽所能为企业保驾护航,并在漏洞发生的最短时间内定位处理。纽盾网安的使命是让网络更安全,我们也一直在朝这个方向不断迈进。(文/魔都一枝花)(想了解更多请关注:微信Newdon_China 微博:纽盾网安)
本文标题:openssl心脏出血漏洞-关于OpenSSL“心脏出血”漏洞的分析61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1