2025 年 5 月,一個被稱為 IngressNightmare 的重要安全漏洞 CVE-2025-1974 被公開揭露,此漏洞會影響廣泛部署於雲端原生基礎架構的 Kubernetes ingress-nginx 控制器。此漏洞允許未經認證的攻擊者將任意配置注入 NGINX,可能導致未經授權的 RCE (遠端程式碼執行) 和整個群集受損。
作為OPSWAT 研究員計畫的一部分,我們的研究員進行了深入的技術分析,以更好地瞭解其根本原因、剝削路徑以及圍繞這一高嚴重性問題的緩解策略。
CVE-2025-1974 概觀
CVE-2025-1974 是在 ingress-nginx 1.11.4 及 1.12.0 以下版本中發現的重要範本注入漏洞。擁有 Kubernetes 叢集節點層級存取權限的攻擊者可利用此漏洞,透過 ingress-nginx 控制器使用 RCE 執行任意程式碼。
Kubernetes 安全回應委員會將此漏洞的 CVSS v3.1 分數指定為 9.8 (嚴重程度):
本分析的主要組成部分
Kubernetes 概觀
Kubernetes (K8s) 是一個開放原始碼平台,用來自動化容器化應用程式的部署、擴充與作業管理。Kubernetes 叢集通常由多台機器組成,其中可包括實體硬體和虛擬機器,共同運作以提供高度可用、可擴充和可管理的應用程式環境。
NGINX 入口控制器
NGINX 入口控制器 (ingress-nginx) 是建構在 NGINX 網頁伺服器之上的開放原始碼入口控制器。它在 Kubernetes 集群中運作,主要作為反向代理和負載平衡器。此控制器可解譯使用者定義的 Ingress 資源,並將其轉譯為可執行的 NGINX 配置,以將流量路由至群集內。
入學審查及其作用
Ingress-nginx 使用稱為 AdmissionReview 的 webhook 服務與 Kubernetes 整合。這項服務對於處理原生的 Kubernetes Ingress 物件,並將其轉換為經過驗證且語法正確的 NGINX 配置而言,至關重要。雖然 AdmissionReview 可確保配置的正確性,但它獨立於 ingress-nginx 控制器運作,通常缺乏嚴格的驗證控制。缺乏嚴格的驗證是造成 CVE-2025-1974 可被利用的關鍵因素。
漏洞開發與技術分析
開發機制
CVE-2025-1974 的攻擊核心始於惡意請求。攻擊者向 AdmissionReview webhook 發出惡意請求,迫使 NGINX 在執行時動態載入共用函式庫。根據此機制,我們的研究人員分析了 AdmissionReview webhook 和 NGINX 工作流程,以瞭解此攻擊路徑。
範本注入漏洞
在 AdmissionReview webhook 上,當處理傳入的要求時,CheckIngress函式會將 Kubernetes Ingress Objects 轉換為有效的 NGINX 配置檔案。流程如下:
- 每個組態都會被解析並傳送至generateTemplate,以根據預先定義的 NGINX 模版進行格式化。
- 之後,testTemplate會針對底層 NGINX 二進位檔驗證已產生的組態。
所有 NGINX 配置都基於 ingress-nginx 原始碼中的 nginx.tmpl 檔案中的預定義範本:
在generateTemplate函式中,組態會被處理,如以下程式碼片段所示:
然而,輸入驗證及淨化並不足夠。具體來說,Ingress 物件的uid 欄位會直接插入 NGINX 配置範本中,從而產生一個注入點。攻擊者可以利用這一點,提供製作的輸入,例如uid="1234#;\n\n}\n}\n injection_value"。
此惡意輸入允許全局範圍注入到 NGINX 模板,使攻擊者能夠觸發任意 NGINX 指令,並可能達到 RCE。
從模板注入到遠端程式碼執行
testTemplate() 函式說明
在 NGINX 配置由generateTemplate函式產生後,testTemplate函式會建立臨時配置檔案,並使用命令nginx -c {config_file} 執行 NGINX 函式庫。-t.這會強制 NGINX 二進位解析並驗證配置。
要利用這個漏洞,攻擊者需要找出一個能夠執行惡意程式碼的指令。最初,我們的研究員發現load_module指令可能有用,因為此指令允許 NGINX 載入外部外掛程式。然而,此指令僅允許在配置解析的早期階段使用,與我們的注入點並不相符。
為了解決這個難題,我們繼續深入研究,結果發現了ssl_engine指令,其描述為「在配置測試期間,該模組可能會被 OpenSSL 動態載入」。這引起了我們的好奇心,因為它具有動態載入模組的能力,因此有必要進行更深入的研究。
瞭解 ssl_engine 指令
為了深入瞭解 NGINX 如何處理ssl_engine指令,以及確定 NGINX 允許透過此指令動態載入其他模組的條件,我們研究了 NGINX 原始碼。
啟動時,NGINX會載入初始狀態,然後逐行解析配置檔案。每條指令都由nginx_command_t結構處理,其中ssl_engine指令直接調用ngx_openssl_commands。
在分析ngx_openssl_commands函式時,我們的研究員發現它依賴 OpenSSL 支援,特別是用於硬體加速 SSL 模組的ENGINE_by_id函式。
而在分析ENGINE_by_id函式時,我們確定它可以啟用共用函式庫的動態載入。此外,如果函式庫是以 __attribute__((constructor)) 擴充欄位編譯的,則在載入時可立即執行相關的函式。這表示利用ssl_engine指令,攻擊者可以在主機上傳入任意的共用程式庫,可能導致 RCE。
針對共用程式庫與攻擊策略
為了可靠地促進代碼的執行,下一步涉及到確定一個共享庫。與其依賴外部函式庫,NGINX 本身的行為會產生一個更可行且更受控制的方法:用戶端正文緩衝機制。此功能可讓 NGINX 將大量傳入的要求卸載到暫存檔案中,並根據可預測的檔案處理行為開啟利用機會。
預設情況下,當接收到的請求超過 8KB 時,NGINX 會將請求體寫入一個位於 /tmp/nginx/client-body 的臨時檔案,使用的檔案名稱格式為 cfg-{random_value}。這些臨時檔案在成功接收訊息的大塊之間最多保留 60 秒。
將部分請求正文寫入臨時檔案後,NGINX 會延遲刪除,直到收到完整的正文為止。如果請求仍未完成,且在長達 60 秒的時間內未收到任何資料,則檔案最終會被清除。然而,攻擊者可藉由故意保留最後一大塊資料,讓臨時檔案繼續使用,使它成為可利用的漏洞。
雖然上傳的檔案內容可以控制,但由於檔案名稱是隨機的,因此在檔案系統上定位檔案是很困難的。儲存路徑可以使用client_body_temp_path 設定,但檔案名稱是在執行時隨機產生,因此無法預測。這種隨機性大大妨礙了目標存取,即使是透過暴力手段。為了克服這個問題,研究團隊利用 Linux 作業系統的固有行為。考慮以下範例:
This code opens a file and keeps it in an active state, closely mimicking the behavior of NGINX's client body buffer mechanism. Using /proc/{pid}/fd directory, attackers can find symbolic links created by the Linux kernel that map open file descriptors to their corresponding file paths. This route allows attackers to reduce the brute-force space to only two variables: the process ID (pid) and the file descriptor (fd).
模擬剝削
基於上述分析,Ingress-NGINX pod 內 RCE 的實用開發方法是:
- 使用 NGINX 的 client body buffer 機制上傳惡意的共用函式庫,將其暫時存放在檔案系統上。
- 使用範本注入啟動暴力嘗試,強迫 NGINX 透過易受攻击的指令載入先前上傳的共用函式庫。
製作包含共用資料庫的 Payload
為了確保在載入時執行程式碼,惡意共享函式庫中定義了一個具有構建器擴充的入口點函式。這個函式會在 NGINX 載入時執行,目的是建立與遠端主機的反向 shell 連線。
編譯完成後,產生的共用函式庫大小剛好超過 8KB,允許 NGINX 對其進行緩衝,而不需要額外的填充。
之後,我們的研究人員製作了一個具有誇大Content-Length值(例如 1MB)的請求,以引入大小不匹配。這會導致 NGINX 緩衝整個正文,而不是立即處理,以確保共用物件會寫入可預測的位置。
透過注入觸發共用資料庫
有了共享函式庫之後,我們接下來使用易受攻擊的uid 欄位,在 NGINX 配置中注入惡意指令。這個指令包含指向緩衝檔案路徑的ssl_engine:
成功的 RCE 需要ssl_engine指令引用緩衝檔案的正確路徑。這可以透過自動化的暴力腳本來實現,該腳本會有系統地遍歷程序 ID 和檔案描述符的可能組合,以識別指向緩衝共用物件的有效符號連結。
以下是觸發攻擊的 NGINX 模版產生範例。
成功利用後,攻擊者可在 ingress-nginx pod 的情境下取得 shell 存取權限,而該 pod 預設可存取敏感的 Kubernetes 群集機密。
緩解與補救
為了有效降低與 CVE-2025-1974 相關的風險,組織需要一套解決方案,對其開放原始碼元件提供可見性與控制。
OPSWAT SBOM 是MetaDefender® 平台中的一項基礎技術,可透過提供所有軟體元件、程式庫、Docker 容器和使用中的相依性清單,滿足此需求。它可讓組織主動追蹤、保護和更新其元件。
在上面的例子中,MetaDefender Core™ 中的SBOM 技術掃描了包含 CVE-2025-1974 漏洞的 nginx-ingress-controller 套件。系統自動將此問題標記為 Critical,並提供可用修復版本的指引,讓團隊能夠快速排定優先順序,並在漏洞被利用之前修補漏洞。
OPSWAT SBOM 可在MetaDefender Core 和MetaDefender Software Supply Chain™ 中使用,使安全團隊能夠更快地識別漏洞並採取行動。透過OPSWAT SBOM,安全團隊可以
- 快速找出易受攻擊的元件 - 立即找出受序列化攻擊影響的開放原始碼元件。這可確保迅速採取行動,修補或取代易受攻擊的函式庫。
- 確保主動修補與更新- 透過OPSWAT SBOM 持續監控開放原始碼元件,以掌握反序列化漏洞。OPSWAT SBOM 可偵測過時或不安全的元件,以便及時更新並降低遭受攻擊的風險。
- 維持法規遵循與報告- 隨著法規框架日益強制軟體供應鏈的透明度,OPSWAT SBOM 可協助組織符合法規遵循的要求。