理解 Nginx Rift:一個長達十年的堆疊溢位導致 RCE

"Nginx Rift" (CVE-2026-42945) 的披露在基礎設施社群中引起了漣漪。這個漏洞並非由近期功能引入的新錯誤,而是存在於 ngx_http_rewrite_module 中的堆疊緩衝區溢位,自 0.6.27 版本以來就一直存在,可以追溯到 2008 年。

由於 Nginx 是全球部署最廣泛的 Web 伺服器之一,這種能夠實現未經身份驗證的遠端程式碼執行 (RCE) 的缺陷,對於任何使用 URL 重寫規則來管理應用程式、PHP 後端或其他服務流量的組織來說,都是一個關鍵的隱憂。

技術根本原因

該漏洞源於經典的「兩次掃描」腳本引擎錯誤。在 ngx_http_rewrite_module 中,Nginx 在第一次掃描時執行長度計算,然後在第二次掃描時使用 ngx_escape_uri 執行實際的複製操作。

當使用特定的配置模式時——特別是 rewrite 指令包含一個在替換字串中帶有問號 (?) 的模式,隨後接著一個引用了未命名正規表示式擷取群組(例如 $1$2)的 setif 或另一個 rewrite 指令——長度計算將無法考慮 URI 的擴展。這種差異導致在數據實際複製到緩衝區時發生堆疊緩衝區溢位。

利用鏈:從溢位到 RCE

公開的驗證碼 (PoC) 展示了這種記憶體損壞如何被武器化為完整的 RCE。攻擊向量包括:

  1. 跨請求堆疊 Feng Shui: 攻擊者透過操縱多個請求的堆疊佈局,將目標對象放置在可預測的位置。
  2. 記憶體池清理指標損壞: 透過觸發溢位,攻擊者會損壞 Nginx 記憶體池清理機制中的指標,從而允許他們劫持程序的控制流。

ASLR 之爭

A 資訊安全專家之間存在重大討論的一個點是位址空間配置隨機化 (ASLR) 的角色。提供的 PoC 假設 ASLR 已停用以簡化演示。然而,正如社群中的安全專家所指出的,ASLR 是一種縱深防禦措施,而非完整的解決方案。

"ASLR 是一種旨在增加利用難度的縱深防禦技術。在幾乎所有情況下,包含一個 ASLR 繞過方法只是時間與技術問題。這兩項要求每隔幾週就會被 LLM 代理降低。"

假設 ASLR 提供完全免疫力是一種危險的誤解;無論系統緩解措施的當前狀態如何,都必須修補根本原因。

緩解與修復

立即修補

F5 已為 Nginx 發布了修補程式。使用者應立即更新至以下版本:

  • OSS: 1.31.0 與 1.30.1
  • Plus: 請參閱 F5 官方公告 (K000161019)。
  • OpenResty: 已針對 1.27 與 1.29 版本發布修補程式。

配置工作迴避方案

如果無法立即修補,主要的緩解措施是在重寫定義中避免使用未命名擷取群組。

易受攻擊的模式: rewrite ^/old/(.*)$ /new/$1?arg=1 last;

緩解後的模式:$1$2 替換為具名擷取群組(例如 $user_id$section)。具名擷取群組可以避免觸發溢位的重寫模組特定邏輯路徑。

更廣泛的影響

Nginx Rift 的發現特別值得注意,因為它是安全分析工具在 Nginx 源碼的一次點擊導入後,自主發現的。這突顯了自動化分析與 AI 輔助發現「永久性錯誤 (forever bugs)」——即隱藏在眾所皆見之處近二十年的漏洞——所扮演日益增長的角色。

此外,該漏洞也引發了關於 C 語言開發軟體的長壽問題的討論。雖然 Nginx 的穩定性受到讚譽,但記憶體不安全語言的固有風險持續推動著對使用記憶體安全語言(如 Go (Caddy) 或 Java (Jetty))編寫的替代方案的興趣,儘管這些語言也有其自身獨特的漏洞集。

Sources