当前状态:2019 年 Kubernetes 第三方安全审计
我们预计最新的 Kubernetes 第三方安全审计报告将于本月晚些时候(2022 年 10 月)发布。
为此,让我们回顾一下上次 2019 年第三方安全审计中公开的发现,该审计基于 Kubernetes v1.13.4。
动机
Craig Ingram 多年来一直在努力跟进上次审计报告中发现的问题状态,具体见此 issue: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 | 通过 kubelet 将 PID 移动到 manager 的 cgroup 时存在 TOCTOU | #81113 | 成功利用需要节点访问权限。需要修复 |
5 | kubectl cp 中未正确修补的目录遍历问题 | #76788 | 已关闭,分配了 CVE-2019-11249,在 #80436 中修复 |
6 | Bearer 令牌在日志中泄露 | #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 可能因恶意清单导致内存不足错误 | #81122 | 已关闭,由 #76518 修复 |
15 | kubectl 可能因恶意的 Pod 规约导致内存不足错误 | #81123 | 需要修复 |
16 | 不正确的 PID 获取导致错误的 cgroup 移动 | #81124 | 需要修复 |
17 | 运行 kube-apiserver 和 kubelet 的主机日志存在目录遍历问题 | #81125 | 已关闭,由 #87273 修复 |
18 | 非恒定时间的密码比较 | #81126 | 已关闭,由 #81152 修复 |
19 | 加密建议不符合最佳实践 | #81127 | 进行中 |
20 | 默认向容器添加凭据不安全 | #81128 | 已关闭,由 #89193 修复 |
21 | kubelet 存活探针可用于枚举主机网络 | #81129 | 需要 KEP |
22 | iSCSI 卷存储在日志中以明文形式存储 Secret | #81130 | 已关闭,由 #81215 修复 |
23 | 硬编码的凭据路径 | #81131 | 已关闭,等待更多证据 |
24 | 日志轮转非原子操作 | #81132 | 需要修复 |
25 | 无边界的任意文件路径 | #81133 | 需要修复。 |
26 | 不安全的 JSON 构造 | #81134 | 部分修复 |
27 | 因错误处理不当导致 kubelet 崩溃 | #81135 | 已关闭。由 #81135 修复 |
28 | 旧版令牌永不过期 | #81136 | 已关闭,作为 #70679 的一部分修复 |
29 | CoreDNS 在命名空间之间泄露内部集群信息 | #81137 | 已关闭,随 CoreDNS v1.6.2 解决。#81137 (评论) |
30 | 服务使用有问题的默认函数 | #81138 | 需要修复 |
31 | 容器管理器中 docker 守护进程名称不正确 | #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 增强提案(KEP)1933 通过静态分析防止日志记录 Secret,以防止通过日志泄露 Secret,由 Patrick Rhomberg 推动实现。由于此 KEP,go-flow-levee
,一个配置用于检测 Secret 日志记录的污点传播分析工具,在一个 脚本中作为 Prow 的预提交作业执行。此 KEP 在 v1.20.0 中作为 Alpha 功能引入,然后在 v1.21.0 中升级为 Beta,并在 v1.23.0 中升级为稳定版。作为稳定版,该分析作为阻塞性的预提交测试运行。此 KEP 还帮助解决了 2019 年第三方安全审计中的以下问题:
剩余工作
过去 3 年来,我们社区成员的工作修复了已发现的 37 个问题中的许多。但是,我们仍有一些工作要做。以下是剩余工作的分解,包括对修复这些待处理问题的时间投入、复杂性和对生态系统益处的粗略估计。
说明
任何需要 KEP(Kubernetes 增强提案)的都被认为是*高*时间投入和*高*复杂性。对生态系统的益处大致相当于不修复该问题的风险,这由严重性级别 + 漏洞成功利用的可能性决定。下表中的这些估计和值是作者的个人观点。个人或最终用户的威胁模型可能会将修复特定问题的益处评定得更高或更低。标题 | 问题 | 时间投入 | 复杂性 | 对生态系统的益处 |
---|---|---|---|---|
Kubernetes 不支持证书吊销 | #81111 | 高 | 高 | 中 |
使用 InsecureSkipVerify 和其他 TLS 弱点 | #81119 | 高 | 高 | 中 |
kubectl 可能因恶意的 Pod 规约导致本地内存不足错误 | #81123 | 中 | 中 | 中 |
不正确的 PID 获取导致错误的 cgroup 移动 | #81124 | 中 | 中 | 中 |
kubelet 存活探针可用于枚举主机网络 | #81129 | 高 | 高 | 中 |
API Server 支持不安全的 TLS 密码套件 | #81145 | 中 | 中 | 低 |
通过 kubelet 将 PID 移动到 manager 的 cgroup 时存在 TOCTOU | #81113 | 中 | 中 | 低 |
日志轮转非原子操作 | #81132 | 中 | 中 | 低 |
无边界的任意文件路径 | #81133 | 中 | 中 | 低 |
服务使用有问题的默认函数 | #81138 | 中 | 中 | 低 |
在所有地方使用标准格式 | #81140 | 高 | 高 | 非常低 |
硬编码使用不安全的 gRPC 传输 | #81142 | 高 | 高 | 非常低 |
要开始修复这些需要帮助的任何问题,请考虑加入我们的双周会议或在我们的 Slack 频道与我们交流,参与 Kubernetes SIG Security。