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 严格模式无任何影响。
概念验证
在启用了自动模式或设置了enableNetworkPolicy为true的VPC CNI控制器的EKS集群上,应用以下预备性Kubernetes资源:
|
|
此NetworkPolicy配置将允许以下Job连接到Deployment:
|
|
但以下Job将被阻止并超时:
|
|
然而,如果存在一个状态为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日:报告状态更改为“已解决”并被公开披露。