心脏出血漏洞

心脏出血漏洞（英语：Heartbleed bug），也简称为心血漏洞，是一个出现在加密程序库OpenSSL的安全漏洞，该程序库广泛用于实现互联网的传输层安全（TLS）协议。它于2012年被引入了OpenSSL中，2014年4月首次向公众披露。只要使用的是存在缺陷的OpenSSL实例，无论是服务器还是客户端，都可能因此而受到攻击。此问题的原因是在实现TLS的心跳扩展时没有对输入进行适当验证（缺少边界检查），因此漏洞的名称来源于“心跳”（heartbeat）。该程序错误属于缓冲区过读，即可以读取的数据比应该允许读取的还多。
心脏出血在通用漏洞披露（CVE）系统中的编号为CVE-2014-0160。加拿大网络事故响应中心发布安全公告，提醒系统管理员注意漏洞。2014年4月7日，即漏洞公开披露的同一天，OpenSSL发布了修复后的版本。
截至2014年5月20日，在80万最热门的启用TLS的网站中，仍有1.5％易受心脏出血漏洞的攻击。
因为缺陷在于OpenSSL的实现，而不是SSL/TLS协议本身，所以除了OpenSSL之外的其他TLS实现方式，如GnuTLS、Mozilla的网络安全服务（NSS）和Windows平台的TLS实现都不受影响。

历史

2012年2月，传输层安全（TLS）和数据报传输层安全（DTLS）协议的心跳扩展成为了标准，是为RFC 6520。它提供了一种无需每次都重新协商连接，就能测试和保持安全通信链路的方式。2011年，RFC的作者之一，当时杜伊斯堡-埃森大学的博士生罗宾·赛格尔曼（Robin Seggelmann）为OpenSSL实现了心跳扩展。赛格尔曼向OpenSSL发出的推送请求之后，他的更改由OpenSSL四位核心开发者之一的斯蒂芬·N·汉森（Stephen N. Henson）审核。汉森未能注意到赛格尔曼实现中的错误，于2011年12月31日将有缺陷的代码加入了OpenSSL的源代码库。2012年3月14日，OpenSSL 1.0.1版发布，漏洞开始传播。心跳支持默认是启用的，这使受影响的版本易受攻击。

发现

根据OpenSSL的马克·J·考克斯（Mark J. Cox）的说法，谷歌安全团队的尼尔·梅塔（Neel Mehta）于2014年4月1日11:09 UTC报告了心脏出血漏洞。
该漏洞由芬兰网络安全公司Codenomicon的工程师命名，该公司也设计了心脏出血标志，并设立了网站heartbleed.com向公众解释该错误。虽然谷歌的安全团队首先向OpenSSL发送了报告，但谷歌和Codenomicon几乎在同一时间分别独立地发现了这个漏洞。Codenomicon称它于2014年4月3日发现并通知了NCSC-FI以进行漏洞协调。

据信在漏洞披露时，约有17%（大约五十万）通过认证机构认证的互联网安全网络服务器容易受到攻击，导致服务器私钥和用户会话cookie及密码被盗。电子前哨基金会、Ars Technica和布鲁斯·施奈尔均认为心脏出血漏洞是“灾难性的”。福布斯网络安全专栏作家约瑟夫·斯坦伯格写道：
有些人认为，至少就其潜在影响而言，“心脏出血”是自互联网商用以来所发现的最严重的漏洞。
英国内阁发言人建议：
人们应该按照网站建议更改他们所访问网站的密码。
 大多数网站已经修复了漏洞，人们听从网站建议，从而决定是否采取行动以及采取什么行动，再合适不过了​​。
漏洞披露当日，Tor项目在其博客发布公告，建议
如果您在互联网上需要高度的匿名或隐私，在接下来的几天里应该完全远离互联网，直到问题解决。
悉尼先驱晨报于2014年4月15日刊登了事件的时间轴，其中可见一些组织在其公开披露之前就已经修补了漏洞，其中有些组织不清楚他们是如何得知这一消息的。

错误修正及部署

博德·默勒（Bodo Moeller）和谷歌的亚当·兰利（Adam Langley）完成了心脏出血漏洞的修补程序。由此产生的补丁于2014年3月21日加入到了Red Hat的问题跟踪系统中。4月7日，斯蒂芬·N·汉森在OpenSSL版本控制系统中应用了修补程序。第一个修复后的版本1.0.1g于同一天发布。截至2014年6月21日，309,197台公共网络服务器仍存在漏洞。

证书的更新及撤销

根据Netcraft的说法，截至2014年4月11日，在超过50万张可能已因心脏出血漏洞而失密的X.509证书中，约3万张已经补发，撤销的并不多。

截至2014年5月9日，仅有43％的受影响网站重发了自己的安全证书。此外，在重发的安全证书中，有7％使用了可能已泄露的密钥。Netcraft称：
若重复使用密钥，较之尚未更换SSL证书的网站，这些曾受心脏出血漏洞影响的网站面临的风险仍与之前一模一样。
每周计算机报对此评论，心脏出血漏洞是“可能持续数月，甚至是数年的危险”。

利用

加拿大税务局（CRA）称，900纳税人的社会保险号遭窃，并表示在2014年4月8日的6个小时内，有人利用了该漏洞得到了这些数据。在发现攻击后，该机构关闭了网站，并将纳税人的申报期限从4月30日延长至了5月5日。该机构表示，将向任何受影响的人提供信誉保障服务，不收取任何费用。4月16日，加拿大皇家骑警宣布，他们已掌握了一名与该盗窃有关的工程学学生信息，并指控其“未经授权使用计算机”及“有关数据的恶作剧”。
英国育儿网站Mumsnet发现部分用户帐户被劫持，CEO被假冒。该网站后发表事件声明，称其是由心脏出血漏洞所导致，且技术人员已将其及时修复。
反恶意软件研究人员还利用了该漏洞，访问了网络罪犯的秘密论坛。研究人员还特意设立了存在漏洞的机器以进行研究。例如，在2014年4月12日，至少有两位独立研究人员成功窃取了CloudFlare为此而设立的实验服务器的私钥。此外，在2014年4月15日，密歇根大学教授J·亚历克斯·黑尔德曼称，他的蜜罐服务器（旨在吸引并研究攻击的刻意留有漏洞的服务器）遭到了无数来自中国的攻击。黑尔德曼得出结论，因为这个服务器相当不起眼，这些很可能是大范围影响互联网的横扫攻击。
2014年8月报道称，黑客利用心脏出血漏洞，窃取了美国第二大营利性连锁医院机构社区卫生系统的安全密钥，导致450万份病人病历泄密。入侵发生在该漏洞首次公布后一星期。

事先可能的了解及利用

在公布后数日，许多大型网站修补了漏洞，或禁用了心跳扩展，但不清楚是否潜在攻击者早就意识到了这一点，及利用程度几何。
研究人员在检查审核日志后认为，至少在发现和公布的5个月前，一些攻击者可能已经利用了这个漏洞。不过Errata Security指出，于漏洞公开的六个月前发布并广泛使用的非恶意程序“Masscan”，会像漏洞所表现的那样，于握手时突然终止连接，从而生成相同的服务器日志消息。该公司还表示：“两样会产生相同错误消息的新东西看起来可能是有关连的，但当然，其实他们并不相关。”
据彭博新闻社，二位不愿透露姓名的内部人士称，美国国家安全局（NSA）在漏洞出现后不久就知道了它的存在，但却没有公布，而是将其作为零日漏洞予以保密，以便能为己所用。NSA否认了这一说法，美国国家情报和通信技术审议小组的理查德·A·克拉克也予以否认，该小组负责审查美国的电子监控政策。2014年4月11日，克拉克向路透社表示，NSA之前并不知道该漏洞。有关指控促使美国政府首次就其零日漏洞政策发表公开声明，接受审查小组2013年的报告中所提的建议，“在几乎所有的情况，消除广泛使用的软件代码中的漏洞比起利用它们进行情报搜集更匹配美国的国家利益”，并称保密漏洞的权力将由NSA转移到白宫。

表现

RFC 6520心跳扩展定义了一种测试TLS/DTLS安全通信链路的方法，允许连接一端的计算机发送“心跳请求”消息，消息包含有效载荷（通常是文本字符串），附带有效载荷的长度（用16位整数表示）。随后，接收方计算机必须发送完全相同的有效载荷以返回给发送方。
受影响的OpenSSL版本根据请求消息中的长度字段分配内存缓冲区，用于存储要返回的消息，而不考虑消息中有效载荷的实际长度。因为缺少边界检查，返回的消息不仅包括有效载荷，还可能含有其他恰巧在已分配缓冲区中的消息。
因此，通过构造出载荷短、长度字段中的数值却很大的请求，向存在缺陷的一方（通常是服务器）发送畸形心跳包，利用心脏出血漏洞，引起受害者的回应，这样，攻击者便可读取到受害者内存中至多64千字节的信息，而这块区域先前OpenSSL有可能已经使用过。例如，正常的心跳请求可能会要求一方“返回4个字符的单词‘bird’”，那一方就返回“bird”；“心脏出血请求”（恶意的心跳请求）如“返回500个字符的单词‘bird’”会导致受害者返回“bird”，紧接着是恰储存在受害者活跃内存中的496个字符。这样，攻击者便可能会收到敏感数据，从而危及受害者其它安全通信的保密性。虽然攻击者能对返回的内存块大小有所控制，但却无法决定它的位置，因而不能指定要显示内容。

受影响的OpenSSL实例

受影响的OpenSSL版本为1.0.1至1.0.1f（含）。较新版本（1.0.1g以上）及先前版本（1.0.0分支以前）不受影响。受影响的版本实例均存在缺陷，除非在OpenSSL编译时加上-DOPENSSL_NO_HEARTBEATS。

存在缺陷的程序和函数

存在缺陷的程序的源文件为t1_lib.c及d1_both.c，而存在缺陷的函数为tls1_process_heartbeat()及dtls1_process_heartbeat()。

补丁

可通过忽略要求了比负载更多的数据的心跳请求消息来修复此问题。
OpenSSL版本1.0.1g增加了一些边界检查，以防止过度读取缓冲区。例如，已添加了下列测试，以丢弃将引发心脏出血漏洞的心跳请求，以防产生回复：
if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */
版本控制系统有完整的更改列表。

影响

经由心脏出血漏洞发动攻击，获得的数据可能包括TLS双方将要交换、但尚未加密的机密内容，包括在用户请求中各种格式的post数据。此外，泄漏的数据还可能含有身份验证密令，如会话cookie及密码，可使攻击者向该服务冒充此用户。
攻击还可能泄漏受攻击双方的私钥，这将使攻击者能解密通信内容（将来或是之前通过被动窃听捕获而存储的通信，除非使用完全正向保密，而在这种情况下，只能解密将来通过中间人攻击截获的通信）。
即使漏洞修复之后，获得受害者认证资料的攻击者仍能伪装成资料的拥有者，只要该资料能被接受（例如，在更改密码或撤销私钥之前）。因此，漏洞对保密性构成了致命威胁。然而，冒充受害人的攻击者也能修改数据，所以间接的后果可能不只是系统机密泄漏那么简单。
一项于2014年4月对美国成人进行的调查显示，60%的人听说过心脏出血漏洞。使用互联网的受访者中有39%的人采取了行动以保护他们的在线账户，如更改密码或注销账户；29%的人认为他们的个人信息因漏洞而处于危险之中；6%的人认为他们的个人信息已遭窃取。

客户端漏洞

虽然该漏洞更多因其对服务器的威胁而受关注，使用受影响OpenSSL实例的TLS客户端也易受攻击。恶意服务器能利用该漏洞从易受攻击的客户端的内存中读取数据，这就是卫报所称的“逆向心脏出血漏洞”。安全研究员史蒂夫·吉布森（Steve Gibson）在谈及该漏洞时称，
它不只是服务器端的漏洞，它也是客户端的漏洞，因为服务器、或你连接的任何人，都能向你请求心跳包，正如你能向他们请求一样。
失窃数据可能包含用户名和密码。逆向心脏出血漏洞影响了数以百万计的应用实例。部分易受攻击的应用程序列于下面的“应用软件”一节中。

具体受影响的系统

思科系统已确认其下78种产品存在缺陷，包括IP电话系统和网真（视频会议）系统。

补救

通过将OpenSSL更新到已修补的版本（1.0.1g或更高版本），可以解决心脏出血漏洞。OpenSSL可以用作独立程序、动态共享对象或静态链接库，因此，更新可能需要重新启动加载了OpenSSL易受攻击版本的进程，及重新链接静态链接它的程序和库。实际上，这意味着更新静态链接OpenSSL的软件包，并重新启动正在运行的程序，以删除内存中旧的、易受攻击的OpenSSL代码副本。
在漏洞修复后，服务器管理员必须解决保密数据可能泄漏的问题。因为心脏出血允许攻击者得到私钥，所以必须认为这些密钥已泄密。须重新生成密钥对，使用它们的证书也要重新签发，并且吊销旧证书。心脏出血也有可能会泄漏其他在内存中的保密数据，因此，其他认证材料（如密码）也应该重新生成。很难确定受影响的系统是否没有受到损害，或者某个特定信息是否已被泄露。

浏览器安全证书吊销感知

由于漏洞威胁着私钥的安全，即使是在漏洞已修复、先前的证书已吊销后，如果受攻击网站的用户所使用的浏览器无法发现证书已吊销，漏洞仍会对他们有影响。安全证书吊销感知测试虽不测试系统是否存在心脏出血漏洞，但让用户测试他们的网页浏览器，在网站使用的证书已吊销的情况下，是否允许继续访问。因此，修复此漏洞，用户还需要更新浏览器，确保具有最新的证书吊销列表（或OCSP支持）及证书吊销功能。

根本原因、可能的教训及回应

漏洞造成的损失难以评估，不过据eWEEK估计至少为5亿美元。
戴维·A·惠勒在论文《如何防止下一个心脏出血漏洞》中分析了为什么没能更早发现漏洞，并且提出了几种可能能更快识别漏洞，以及减小其影响的方法。据惠勒所言，要防止心脏出血漏洞，最有效的方法是用一套非典型的测试包彻底执行他所说的“负面测试”，即测试无效的输入是否会导致程序失败，而非成功。惠勒强调，应有一套通用的测试包以作为所有TLS实现的基础。
据The Conversation上罗伯特·默克尔（Robert Merkel）的文章，心脏出血漏洞揭示了“风险分析上的巨大失败”。默克尔认为，OpenSSL注重性能，而不是安全，在他看来这毫无意义。但他认为，与其指责OpenSSL还不如指责它的用户，他们选择使用OpenSSL却并未提供资金以进行更好的审查和测试。他解释道，有两方面因素决定了将来还有出现类似安全漏洞的风险。首先，程序库的源代码会影响写出有类似影响漏洞的可能。默克尔提到，使用C语言就是一个有利于此种漏洞出现的危险因素，这与惠勒的分析一致。其次，OpenSSL的贡献流程会影响能快速修复错误的机率。
塔林理工大学的简思·格特鲁（Jens Getreu）在他的文章中提到，如果OpenSSL使用保证内存安全的Rust语言开发，那么心脏出血漏洞本来是可以避免的。百度则使用Rust语言实现了MesaLink TLS项目；MesaLink提供和OpenSSL兼容的API，从而可以在cURL等项目中替换OpenSSL。
西奥·德·若特，OpenBSD和OpenSSH项目的创始人和领导者，就同一方面批评OpenSSL的开发人员编写自己的内存管理程序，如他所说的那样，这就绕过了OpenBSD C标准函数库对漏洞的防范，他说“OpenSSL是由一个不负责任的团队开发的。”继心脏出血漏洞披露之后，OpenBSD项目的成员从OpenSSL复刻出了LibreSSL。
修改程序而导致该漏洞的程序员罗宾·赛格尔曼声称自己“忽略掉了对长度变量的验证”，并否认提交有缺陷的实现是刻意为之。在漏洞公开后，赛格尔曼就另一方面提出了建议，指出OpenSSL没有经过足够多的人的审查。虽然他的工作经过了OpenSSL核心开发人员的审查，审查的目的却主要是验证功能的改进是否正确，这会使漏洞更容易放过。

OpenSSL核心开发者本·劳里称，OpenSSL的安全审查本可以发现心脏出血漏洞。软件工程师约翰·沃尔什（John Walsh）评论道：
想想看，OpenSSL仅有两名（全职）雇员，却要编写、维护、测试、审查50万行的关键业务代码。
OpenSSL基金会主席史蒂夫·马奎斯（Steve Marquess）说：“奇怪之处不在于几名超负荷工作的志愿者漏过了这个错误；真正神奇的是这种事之前都没有发生。”戴维·A·惠勒认为通常情况下，审查是一种发现漏洞的很好方式，但他指出，“OpenSSL使用了过于复杂的结构，使它更难为人类和机器所审查。”他写道：
在简化代码上应不断努力，否则若只是添加功能，软件的复杂度就会逐渐增加。随着时间的推移，代码应及时重构，使之简洁明了，而不只是不断地添加新功能。要达成的目标应该是让代码“显然正确”，而不是使代码变得太复杂，以至于“我看不出有什么问题”。
LibreSSL进行了大规模的代码清理，仅在第一周内就移除了超过90000行C代码。
据安全研究人员丹·卡明斯基说，心脏出血漏洞是该基金会经济问题的征兆，这需要解决。从发现这个在“关键”依赖包中一个简单功能的简单错误所花费的时间来看，卡明斯基担心如不采取任何措施，未来还会有无数这样的漏洞。在发现漏洞时，OpenSSL仅有少数志愿者负责维护，其中只有一人将其作为全职工作。每年OpenSSL项目收到的捐款大约为2000美元。Codenomicon的心脏出血漏洞网站呼吁为OpenSSL项目捐款。在了解到漏洞披露后的两三天内，捐款总额为841美元后，卡明斯基说：“我们正在制造全球经济中最重要的技术，依靠的却是投入资金少得让人惊讶的基础设施。”核心开发者本·劳里则认为项目资金“完全没有着落”。尽管OpenSSL软件基金会没有错误赏金计划，但互联网错误赏金计划主动给发现心脏出血漏洞的尼尔·梅塔奖励了15000美元，以表彰她将其披露的负责任行为。
保罗·基乌萨诺（Paul Chiusano）认为是软件经济学的失败导致了此漏洞。
面对此次危机，行业集体反应，2014年4月24日Linux基金会宣布成立核心基础架构联盟，这是一个数百万美元的项目，能为处在全球信息基础架构中的关键要素提供资金。出资人包括亚马逊、戴尔、Facebook、富士通、谷歌、IBM、英特尔、微软、NetApp、Rackspace、VMware和Linux基金会。该联盟旨在让开发人员能全职在项目上工作，并且支付安全审计、硬件和软件基础设施，旅行及其他费用。OpenSSL是该联盟资金首位获得者的候选人。
此漏洞后，谷歌成立了Project Zero寻找零日漏洞，来帮助保护网络和社会。