AWS EKS网络策略绕过漏洞:已终止Pod的防火墙规则泄露分析

本文详细分析了AWS EKS集群中Amazon VPC CNI控制器的一个安全漏洞。该漏洞导致已终止(Completed)Pod的防火墙规则未被及时清理,使得后续分配到相同IP地址的无关Pod能够绕过Kubernetes NetworkPolicy的网络访问限制,造成潜在的数据泄露和未授权访问风险。

AWS VDP | 报告 #3328291 - 已终止Pod的存在允许绕过Kubernetes网络策略

描述 当配置为管理NetworkPolicy规则时,Amazon VPC CNI控制器会错误地将已终止(Completed)Pod的防火墙规则当作Pod仍在运行来处理。这导致这些规则被错误地应用到其他不相关的Pod上——只要这些Pod恰好被分配到了与已终止Pod相同的IP地址。

例如,假设有一个Pod A,其IP地址为X。通过NetworkPolicy,Pod A被允许某些网络访问,VPC CNI控制器通过在该节点上为IP地址X添加防火墙规则来实现此策略。当Pod A终止(例如,如果它是一个Job)时,这些防火墙规则不会被移除。由于Pod已终止,其他Pod可以自由地接收相同的IP地址。如果一个未被NetworkPolicy授予任何访问权限的Pod B被分配了相同的IP地址X,那么Pod B将继承Pod A曾拥有的网络访问权限,直到已终止的Pod A被删除。

正确的行为应该是检查Pod是否已完成(Completed),并将Pod完成视为与Pod删除相同,在Pod完成时移除防火墙规则。

受影响版本 我在EKS版本1.33上测试了此问题:

  • 在启用了网络策略控制器的自动模式下
  • 在非自动模式下,使用VPC CNI插件 v1.19.5-eksbuild.1
  • 在非自动模式下,使用VPC CNI插件 v1.20.1-eksbuild.3 严格模式无任何影响。

概念验证 在启用了自动模式或设置了enableNetworkPolicytrue的VPC CNI控制器的EKS集群上,应用以下预备性Kubernetes资源:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
---
apiVersion: v1
kind: Namespace
metadata:
  name: networkpolicy-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: networkpolicy-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: whoami
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ingress
  namespace: networkpolicy-test
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          test: allowed
    ports:
    - protocol: TCP
      port: 80

此NetworkPolicy配置将允许以下Job连接到Deployment:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
---
apiVersion: batch/v1
kind: Job
metadata:
  name: allowed
  namespace: networkpolicy-test
spec:
  template:
    metadata:
      name: curl
      labels:
        test: allowed
    spec:
      containers:
        - name: curl
          image: "alpine/curl:latest"
          command: ["curl", "-v", "whoami.networkpolicy-test.svc.cluster.local:80"]
      restartPolicy: Never

但以下Job将被阻止并超时:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
---
apiVersion: batch/v1
kind: Job
metadata:
  name: blocked
  namespace: networkpolicy-test
spec:
  template:
    metadata:
      name: curl
      labels:
        test: blocked
    spec:
      containers:
        - name: curl
          image: "alpine/curl:latest"
          command: ["curl", "-v", "whoami.networkpolicy-test.svc.cluster.local:80"]
      restartPolicy: Never

然而,如果存在一个状态为Completed的允许Job,被阻止的Pod有机会接收到与已完成的允许Pod相同的IP地址。当这种情况发生时,被阻止的Pod将能够(违反NetworkPolicy)访问Deployment。

为了便于复现,建议应用附带的█████████文件来创建20个允许的Job。等待所有20个Job完成,然后应用附带的██████████文件来创建20个被阻止的Job。几乎可以肯定,一些被阻止的Pod将被分配与已完成的允许Pod匹配的IP地址,因此将能够连接到Deployment并成功退出。一些被阻止的Pod将被分配不同的IP地址,因此将正确无法连接到Deployment,挂起然后出错。

影响 摘要:在依赖Kubernetes NetworkPolicy规则来限制网络访问的EKS集群上,存在已完成的、曾被允许某些访问的Pod将导致其他Pod被授予相同的访问权限。

详细影响说明

  • 防火墙绕过:同一Kubernetes集群上的Pod能够访问NetworkPolicy规则本应阻止它们访问的网络端点。

  • 规则误用:NetworkPolicy规则被随机误用(基于IP地址分配)。有些Pod将被授予它们本不应拥有的访问权限。这实际上使得EKS中的NetworkPolicy规则失效。

  • 保密性:依赖网络控制来保护数据的EKS中运行的服务,其数据可能被暴露。

  • 完整性:依赖NetworkPolicy规则来防止未授权访问端点的服务可以被访问。

  • 可用性:基本不适用。

时间线与处理过程

  • 2025年9月5日:报告者savannabungee向AWS VDP提交报告。
  • 2025年9月5日:HackerOne分析师请求更多信息,包括详细的复现步骤和对保密性、完整性、可用性影响的具体说明。
  • 2025年9月5日:报告者提供了详细的分步设置、复现和验证说明。
  • 2025年9月7日:HackerOne分析师将严重性从中等(4.4)更新为中等(4.3),并指出漏洞导致防火墙绕过。
  • 2025年9月7日:报告状态更改为“待项目方审核”。
  • 2025年9月22日:报告者询问公开报告的时间和修复部署详情。
  • 2025年11月19日前:AWS VDP工作人员确认漏洞已修复,部署已完成且无需客户操作,并计划公开报告。
  • 2025年11月19日:报告状态更改为“已解决”并被公开披露。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计