Apache 子程序反覆崩潰,先查版本與 HTTP/2

本次維護遇到一台使用 Apache 2.4.66 與 PHP-FPM 的主機。網站首頁仍能開啟、主機負載也不高,但 Apache error_log 持續出現子程序崩潰。這類情況不能只靠服務顯示 active 或首頁 HTTP 200 就判定正常。

實際觀察到的錯誤

AH00051: child pid ... exit signal Segmentation fault (11)
AH00051: child pid ... exit signal Abort (6)
free(): invalid pointer
double free or corruption (out)

當時日誌依 UTC 日期統計,11 月 1 日有 43 次、11 月 2 日 6 次、11 月 3 日 8 次、11 月 4 日截至檢查時有 4 次子程序崩潰。主程序持續運作,因此整個網站沒有一直離線;個別請求是否受影響仍須進一步比對存取日誌。

核心堆疊出現 HTTP/2 串流清理流程

唯讀分析既有核心檔,其中一份可辨識的堆疊包含下列路徑:

c1_purge_streams
h2_mplx_c1_poll
h2_session_process
h2_c1_run

這提供 HTTP/2 處理路徑的調查線索。不過核心檔遭截斷,另一份無法取得有效堆疊,因此不能把所有崩潰都斷定為同一漏洞,也不能僅憑這些訊息認定主機遭入侵。

Apache 2.4.66 的已知 HTTP/2 漏洞

Apache 官方公告 CVE-2026-23918:Apache HTTP Server 2.4.66 的 HTTP/2 early reset 路徑存在 double-free 與可能的遠端程式執行風險,2.4.67 已修正。版本與錯誤現象相符,是本次優先排查的原因;實際是否受影響仍須核對供應商回補狀態。

另有 CVE-2026-48913,涉及檔案描述符耗盡時 mod_http2 的 use-after-free,影響 2.4.55 至 2.4.67,2.4.68 修正。本次沒有證據顯示曾耗盡檔案描述符,因此不把它列為已確認根因。

截至本次維護查核,Apache 官方提供 2.4.69。升級應使用目前受支援且包含必要安全修補的版本,而不是只停在第一個修正版本。

處理順序與驗證重點

  1. 備份 Apache 設定、執行檔、模組與編譯選項,驗證備份壓縮檔及校驗碼。這不是完整網站或資料庫備份。
  2. 先將來源站協定限制為 HTTP/1.1,檢查 Apache 設定語法後重新載入,暫時避開 HTTP/2 路徑。前端代理對訪客提供的協定須另外核對。
  3. 確認更新來源與目標版本,只更新 Apache 及必要相依元件,不順便全面升級 PHP、資料庫或其他服務。
  4. 確認實際運行程序已載入新執行檔,而不只檢查磁碟上的 httpd -v。
  5. 驗證各站首頁、搜尋、商品頁、購物車與既有登入流程;持續比對新崩潰、5xx 與錯誤日誌。

本次修補結果與觀察限制

2026 年 11 月 5 日(台北時間)已將案例主機由 Apache 2.4.66 更新為 2.4.69,官方來源壓縮檔的 SHA256 核對一致,執行中的主程序也確認載入新版。Apache 設定語法檢查通過,原有模組沒有缺漏,既有 PHP 版本與網站設定保留。四個主要網站的首頁、搜尋與購物車共 12 個公開頁面回應 HTTP 200,未見 PHP 或 SQL 致命錯誤字樣;這些頁面驗證不等於已完成付款、會員登入或全站功能測試。

更新後直接測試來源站 TLS 的 ALPN 協商,確認只選用 HTTP/1.1。維護時也發現,自訂設定若放在虛擬主機宣告之後,不能只靠檔案裡出現 Protocols http/1.1 就判定各站都已停用 HTTP/2;應以實際連線結果驗證。短時間沒有新崩潰僅代表初步驗收通過,仍需持續觀察,尚不能宣稱已證實所有歷史崩潰的根因。

官方參考資料