当前状态:2019 年 Kubernetes 第三方安全审计
我们预计全新的 Kubernetes 第三方安全审计报告将于本月晚些时候(2022 年 10 月)发布。
在准备工作期间,让我们回顾一下上次 2019 年第三方安全审计中公开的调查结果,该审计基于 Kubernetes v1.13.4。
动机
多年来,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 | 通过 kubelet 将 PID 移动到管理器 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 卷存储在日志中以明文形式显示密钥 | #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 通过静态分析防止记录机密,以防止使用 Patrick Rhomberg 驱动的实现将机密暴露在日志中。作为此 KEP 的结果,go-flow-levee
(一种配置为检测机密记录的污点传播分析工具)在 脚本 中作为 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 服务器支持不安全的 TLS 密码套件 | #81145 | 中 | 中 | 低 |
通过 kubelet 将 PID 移动到管理器 cgroup 时出现 TOCTOU | #81113 | 中 | 中 | 低 |
日志轮换不是原子性的 | #81132 | 中 | 中 | 低 |
不限制的任意文件路径 | #81133 | 中 | 中 | 低 |
服务使用可疑的默认函数 | #81138 | 中 | 中 | 低 |
在所有地方使用标准格式 | #81140 | 高 | 高 | 非常低 |
硬编码使用不安全的 gRPC 传输 | #81142 | 高 | 高 | 非常低 |
要开始修复任何需要帮助的发现,请考虑通过加入我们的双周会议或在我们的 Slack 频道上与我们交流来参与 Kubernetes SIG Security。