AI 驅動的網路攻擊:如何偵測、預防及抵禦智慧型威脅

立即閱讀
我們利用人工智慧進行網站翻譯,雖然我們力求準確性,但它們可能並不總是 100% 精確。感謝您的理解。

IngressNightmare: CVE-2025-1974 遠端執行程式碼漏洞及補救措施

by OPSWAT 發布
分享此文章

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 (嚴重程度):

CVE-2025-1974 的 CVSS 指標 UI 顯示 IngressNightmare 的可利用性和影響選項

本分析的主要組成部分

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 (IngressNightmare) 圖表顯示 Kubernetes Ingress NGINX 控制器工作流程中的 AdmissionReview

漏洞開發與技術分析

開發機制

CVE-2025-1974 的攻擊核心始於惡意請求。攻擊者向 AdmissionReview webhook 發出惡意請求,迫使 NGINX 在執行時動態載入共用函式庫。根據此機制,我們的研究人員分析了 AdmissionReview webhook 和 NGINX 工作流程,以瞭解此攻擊路徑。

CVE-2025-1974 (IngressNightmare) 圖表顯示透過惡意入口物件和 NGINX 利用 Kubernetes 的路徑

範本注入漏洞

在 AdmissionReview webhook 上,當處理傳入的要求時,CheckIngress函式會將 Kubernetes Ingress Objects 轉換為有效的 NGINX 配置檔案。流程如下:

顯示 CVE-2025-1974 (IngressNightmare) 漏洞相關範本注入邏輯的 Go 程式碼片段
  1. 每個組態都會被解析並傳送至generateTemplate,以根據預先定義的 NGINX 模版進行格式化。
  2. 之後,testTemplate會針對底層 NGINX 二進位檔驗證已產生的組態。

所有 NGINX 配置都基於 ingress-nginx 原始碼中的 nginx.tmpl 檔案中的預定義範本:

顯示與 CVE-2025-1974 (IngressNightmare) 相關的範本注入漏洞的程式碼片段

generateTemplate函式中,組態會被處理,如以下程式碼片段所示:

顯示與 CVE-2025-1974 (IngressNightmare) 模板注入相關的注解解析邏輯的 Go 程式碼片段

然而,輸入驗證及淨化並不足夠。具體來說,Ingress 物件的uid 欄位會直接插入 NGINX 配置範本中,從而產生一個注入點。攻擊者可以利用這一點,提供製作的輸入,例如uid="1234#;\n\n}\n}\n injection_value"

此惡意輸入允許全局範圍注入到 NGINX 模板,使攻擊者能夠觸發任意 NGINX 指令,並可能達到 RCE。

Nginx 配置程式碼顯示與 CVE-2025-1974 (IngressNightmare) 漏洞相關的範本注入

從模板注入到遠端程式碼執行

testTemplate() 函式說明

在 NGINX 配置由generateTemplate函式產生後,testTemplate函式會建立臨時配置檔案,並使用命令nginx -c {config_file} 執行 NGINX 函式庫。-t.這會強制 NGINX 二進位解析並驗證配置。

與 CVE-2025-1974 (IngressNightmare) 漏洞相關的 testTemplate() 函式和介面的 Go 程式碼

要利用這個漏洞,攻擊者需要找出一個能夠執行惡意程式碼的指令。最初,我們的研究員發現load_module指令可能有用,因為此指令允許 NGINX 載入外部外掛程式。然而,此指令僅允許在配置解析的早期階段使用,與我們的注入點並不相符。

顯示與 CVE-2025-1974 (IngressNightmare) 相關的 load_module 語法與上下文的程式碼截圖
終端機輸出顯示與 CVE-2025-1974 (IngressNightmare) load_module 錯誤相關的 nginx 配置測試失敗

為了解決這個難題,我們繼續深入研究,結果發現了ssl_engine指令,其描述為「在配置測試期間,該模組可能會被 OpenSSL 動態載入」。這引起了我們的好奇心,因為它具有動態載入模組的能力,因此有必要進行更深入的研究。

解釋 CVE-2025-1974 (IngressNightmare) 上下文的 ssl_engine 裝置語法的程式碼截圖

瞭解 ssl_engine 指令

為了深入瞭解 NGINX 如何處理ssl_engine指令,以及確定 NGINX 允許透過此指令動態載入其他模組的條件,我們研究了 NGINX 原始碼。

顯示 NGINX 配置解析的 C 程式碼片段,與 CVE-2025-1974 (IngressNightmare) ssl_engine 指令相關

啟動時,NGINX會載入初始狀態,然後逐行解析配置檔案。每條指令都由nginx_command_t結構處理,其中ssl_engine指令直接調用ngx_openssl_commands

與 CVE-2025-1974 (IngressNightmare) ssl_engine 指令相關的 ngx_command_s 的 C 結構定義
圖 1. ngx_command_s 定義
顯示與 CVE-2025-1974 (IngressNightmare) 相關的 ssl_engine 指令陣列的程式碼片段
圖 2 ssl_engine ngx_command_t 結構

在分析ngx_openssl_commands函式時,我們的研究員發現它依賴 OpenSSL 支援,特別是用於硬體加速 SSL 模組的ENGINE_by_id函式。

顯示與 CVE-2025-1974 (IngressNightmare) 分析相關的 ssl_engine 指令邏輯的 C 程式碼片段

而在分析ENGINE_by_id函式時,我們確定它可以啟用共用函式庫的動態載入。此外,如果函式庫是以 __attribute__((constructor)) 擴充欄位編譯的,則在載入時可立即執行相關的函式。這表示利用ssl_engine指令,攻擊者可以在主機上傳入任意的共用程式庫,可能導致 RCE。

針對共用程式庫與攻擊策略

為了可靠地促進代碼的執行,下一步涉及到確定一個共享庫。與其依賴外部函式庫,NGINX 本身的行為會產生一個更可行且更受控制的方法:用戶端正文緩衝機制。此功能可讓 NGINX 將大量傳入的要求卸載到暫存檔案中,並根據可預測的檔案處理行為開啟利用機會。

nginx.conf 程式碼顯示臨時路徑和緩衝區設定,與 CVE-2025-1974 (IngressNightmare) 攻擊相關

預設情況下,當接收到的請求超過 8KB 時,NGINX 會將請求體寫入一個位於 /tmp/nginx/client-body 的臨時檔案,使用的檔案名稱格式為 cfg-{random_value}。這些臨時檔案在成功接收訊息的大塊之間最多保留 60 秒。

CVE-2025-1974 (IngressNightmare) 圖表顯示針對 NGINX 共用程式庫和暫存檔案的攻擊流程

將部分請求正文寫入臨時檔案後,NGINX 會延遲刪除,直到收到完整的正文為止。如果請求仍未完成,且在長達 60 秒的時間內未收到任何資料,則檔案最終會被清除。然而,攻擊者可藉由故意保留最後一大塊資料,讓臨時檔案繼續使用,使它成為可利用的漏洞。

顯示 CVE-2025-1974 (IngressNightmare) 攻擊流程針對 NGINX 共用程式庫和刪除檔案的圖表

雖然上傳的檔案內容可以控制,但由於檔案名稱是隨機的,因此在檔案系統上定位檔案是很困難的。儲存路徑可以使用client_body_temp_path 設定,但檔案名稱是在執行時隨機產生,因此無法預測。這種隨機性大大妨礙了目標存取,即使是透過暴力手段。為了克服這個問題,研究團隊利用 Linux 作業系統的固有行為。考慮以下範例:

利用 CVE-2025-1974 (IngressNightmare) 檔案寫入與無限循環邏輯的 Python 程式碼

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).

顯示與 CVE-2025-1974 (IngressNightmare) 攻擊策略相關的程序與檔案描述符詳細資訊的終端輸出

模擬剝削

基於上述分析,Ingress-NGINX pod 內 RCE 的實用開發方法是:

  1. 使用 NGINX 的 client body buffer 機制上傳惡意的共用函式庫,將其暫時存放在檔案系統上。
  2. 使用範本注入啟動暴力嘗試,強迫 NGINX 透過易受攻击的指令載入先前上傳的共用函式庫。
VE-2025-1974 (IngressNightmare) 攻擊流程圖顯示透過 Ingress-NGINX 到 NGINX 的攻擊路徑

製作包含共用資料庫的 Payload

為了確保在載入時執行程式碼,惡意共享函式庫中定義了一個具有構建器擴充的入口點函式。這個函式會在 NGINX 載入時執行,目的是建立與遠端主機的反向 shell 連線。 

CVE-2025-1974 (IngressNightmare) 有效載荷製作的 C 程式碼,包含共用函式庫和反向 shell 指令

編譯完成後,產生的共用函式庫大小剛好超過 8KB,允許 NGINX 對其進行緩衝,而不需要額外的填充。

終端機列單顯示 CVE-2025-1974 (IngressNightmare) 有效載荷建立的 danger.so 共用函式庫

之後,我們的研究人員製作了一個具有誇大Content-Length值(例如 1MB)的請求,以引入大小不匹配。這會導致 NGINX 緩衝整個正文,而不是立即處理,以確保共用物件會寫入可預測的位置。

利用共用程式庫製作有效載荷的 Go 程式碼,與 CVE-2025-1974 (IngressNightmare) 漏洞相關

透過注入觸發共用資料庫

有了共享函式庫之後,我們接下來使用易受攻擊的uid 欄位,在 NGINX 配置中注入惡意指令。這個指令包含指向緩衝檔案路徑的ssl_engine

JSON 程式碼顯示針對 CVE-2025-1974 (IngressNightmare) 漏洞注入的 Kubernetes Ingress 物件

成功的 RCE 需要ssl_engine指令引用緩衝檔案的正確路徑。這可以透過自動化的暴力腳本來實現,該腳本會有系統地遍歷程序 ID 和檔案描述符的可能組合,以識別指向緩衝共用物件的有效符號連結。

透過共用函式庫注入和 webhook 驗證利用 CVE-2025-1974 (IngressNightmare) 的 Go 程式碼

以下是觸發攻擊的 NGINX 模版產生範例。

Nginx 配置程式碼顯示透過 ssl_engine 與 mirror 指令注入 CVE-2025-1974 (IngressNightmare)

成功利用後,攻擊者可在 ingress-nginx pod 的情境下取得 shell 存取權限,而該 pod 預設可存取敏感的 Kubernetes 群集機密。

顯示 kubectl get secrets -A 指令的終端機輸出,與 CVE-2025-1974 (IngressNightmare) 相關

緩解與補救

為了有效降低與 CVE-2025-1974 相關的風險,組織需要一套解決方案,對其開放原始碼元件提供可見性與控制。

OPSWAT SBOMMetaDefender® 平台中的一項基礎技術,可透過提供所有軟體元件、程式庫、Docker 容器和使用中的相依性清單,滿足此需求。它可讓組織主動追蹤、保護和更新其元件。

顯示 nginx-ingress-controller 中 CVE-2025-1974 (IngressNightmare) 重大漏洞的使用者介面截圖

在上面的例子中,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 可協助組織符合法規遵循的要求。
標籤:

隨時瞭解OPSWAT 的最新資訊!

立即註冊,即可收到公司的最新消息、 故事、活動資訊等。