Kubernetes安全漏洞CVE-2024-3177:绕过可挂载密钥策略的技术分析与修复

本文详细分析了Kubernetes安全漏洞CVE-2024-3177,该漏洞允许通过envFrom字段绕过ServiceAccount准入插件实施的可挂载密钥策略,影响了多个kube-apiserver版本,并提供了修复版本和检测方法。

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:

1
kubectl get serviceaccounts --all-namespaces -o jsonpath="{range .items[?(@.metadata.annotations['kubernetes\.io/enforce-mountable-secrets']=='true')]}{.metadata.namespace}{'\t'}{.metadata.name}{'\n'}{end}"

如果你发现此漏洞已被利用的证据,请联系 security@kubernetes.io

致谢

此漏洞由 tha3e1vl 报告。 问题由修复团队和发布经理修复与协调。

附录:理解准入控制器

根据Kubernetes官方文档,准入控制器是在资源持久化之前、但在请求通过身份验证和授权之后,拦截发往Kubernetes API服务器请求的一段代码。它们是Kubernetes API服务器内的代码,检查到达的请求中用于修改资源的数据。

工作原理

准入控制器适用于创建、删除或修改对象的请求。准入控制机制可以是验证性(Validating)变更性(Mutating) 或两者兼有。变更性控制器可以修改正在被修改的资源数据;验证性控制器则不可以。

准入控制过程分为两个阶段:

  1. 第一阶段:运行变更性(Mutating)准入控制器。
  2. 第二阶段:运行验证性(Validating)准入控制器。

如果任一阶段的任何控制器拒绝该请求,则整个请求将立即被拒绝,并向最终用户返回错误。

ServiceAccount 准入控制器

ServiceAccount 是Kubernetes 1.35版本中默认启用的准入控制器之一。它负责实施与ServiceAccount相关的策略,包括本文所涉及的可挂载密钥策略。该策略旨在限制Pod只能挂载其关联服务帐户明确允许的密钥,是Kubernetes安全架构中实现最小权限原则的重要部分。

配置

Kubernetes API服务器的--enable-admission-plugins标志接受一个以逗号分隔的准入控制插件列表,用于在修改集群中的对象之前调用。例如,以下命令行启用NamespaceLifecycleLimitRanger准入控制插件:

1
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...

要查看默认启用了哪些准入插件,可以运行:

1
kube-apiserver -h | grep enable-admission-plugins
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计