Apache HTTP Server 最近發布了安全性更新,用以修復一個追蹤編號為 CVE-2026-23918 的嚴重漏洞。這個漏洞存在於處理 HTTP/2 協定的 mod_http2 模組中,最高風險等級可導致伺服器崩潰(DoS)甚至讓攻擊者遠端執行任意指令(RCE)。對於維運工程師來說,這是一個典型的記憶體管理錯誤案例,理解其成因有助於掌握伺服器安全防護的關鍵。
漏洞成因:記憶體重複釋放(Double Free)
這次漏洞的核心問題在於記憶體管理中的 Double Free,也就是同一塊記憶體空間被程式碼重複釋放了兩次。在 C 語言開發的系統中,如果對已經釋放的記憶體再次呼叫釋放指令,會導致記憶體管理機制損壞,進而造成程式崩潰或被攻擊者利用來控制程式流程。
具體來說,問題發生在 Apache 處理 HTTP/2 串流(Stream)的清理路徑中。當客戶端發送一個 HEADERS 框架(用於傳遞請求標頭),緊接著在伺服器尚未正式註冊該串流之前,立即發送一個帶有錯誤碼的 RST_STREAM 框架(用於取消串流),就會觸發這個 Bug。
由於處理邏輯的缺陷,系統會連續觸發兩個回呼函數,而這兩個函數最終都會呼叫相同的清理程序。這導致同一個串流的指標被兩次推入清理陣列中。當伺服器後續執行清理動作時,第一次呼叫會正常釋放記憶體,但第二次呼叫則會嘗試釋放已經不存在的記憶體,導致系統崩潰。
攻擊影響:從服務中斷到遠端控制
這個漏洞會根據伺服器的配置產生兩種截然不同的影響。
第一種是拒絕服務攻擊(DoS)。這是最容易實現的攻擊方式。攻擊者不需要任何身份驗證,也不需要特殊的 URL 或標頭,只要建立一個 TCP 連線並發送上述的兩個特定框架,就能讓處理該請求的工作線程(Worker)直接崩潰。雖然 Apache 會自動重啟崩潰的線程,但該線程上所有正在處理的請求都會被中斷。如果攻擊者持續發送此類請求,伺服器將無法正常提供服務。
第二種是遠端執行程式碼(RCE)。這需要更複雜的條件。攻擊者可以利用記憶體重新分配的特性,在記憶體被釋放後,迅速將一個偽造的結構體填入該地址。透過操縱 Apache Portable Runtime (APR) 的記憶體分配器(特別是在 Debian 體系或官方 Docker 鏡像中預設使用的 mmap 分配器),攻擊者可以將清理函數的指標指向系統指令執行函數(如 system())。
此外,由於 Apache 的 Scoreboard(用於記錄工作進程狀態的共享記憶體區域)在伺服器運行期間位於固定地址,即使開啟了 ASLR(位址空間配置隨機化,一種防止預測記憶體地址的安全機制),攻擊者仍能將其作為存放偽造指令的穩定容器,從而提高攻擊成功率。
受影響範圍與防禦建議
本次漏洞主要影響 Apache HTTP Server 2.4.66 版本。如果你的伺服器使用了 mod_http2 模組且採用多線程 MPM(多處理模組,決定伺服器如何處理請求的機制),則處於風險之中。值得注意的是,使用 prefork MPM(單進程模式)的配置不受此漏洞影響。
由於 HTTP/2 在現代生產環境中被廣泛啟用,且 mod_http2 通常是預設編譯的一部分,因此攻擊面相當大。
最有效的解決方案是立即將 Apache HTTP Server 更新至 2.4.67 或更高版本。對於無法立即更新的環境,應檢查是否能暫時禁用 HTTP/2 協定,直到補丁完成部署。
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。