ingress-nginx 中的漏洞允許程式碼執行和接管 Kubernetes 集群

Kubernetes 專案開發的 ingress-nginx 入口控制器中被發現有四個漏洞,這些漏洞允許攻擊者在使用 Kubernetes 平台的雲端系統的伺服器上執行其程式碼,並獲得對 Kubernetes 叢集的完全特權存取。這些問題被評為嚴重(滿分 9.8 分,得分 10)。發現這些問題的研究人員將這些漏洞命名為 IngressNightmare,並指出這些漏洞影響了約 43% 的雲端環境。該漏洞已在 ingress-nginx 1.11.5 和 1.12.1 版本中修復。

Ingress 控制器可作為網關,在 Kubernetes 中用於提供從外部網路對叢集內服務的存取。 ingress-nginx 控制器是最常用的,它使用 服務器 NGINX 用於叢集轉送、路由外部請求和負載平衡。 Kubernetes 專案為 AWS、GCE 和 nginx 提供了基本的入口控制器,其中 nginx 與 F5/NGINX 維護的 kubernetes-ingress 控制器無關(相關漏洞不影響 NGINX 開發人員開發的專案;ingress-nginx 名稱中提及 nginx 只是因為使用了 nginx 作為代理)。

這些漏洞允許未經身份驗證的攻擊者在 ingress-nginx 控制器的上下文中執行其程式碼,並能夠向 Admission Web 處理程序發送請求。網路掃描發現了超過 6500 個存在漏洞的 Kubernetes 集群,這些集群使用了公開暴露的易受攻擊的控制器,並且其 Admission 處理程序暴露給外部請求。

在預設配置中,攻擊者啟動的程式碼可以存取 Ingress 物件的設置,其中包括儲存存取 Kubernetes 伺服器的憑證,從而允許對整個叢集進行特權存取。作為一種解決方法,建議停用 ingress-nginx 中的「驗證准入控制器」功能。

Admission 控制器在單獨的 pod 環境中執行,並在部署之前執行驗證傳入的入口物件的操作。預設情況下,Admission Web 處理程序接受來自公用網路的未經驗證的請求。在執行檢查時,Admission Controller 根據收到的 Ingress 物件的內容為 nginx http 伺服器建立配置並檢查其正確性。

已發現的漏洞可讓您透過將專門設計的入口物件直接傳送到 Admission 控制器來取代 nginx 中的設定。研究人員發現,測試請求的一些屬性(設定在「.request.object.annotations」欄位中)被直接取代到了nginx配置中。在這種情況下,不會套用產生的配置,而僅透過使用選項“-t”執行可執行檔“nginx”進行測試。

具體來說,對參數「mirror-target」、「mirror-host」(CVE-2025-1098)、「auth-tls-match-cn」(CVE-2025-1097)和「auth-url」(CVE-2025-24514)執行配置中的外部資料替換。例如,在設定行「set $target {{ $externalAuth.URL }};」使用「auth-url」參數中指定的 URL 來取代「{{ $externalAuth.URL }}」。在這種情況下,不會檢查 URL 的正確性。因此,攻擊者可以傳遞像「http://example.com/#;\nsettings」這樣的 URL 值並將自己的設定替換到設定檔中。

為了在執行「nginx -t」指令進行設定檢查期間執行任意程式碼,研究人員利用了nginx除了語法檢查之外,還會載入模組庫並開啟設定中提到的檔案來評估其可用性這一特性。例如,在處理ssl_engine指令時,該指令中指定的共用函式庫會被載入。 SSL-引擎。

為了將他們的庫加載到 Kubernetes 伺服器上,研究人員利用了 (CVE-2025-1974) 這個事實:在處理大型請求時,nginx 會將請求正文保存在一個臨時文件中,該文件會被立即刪除,但該文件的打開文件描述符仍保留在“/proc”文件系統中。透過這種方式,可以同時傳送儲存暫存檔案的請求並啟動設定檢查,其中「ssl_engine」指令指定「/proc」檔案系統中描述符的路徑。

為了讓檔案描述子長時間保持可用,可以將請求中的「Content-Length」值指定為故意大於實際傳輸的資料(伺服器將等待接收剩餘資料)。另外一個複雜因素是需要猜測與載入的共享庫相關聯的進程 PID 和檔案描述符編號,但由於容器通常使用最少數量的正在運行的進程,因此需要透過多次嘗試強力猜測所需的值。如果成功且替換的共享庫被加載,攻擊者可以存取儲存在 pod 環境內的參數,足以控制整個叢集。

若要檢查是否有漏洞的 ingress-nginx,可以執行以下指令:kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx

來源: opennet.ru

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster