資安事件與漏洞

Heartbleed(CVE-2014-0160)——OpenSSL 漏洞洩漏伺服器記憶體的事件

Heartbleed(CVE-2014-0160)是 2014 年發現的 OpenSSL 漏洞,可能洩漏伺服器記憶體中的私鑰與工作階段資訊。圖解原理、時間軸,以及按全部外洩處理、更換金鑰與憑證等至今有效的教訓。

發布於 2026-06-07 更新於 2026-10-23 閱讀時間 2 分鐘
本頁內容

回顧過去的重大事故,只聚焦於對當下你的維運真正有用的教訓。我們不重現攻擊,而是從防禦的視角來解讀。

2014
被發現的年份
〜17%
揭露時的SSL調查(受信任憑證)
私鑰
最壞情況下洩漏的內容
無痕跡
偵測的難度

發生了什麼:回傳資料比請求更多的 bug

TLS(HTTPS 的加密)中有一種用於維持連線的「存活確認(heartbeat)」互動。用戶端傳送一小段資料和一個「把這個回傳給我」的長度,伺服器照樣回傳。本來這只是個簡單的機制。

OpenSSL 的實作沒有檢核這個申報的長度。明明實際只傳送了幾個位元組,卻申報「回傳 64KB」,伺服器就會超出收到的資料量,把相鄰的記憶體也一併讀取並回傳。如果那裡恰好存著私鑰或工作階段,它們也會一起洩漏。

正常:傳送的長度=回傳的長度

「回傳 "bird"(4 個字元)・長度 4」→ 伺服器「bird」

↓ 若不檢核申報的長度……

Heartbleed:短傳送+大申報長度

「回傳 "bird"(4 個字元)・長度 64KB」→ 伺服器「bird+相鄰的記憶體 64KB(可能包含私鑰、工作階段等)」

本來應該『只回傳傳送的那部分』。Heartbleed 信任了申報的長度,把相鄰的記憶體也回傳了。

攻擊方不需要任何特殊權限。透過反覆多次操作,就能 一點點蒐集到記憶體的碎片。一個被大量軟體依賴的 TLS 函式庫裡的小 bug,影響了全世界 HTTPS 通訊的安全。

幾乎不留痕跡的洩漏,無法確定影響範圍

Heartbleed 不易在常規的存取日誌中留下痕跡,事後很難斷定「是否洩漏了」「洩漏了什麼」。一旦難以判斷,按最壞情況行動才是正解。

時間軸

  1. 2014-04-07

    漏洞被公開,修復版 OpenSSL 同時發布。
  2. 公開後不久

    全球伺服器一齊著手修補。影響範圍之廣引發一片譁然。
  3. 此後

    許多服務按「私鑰已外洩」的前提撤銷並重新簽發憑證,並呼籲使用者更改密碼。

為什麼只修補還不夠

既然私鑰有可能已經洩漏,那麼即便修補了,過去外洩的金鑰仍然有效。所以應對分兩部分:修復漏洞(修補),以及按已外洩的前提更換金鑰、憑證與機密。

不充分的應對

  • 更新 OpenSSL 後就認為「已經修好了」
  • 只更換確認被利用的那一個機密
  • 憑證繼續照常使用

正確的應對

  • 在更新之外,還要撤銷並重新簽發憑證(重新產生私鑰)
  • 徹底更換伺服器持有的機密、金鑰、密碼
  • 督促使用者更改密碼

對當下有用的教訓

1

按『一旦外洩就是全部外洩』處理

不是只換已確認的那一個,而是徹底更換伺服器持有的機密、金鑰、密碼。洩漏幾乎不留痕跡時,請按最壞情況行動。

2

撤銷並重新簽發憑證

既然私鑰有可能已經洩漏,憑證也要重新產生。只要不輪替金鑰,過去已洩漏的金鑰就仍然可以使用。

3

把基礎函式庫也納入監控對象

不只是應用程式,像 OpenSSL 這樣的基礎函式庫的 CVE 也要用機器監控來追蹤。依賴某個函式庫的軟體越多,影響範圍越廣。

4

理解記憶體安全的價值

「讀取的比請求的多」這類 bug,可以透過記憶體安全的設計與語言從結構上減少。在選擇所採用的技術時,把它納入考量。

接下來閱讀

來源與確認範圍

以下原始資料支持上文的設定、影響範圍或應對措施,連結於2026年10月23日確認。請核對資料中的版本與設定條件。清單優先順序及經驗是本站的整理,不代表全文重新核驗或安全保證。

FAQ

QHeartbleed 可能洩漏了什麼?
A

伺服器的記憶體內容:運氣不好時,可能包含 TLS 私鑰、工作階段內容、登入資訊等。而且這種洩漏不易留下痕跡,事後很難確定『到底洩漏了多少』,這正是棘手之處。

Q為什麼會發生『回傳的比請求的多』?
A

在維持連線的存活確認(heartbeat)中,伺服器沒有檢核對方申報的『希望回傳的長度』就直接信任了。明明實際只傳送了很短的資料,卻申報『回傳 64KB』,伺服器就會把相鄰的記憶體一併讀取並回傳。未經檢核就信任輸入(長度),正是原因所在。

Q應對中最重要的是什麼?
A

修補之後要『按已外洩處理』。具體而言,就是撤銷並重新簽發 TLS 憑證,以及徹底更換伺服器持有的機密與密碼。僅僅修復應用程式是不夠的。