漏洞概述
亚马逊VPC CNI控制器在配置为管理NetworkPolicy规则时,会错误地将已完成的Pod(例如运行Job后处于“Completed”状态的Pod)的防火墙规则,如同Pod仍在运行一样继续应用。这会导致当其他无关的Pod被分配了与某个已完成的Pod相同的IP地址时,会错误地继承其网络访问权限,从而绕过NetworkPolicy的限制。
受影响版本
此漏洞在EKS 1.33版本中经过测试确认,影响以下配置:
- 启用自动模式并开启了网络策略控制器。
- 非自动模式,使用VPC CNI插件版本 v1.19.5-eksbuild.1。
- 非自动模式,使用VPC CNI插件版本 v1.20.1-eksbuild.3。 严格模式对此漏洞无影响。
漏洞原理
预期行为:当Pod完成(例如Job执行结束)时,其状态应被视为与Pod删除相同,并立即移除相关的防火墙规则。
实际缺陷行为:
- Pod A(例如一个被NetworkPolicy允许访问的Job)获得IP地址X,控制器在节点上为该IP地址X添加相应的防火墙规则。
- Pod A执行完毕进入“Completed”状态,但其防火墙规则未被移除。
- Pod A的IP地址X被释放回地址池。
- Pod B(一个本不应被NetworkPolicy允许任何访问的Pod)恰好被分配了相同的IP地址X。
- Pod B将继承Pod A曾拥有的网络访问权限,直到已完成的Pod A被删除。
复现步骤
- 环境准备:创建一个启用自动模式的EKS集群,并配置kubectl访问。
- 启用网络策略管理:应用配置,启用网络策略管理并排空现有节点。
- 部署测试资源:应用YAML文件,创建一个测试命名空间
networkpolicy-test、一个简单的whoami部署(Deployment)及其服务(Service),并配置一个NetworkPolicy。该策略规定,只有带有标签test: allowed的Pod才能访问whoami服务的80端口。 - 验证策略生效:
- 部署一个标签为
test: blocked的Job(blocked-job.yaml)。该Pod将因策略阻止而无法访问whoami服务,最终超时并显示Error状态。 - 删除此测试Job。
- 部署一个标签为
- 创建“允许”的Pod:部署多个标签为
test: allowed的Job(如20个)。这些Pod将能够成功访问whoami服务并进入Completed状态。 - 创建“阻止”的Pod:立即部署多个标签为
test: blocked的Job(如20个)。 - 验证漏洞:
- 检查所有
test: blockedPod的状态。 - 漏洞确认:如果部分本应被阻止的Pod显示为
Completed状态(成功访问了服务),而另一些则显示为Error或Running状态(访问被正确阻止),则漏洞存在。 - 进一步验证:通过
kubectl get pod -o wide查看IP地址。所有IP地址与某个“允许”Pod的IP地址发生碰撞的“阻止”Pod,其状态都应为Completed;IP地址未发生碰撞的“阻止”Pod,状态应为Error或Running。
- 检查所有
安全影响
- 摘要:在依赖Kubernetes NetworkPolicy规则来限制网络访问的EKS集群中,存在已完成的、曾被允许某些访问的Pod,将导致其他Pod获得相同的未授权访问权限。
- 具体影响:
- 防火墙绕过:同一Kubernetes集群上的Pod能够访问其本应被NetworkPolicy规则阻止访问的网络端点。
- 策略失效:NetworkPolicy规则被随机误用(基于IP地址分配),这使得EKS中的NetworkPolicy规则实际上变得无效。
- 保密性:依赖网络控制来保护数据的EKS服务,其数据可能被暴露。
- 完整性:依赖NetworkPolicy规则来防止未授权访问端点的服务可能被访问。
修复与状态
AWS VDP团队已确认此漏洞。修复程序已部署到所有EKS区域,用户无需执行任何操作即可应用此修复。该漏洞报告已被披露,状态标记为“已解决”。