CVE-2024-3177:绕过ServiceAccount准入插件施加的可挂载密钥策略
CVSS评分:CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:N/A:N - 低危 (2.7)
在Kubernetes中发现了一个安全问题,当使用带有填充了envFrom字段的容器、初始化容器和临时容器时,用户可能能够启动绕过由ServiceAccount准入插件强制实施的可挂载密钥策略的容器。该策略确保使用服务帐户运行的Pod只能引用服务帐户的secrets字段中指定的密钥。只有当ServiceAccount准入插件与kubernetes.io/enforce-mountable-secrets注解一起使用,并且容器、初始化容器和临时容器带有填充的envFrom字段时,Kubernetes集群才会受到影响。
我是否受到此漏洞的影响?
需要满足以下条件:
- ServiceAccount准入插件被使用。大多数集群应默认启用此插件,正如Kubernetes官方文档中建议的。
- 服务帐户使用了
kubernetes.io/enforce-mountable-secrets注解。此注解默认不添加。 - Pod使用了带有填充了
envFrom字段的容器、初始化容器或临时容器。
受影响的版本
- kube-apiserver v1.29.0 - v1.29.3
- kube-apiserver v1.28.0 - v1.28.8
- kube-apiserver <= v1.27.12
如何缓解此漏洞?
可以通过为kube-apiserver组件应用提供的补丁来缓解此问题。该补丁可防止带有填充了envFrom字段的容器、初始化容器和临时容器绕过由ServiceAccount准入插件强制实施的可挂载密钥策略。
除了应用提供的补丁外,没有其他已知的缓解措施。
已修复的版本
- kube-apiserver master - 通过 PR #124322 修复
- kube-apiserver v1.29.4 - 通过 PR #124325 修复
- kube-apiserver v1.28.9 - 通过 PR #124326 修复
- kube-apiserver v1.27.13 - 通过 PR #124327 修复
要升级,请参考Kubernetes官方升级文档。
检测
利用此漏洞、使用带有envFrom字段的容器、初始化容器或临时容器,且涉及非预期密钥的Pod更新请求将被记录在API审计日志中。你也可以使用以下kubectl命令来查找使用kubernetes.io/enforce-mountable-secrets注解的活跃Pod:
|
|
如果你发现此漏洞已被利用的证据,请联系 security@kubernetes.io。
致谢
此漏洞由 tha3e1vl 报告。 问题由修复团队和发布经理修复与协调。
附录:理解准入控制器
根据Kubernetes官方文档,准入控制器是在资源持久化之前、但在请求通过身份验证和授权之后,拦截发往Kubernetes API服务器请求的一段代码。它们是Kubernetes API服务器内的代码,检查到达的请求中用于修改资源的数据。
工作原理
准入控制器适用于创建、删除或修改对象的请求。准入控制机制可以是验证性(Validating)、变更性(Mutating) 或两者兼有。变更性控制器可以修改正在被修改的资源数据;验证性控制器则不可以。
准入控制过程分为两个阶段:
- 第一阶段:运行变更性(Mutating)准入控制器。
- 第二阶段:运行验证性(Validating)准入控制器。
如果任一阶段的任何控制器拒绝该请求,则整个请求将立即被拒绝,并向最终用户返回错误。
ServiceAccount 准入控制器
ServiceAccount 是Kubernetes 1.35版本中默认启用的准入控制器之一。它负责实施与ServiceAccount相关的策略,包括本文所涉及的可挂载密钥策略。该策略旨在限制Pod只能挂载其关联服务帐户明确允许的密钥,是Kubernetes安全架构中实现最小权限原则的重要部分。
配置
Kubernetes API服务器的--enable-admission-plugins标志接受一个以逗号分隔的准入控制插件列表,用于在修改集群中的对象之前调用。例如,以下命令行启用NamespaceLifecycle和LimitRanger准入控制插件:
|
|
要查看默认启用了哪些准入插件,可以运行:
|
|