心脏出血漏洞

心臟出血漏洞（英語：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）的說法，Google安全團隊的尼爾·梅塔（Neel Mehta）於2014年4月1日11:09 UTC報告了心臟出血漏洞。
該漏洞由芬蘭網路安全公司Codenomicon的工程師命名，該公司也設計了心臟出血標誌，並設立了網站heartbleed.com向公眾解釋該錯誤。雖然Google的安全團隊首先向OpenSSL傳送了報告，但Google和Codenomicon幾乎在同一時間分別獨立地發現了這個漏洞。Codenomicon稱它於2014年4月3日發現並通知了NCSC-FI以進行漏洞協調。

據信在漏洞披露時，約有17%（大約五十萬）通過認證機構認證的網際網路安全網路伺服器容易受到攻擊，導致伺服器私鑰和用戶對談cookie及密碼被盜。電子前哨基金會、Ars Technica和布魯斯·施奈爾均認為心臟出血漏洞是「災難性的」。福布斯網路安全專欄作家約瑟夫·斯坦伯格寫道：
有些人認為，至少就其潛在影響而言，「心臟出血」是自網際網路商用以來所發現的最嚴重的漏洞。
英國內閣發言人建議：
人們應該按照網站建議更改他們所存取網站的密碼。
 大多數網站已經修復了漏洞，人們聽從網站建議，從而決定是否採取行動以及採取什麼行動，再合適不過了​​。
漏洞披露當日，Tor專案在其部落格發布公告，建議
如果您在網際網路上需要高度的匿名或隱私，在接下來的幾天裡應該完全遠離網際網路，直到問題解決。
雪梨晨鋒報於2014年4月15日刊登了事件的時間軸，其中可見一些組織在其公開披露之前就已經修補了漏洞，其中有些組織不清楚他們是如何得知這一訊息的。

錯誤修正及部署

博德·默勒（Bodo Moeller）和Google的亞當·蘭利（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、富士通、Google、IBM、英特爾、微軟、NetApp、Rackspace、VMware和Linux基金會。該聯盟旨在讓開發人員能全職在專案上工作，並且支付安全審計、硬體和軟體基礎設施，旅行及其他費用。OpenSSL是該聯盟資金首位獲得者的候選人。
此漏洞後，Google成立了Project Zero尋找零日漏洞，來幫助保護網路和社會。