现状:2019 年 Kubernetes 第三方安全审计
我们预计全新的 Kubernetes 第三方安全审计报告将于本月晚些时候(2022 年 10 月)发布。
为此,我们来回顾一下上次基于 Kubernetes v1.13.4 的 2019 年第三方安全审计中公开的发现现状。
动机
Craig Ingram 多年来一直在努力跟踪上次审计中报告的问题状态:kubernetes/kubernetes#81146。这篇博文将深入探讨这个问题,弥补跟踪中的任何不足,并成为对 2019 年报告的问题现状的时间点总结。
本文还将通过透明的沟通,帮助读者对社区为解决这些发现所做的工作树立信心,并突出任何需要社区贡献者帮助的发现。
当前状态
此处每个问题/发现的状态是以尽力而为的方式呈现的。作者不保证状态 100% 准确,并欢迎对现状未准确反映的任何更正或反馈,请直接在相关问题上发表评论。
# | 标题 | 问题 | 状态 |
---|---|---|---|
1 | hostPath PersistentVolumes 启用 PodSecurityPolicy 绕过 | #81110 | 已关闭,已通过 kubernetes/website#15756 和 kubernetes/kubernetes#109798 解决 |
2 | Kubernetes 不支持证书撤销 | #81111 | 是 #18982 的重复项,需要一个 KEP |
3 | HTTPS 连接未认证 | #81112 | 大部分留给最终用户通过设置正确的配置来完成 |
4 | TOCTOU 当通过 kubelet 将 PID 移动到 manager 的 cgroup 时 | #81113 | 需要节点访问才能成功利用。需要修复 |
5 | kubectl cp 中未正确修补的目录遍历漏洞 | #76788 | 已关闭,分配了 CVE-2019-11249,在 #80436 中修复 |
6 | 日志中暴露 Bearer tokens | #81114 | 已关闭,分配了 CVE-2019-11250,在 #81330 中修复 |
7 | Seccomp 默认禁用 | #81115 | 已关闭,已通过 #101943 解决 |
8 | 普遍存在的世界可访问的文件权限 | #81116 | #112384 (进行中) |
9 | 环境变量暴露敏感数据 | #81117 | 已关闭,已通过 #84992 和 #84677 解决 |
10 | SSH 连接中使用了 InsecureIgnoreHostKey | #81118 | 此功能已在 v1.22 中移除:#102297 |
11 | 使用了 InsecureSkipVerify 和其他 TLS 弱点 | #81119 | 需要一个 KEP |
12 | kubeadm 执行潜在危险的重置操作 | #81120 | 已关闭,通过 #81495、#81494 和 kubernetes/website#15881 修复 |
13 | 使用 strconv.Atoi 并向下转型结果时发生溢出 | #81121 | 已关闭,通过 #89120 修复 |
14 | kubelet 可能因恶意 manifest 导致内存不足错误 | #81122 | 已关闭,通过 #76518 修复 |
15 | kubectl 可能因恶意 Pod 规范导致内存不足错误 | #81123 | 需要修复 |
16 | 不正确的 PIDs 获取方式导致 cgroup 移动不正确 | #81124 | 需要修复 |
17 | 运行 kube-apiserver 和 kubelet 的主机日志目录遍历 | #81125 | 已关闭,通过 #87273 修复 |
18 | 非常数时间密码比较 | #81126 | 已关闭,通过 #81152 修复 |
19 | 加密建议不符合最佳实践 | #81127 | 进行中 |
20 | 默认将凭据添加到容器是不安全的 | #81128 | 已关闭,通过 #89193 修复 |
21 | kubelet 活跃度探针可用于枚举主机网络 | #81129 | 需要一个 KEP |
22 | 日志中的 iSCSI 卷存储明文密钥 | #81130 | 已关闭,通过 #81215 修复 |
23 | 硬编码的凭据路径 | #81131 | 已关闭,等待更多证据 |
24 | 日志轮转不是原子性的 | #81132 | 需要修复 |
25 | 没有边界的任意文件路径 | #81133 | 需要修复 |
26 | 不安全的 JSON 构造 | #81134 | 部分修复 |
27 | kubelet 因错误处理不当而崩溃 | #81135 | 已关闭,通过 #81135 修复 |
28 | 旧版 tokens 不会过期 | #81136 | 已关闭,作为 #70679 的一部分修复 |
29 | CoreDNS 泄露跨命名空间的内部集群信息 | #81137 | 已关闭,通过 CoreDNS v1.6.2 解决。#81137 (comment) |
30 | Services 使用可疑的默认函数 | #81138 | 需要修复 |
31 | 容器管理器中 docker daemon 进程名不正确 | #81139 | 已关闭,通过 #81083 修复 |
32 | 到处使用标准格式 | #81140 | 需要一个 KEP |
33 | 表面健康检查提供虚假的安全感 | #81141 | 已关闭,通过 #81319 修复 |
34 | 硬编码使用不安全的 gRPC 传输 | #81142 | 需要一个 KEP |
35 | Retry-After 处理不正确 | #81143 | 已关闭,通过 #91048 修复 |
36 | 不正确的 isKernelPid 检查 | #81144 | 已关闭,通过 #81086 修复 |
37 | Kubelet 支持不安全的 TLS 密码套件 | #81145 | 已关闭,但 #91444 需要修复 (参见 此评论) |
受启发的成果
除了修复特定问题外,2019 年的第三方安全审计还推动了 Kubernetes 在接下来的几个版本中进行安全增强。其中一个例子是 Kubernetes Enhancement Proposal (KEP) 1933 通过静态分析防御日志记录密钥,以防止将密钥暴露到日志中,由 Patrick Rhomberg 推动实现。作为此 KEP 的结果,go-flow-levee
是一个配置用于检测密钥日志记录的污点传播分析工具,在 脚本 中作为 Prow 预提交作业执行。此 KEP 在 v1.20.0 中作为 alpha 特性引入,然后在 v1.21.0 中升级到 beta,并在 v1.23.0 中升级到 stable。在 stable 阶段,分析作为阻塞预提交测试运行。此 KEP 还帮助解决了 2019 年第三方安全审计中的以下问题:
剩余工作
已识别的 37 个发现中的许多问题已由我们的社区成员在过去 3 年中修复。然而,我们仍有一些工作要做。以下是剩余工作的分解,以及关于修复这些待解决问题所需时间投入、复杂性和对生态系统的益处的粗略估计。
注意
任何需要 KEP (Kubernetes Enhancement Proposal) 的都被视为高时间投入和高复杂性。对生态系统的益处大致相当于保持发现未修复的风险,这由严重级别 + 成功利用漏洞的可能性决定。下表中这些估计和数值是作者的个人观点。个人或最终用户的威胁模型可能会将修复特定问题的益处评级更高或更低。标题 | 问题 | 时间投入 | 复杂性 | 对生态系统的益处 |
---|---|---|---|---|
Kubernetes 不支持证书撤销 | #81111 | 高 | 高 | 中 |
使用了 InsecureSkipVerify 和其他 TLS 弱点 | #81119 | 高 | 高 | 中 |
kubectl 可能因恶意 Pod 规范导致本地内存不足错误 | #81123 | 中 | 中 | 中 |
不正确的 PIDs 获取方式导致 cgroup 移动不正确 | #81124 | 中 | 中 | 中 |
kubelet 活跃度探针可用于枚举主机网络 | #81129 | 高 | 高 | 中 |
API Server 支持不安全的 TLS 密码套件 | #81145 | 中 | 中 | 低 |
TOCTOU 当通过 kubelet 将 PID 移动到 manager 的 cgroup 时 | #81113 | 中 | 中 | 低 |
日志轮转不是原子性的 | #81132 | 中 | 中 | 低 |
没有边界的任意文件路径 | #81133 | 中 | 中 | 低 |
Services 使用可疑的默认函数 | #81138 | 中 | 中 | 低 |
到处使用标准格式 | #81140 | 高 | 高 | 非常低 |
硬编码使用不安全的 gRPC 传输 | #81142 | 高 | 高 | 非常低 |
要开始修复需要帮助的这些发现中的任何一个,请考虑参与 Kubernetes SIG Security,加入我们的双周会议或在 Slack 频道与我们交流。