Heartbleed
Heartbleed 會導致伺服器崩潰嗎?
我知道基本的 Heartbleed 漏洞及其後果和原因。但是,我最近讀到 Heartbleed 可能會導致伺服器崩潰。我想知道這個說法是否屬實,如果是,為什麼會這樣。
據我了解,Heartbleed 只是將客戶端請求的長度發回並錯過以檢查該長度是否真的正確。所以我真的不明白如何通過讀取數據使伺服器崩潰?
這個問題的答案涉及到分頁工作原理的一些背景知識。在現代作業系統中,應用程序不訪問物理記憶體地址,而是訪問虛擬記憶體地址。虛擬記憶體和物理記憶體之間的映射發生在稱為頁面的塊中。頁面大小取決於硬體,最常見的一面是 4KB。
當一個程序啟動時,大部分虛擬記憶體地址空間是空的。訪問它會導致作業系統核心陷入陷阱,這可能會終止程序並可能會記錄事件。
由於程序需要記憶體,它一次向作業系統請求一個或多個頁面的記憶體。
heartbleed bug 將允許洩漏多達 64KB 的數據。這意味著它可以跨越多達 16 個頁面邊界(換句話說,它可以跨越 17 個頁面)。這些頁面中的第一個是儲存合法數據的位置,因此該頁面保證存在。但是後面的 16 頁虛擬地址空間可能還沒有分配。如果發生這種情況,將不會返回 64KB 的數據,作業系統核心將不得不處理這種情況。如果沒有定義恢復機制,程序將被殺死。
根據伺服器軟體的設計,它可以通過簡單地生成一個新程序來自動恢復。我認為 Apache 會產生一個新程序。其他軟體可能不會自動重生。在這種情況下,heartbleed 可能會導致伺服器軟體崩潰並停機。
由於心臟出血,作業系統不可能完全崩潰。它需要一個不同的錯誤來使作業系統崩潰。