0hardik1/Kubesplaining
GitHub: 0hardik1/Kubesplaining
受Cloudsplaining启发的Kubernetes安全评估CLI,通过图搜索分析RBAC权限提升路径和Pod逃逸面,帮助发现集群中真实可利用的攻击链路。
Stars: 0 | Forks: 0
# Kubesplaining
Kubesplaining 是一个 Kubernetes 安全评估 CLI,灵感来源于 Salesforce 的 [Cloudsplaining](https://github.com/salesforce/cloudsplaining)(该工具负责处理 AWS IAM 的相关工作)。它读取实时集群或之前捕获的快照,根据技术库对其进行分析,并生成按优先级排序的调查结果列表,支持输出为 HTML、JSON、CSV 或 SARIF 格式。
它主要关注对于*贴近真实攻击*的 Kubernetes 加固最重要的事项:
- **过度宽松的 RBAC** — 通配符、身份模拟、bind/escalate、secret 读取、pod 创建。
- **Pod 逃逸攻击面** — 特权容器、宿主机命名空间、敏感的 hostPath 挂载、容器 socket 挂载。
- **权限提升路径** — 基于图的“主体 A 可以变为 主体 B 可以触及 目标 X”的链路。
- **网络隔离缺口** — 没有 NetworkPolicy 的命名空间、允许大量互联网出站的策略。
- **准入控制绕过风险** — 失败时开放的 webhook、objectSelector 绕过、被豁免的敏感命名空间。
- **Secrets 和 ServiceAccount 卫生** — 旧版 token secret、ConfigMaps 中的凭证、默认 SA 挂载。
该项目的指导目标是**提供解释,而不仅仅是检测**:每项发现都会指明所用的技术,展示相关证据,并包含修复建议——因此得名 "kube-splaining"。
## 状态
这是初始实现,尚未包含完整的规范。当前的分析器侧重于:
- RBAC 危险权限,例如通配符访问、secrets 访问、pod/工作负载创建、身份模拟、绑定提升(binding escalation)、`nodes/proxy` 以及 service account token 创建。
- Pod 安全问题,例如特权容器、宿主机命名空间共享、危险的 `hostPath` 使用、默认 service account 使用、以 root 身份运行以及可变的镜像 tag。
完整的路线图以及已完成/未完成的事项请参见 [PLAN.md](PLAN.md)。
## 快速入门
构建 CLI 并扫描您当前的 `kubectl` 上下文:
```
make build
./bin/kubesplaining scan
open kubesplaining-report/report.html # macOS; xdg-open on Linux
```
或者先捕获一个快照并离线分析(适用于跳板机、审计、差异对比):
```
./bin/kubesplaining download --output-file snapshot.json
./bin/kubesplaining scan --input-file snapshot.json
```
实用标志:
- `--threshold high` — 隐藏所有低于 HIGH 级别的结果。
- `--only-modules privesc` / `--skip-modules network` — 限定特定分析器的范围。
- `--output-format html,json,csv,sarif` — 选择输出格式(默认:`html,json`)。
- `--ci-mode --ci-max-critical 0 --ci-max-high 0` — 超出预算时以非零状态退出,用于 CI。
- `--max-privesc-depth 7` — 在提升图上进行更深入的 BFS(默认为 5)。
用于无需集群访问权限的单次 manifest 检查:
```
./bin/kubesplaining scan-resource --input-file deployment.yaml
```
### 开发者设置
```
make setup # download Go module deps
make test # go test ./...
make lint # gofmt -l + go vet
make e2e # spin up kind, apply risky manifests, assert findings (needs Docker)
```
## 为什么它很有用
Kubesplaining 执行**针对收集状态的集群范围攻击者路径分析**。它按原样接管集群——不需要准入策略,不需要超出列出(listing)权限的工作负载访问——并回答:
这与 Cloudsplaining 为 AWS IAM 回答的问题相同。
具体来说,它适用于:
- **渗透测试 / 红队演习** — 权限提升路径的输出就是攻击计划。
- **在赋予工作负载更广泛访问权限之前进行安全审查** — 查看新的绑定是否切断了从不受信任的主体到目标的图路径。
- **CI 中的持续保障** — 当高严重性发现超出预算时,带有 `--ci-max-critical` / `--ci-max-high` 的 `--ci-mode` 会使流水线失败。
- **事件发生后的合理化复盘** — 重放捕获的快照,以解释攻击者本可以如何进行横向移动。
## 工作原理
该工具是一个四阶段的流水线:
```
┌────────────┐ ┌──────────────┐ ┌──────────────┐ ┌─────────────┐
│ Connection │ → │ Collection │ → │ Analysis │ → │ Report │
│ kubeconfig │ │ snapshot.json│ │ 7 modules ∥ │ │ html/json/ │
│ / in-cluster │ RBAC+workload│ │ findings[] │ │ csv/sarif │
└────────────┘ └──────────────┘ └──────────────┘ └─────────────┘
```
### 阶段 1 — 连接 ([internal/connection/](internal/connection/))
按照标准的 client-go 顺序解析凭据:`--kubeconfig` 标志 → `KUBECONFIG` 环境变量 → `~/.kube/config` → 集群内 service account。也接受用于审计场景的直接 `--api-server` + `--token` 组合。**只读访问**就足以完成全部分析;无需注册准入 webhook,无需安装 CRD,无需创建 pod。
### 阶段 2 — 收集 ([internal/collector/collector.go](internal/collector/collector.go))
并行(受 `--parallelism` 限制)列出每种受支持的资源类型,并将它们转储到 `models.Snapshot` 中:
- RBAC:Roles、ClusterRoles、RoleBindings、ClusterRoleBindings
- 工作负载:Pods、Deployments、DaemonSets、StatefulSets、Jobs、CronJobs
- 网络:NetworkPolicies、Services、Ingresses
- 准入控制:ValidatingWebhookConfigurations、MutatingWebhookConfigurations
- 身份:ServiceAccounts、Secrets(除非使用 `--include-secret-values`,否则仅含元数据)、ConfigMaps
- 平台:Nodes、Namespaces
Forbidden/Unauthorized 错误会被**降级为警告**,而不是致命错误——部分快照仍然可以产生有用的输出。这在扫描凭据无法列出所有内容的锁定集群中非常重要。
快照是一个普通的 JSON 文件。`kubesplaining download` 写入该文件;`kubesplaining scan --input-file` 读取该文件。这种分离意味着您可以在跳板机上捕获快照并离线分析,或者随时间推移对比不同的快照。
### 阶段 3 — 分析 ([internal/analyzer/engine.go](internal/analyzer/engine.go))
引擎针对快照**并行**运行七个模块。每个模块都实现相同的接口:
```
type Module interface {
Name() string
Analyze(ctx context.Context, snapshot models.Snapshot) ([]models.Finding, error)
}
```
这些模块包括:
1. **rbac** — 有效权限聚合,然后与技巧库进行模式匹配。
2. **podsec** — 每容器 / 每 pod 模板的安全上下文检查。
3. **network** — NetworkPolicy 覆盖范围和弱点检测。
4. **admission** — webhook 清单、failurePolicy、绕过攻击面。
5. **secrets** — 长期有效的 SA token、类似凭据的 ConfigMap 键、CoreDNS 篡改。
6. **serviceaccount** — 默认 SA 风险、工作负载挂载的 SA 影响范围、DaemonSet 放大效应。
7. **privesc** — **核心差异化所在。** 构建一个有向图,其中节点是 RBAC 主体,目标是 `cluster-admin`、`node-escape`、`kube-system-secrets`、`system:masters` 等。边用促成该跳转的技术进行标记。从每个非系统主体运行 BFS(上限为 `--max-privesc-depth`,默认为 5),并为每个 `(source, sink)` 对生成一条发现结果,附带完整的逐跳链路。
发现结果按 `--threshold` 进行过滤,并根据严重性 → 评分 → 规则 ID → 标题进行排序。
### 阶段 4 — 报告 ([internal/report/](internal/report/))
相同的发现结果列表被序列化为:
- **HTML** — 独立文件(通过 `embed` 内联 CSS/JS),包含执行摘要、按模块划分的章节、严重性统计、类别细分。
- **JSON** — 原始的 `[]Finding`,供编程式调用。
- **CSV** — 便于分类,每项发现占一行。
- **SARIF** — 用于 GitHub 代码扫描 / IDE 集成。
### 数据模型 ([internal/models/](internal/models/))
- `Snapshot` — 集群转储。
- `Finding` — 每个分析器发出的单元。携带 ID、RuleID、严重性 (CRITICAL/HIGH/MEDIUM/LOW/INFO)、评分 (0–10)、类别、主体/资源引用、证据 (JSON blob)、修复建议、参考、标签,以及可选的 `EscalationPath`。
- `SubjectRef` / `ResourceRef` — 规范的 `Kind/[Namespace/]Name` 标识符。
- `EscalationGraph` / `EscalationNode` / `EscalationEdge` / `EscalationPath` / `EscalationHop` — 被 privesc 模块使用的图类型。
## 风险类别
每项发现都带有一个用于报告分组的 `RiskCategory` 标签:
| 类别 | 含义 |
| --- | --- |
| `privilege_escalation` | 主体可以获得额外的权限或身份。 |
| `data_exfiltration` | 访问 secrets、token 或携带凭据的数据。 |
| `lateral_movement` | 跨命名空间或跨工作负载的触达能力。 |
| `infrastructure_modification` | 能够改变控制平面行为、准入控制、策略。 |
| `defense_evasion` | 能够绕过准入 / 日志 / 执行策略。 |
## 发现库 — 已实现
该工具目前跨 7 个模块发出**41 种不同的规则 ID**。每条规则针对给定快照会产生零个或多个发现结果。
### RBAC ([internal/analyzer/rbac/analyzer.go](internal/analyzer/rbac/analyzer.go))
| 规则 ID | 严重性 | 标题 | 检测内容 | 修复方法 |
| --- | --- | --- | --- | --- |
| KUBE-PRIVESC-017 | CRITICAL | 通配符 cluster-admin 风格权限 | 主体上同时具有通配符 verbs、resources 和 apiGroups | 将通配符替换为最小的显式集合 |
| KUBE-PRIVESC-008 | CRITICAL | 身份模拟权限 | 对 users/groups/serviceaccounts 具有 `impersonate` 权限 | 仅将模拟权限授予严格受控的管理员工作流 |
| KUBE-PRIVESC-009 | CRITICAL | RBAC `bind` 或 `escalate` 权限 | 对 roles/clusterroles 具有 `bind`/`escalate` | 从非管理员身份中移除 |
| KUBE-PRIVESC-010 | CRITICAL | 角色绑定修改可自我授权 | 对 rolebindings/clusterrolebindings 具有 create/update/patch | 将绑定写入操作限制在严格的管理员边界内 |
| KUBE-PRIVESC-012 | CRITICAL | 节点代理访问 | 对 `nodes/proxy` 具有 `get` (kubelet 滥用) | 让面向 kubelet 的权限远离应用身份 |
| KUBE-PRIVESC-001 | HIGH | Pod 创建访问权限可用于窃取 token | 对 pods 具有 `create` | 通过受控自动化路由部署 |
| KUBE-PRIVESC-003 | HIGH | 工作负载控制器修改可创建特权 pod | 对 deployments/daemonsets/statefulsets/jobs/cronjobs 具有 create/update/patch | 将部署自动化与运行时身份分离 |
| KUBE-PRIVESC-005 | HIGH | Secret 读取访问权限 | 对 secrets 具有 `get`/`list`/`watch` | 限制到实际需要的命名空间/工作负载 |
| KUBE-PRIVESC-014 | HIGH | Service account token 创建 | 对 `serviceaccounts/token` 具有 `create` | 限制为受信任的控制平面组件 |
| KUBE-RBAC-OVERBROAD-001 | CRITICAL | 非系统主体绑定到 cluster-admin | 人类/SA 直接绑定到 `cluster-admin` ClusterRole | 替换为最小权限的自定义角色 |
### Pod 安全 ([internal/analyzer/podsec/analyzer.go](internal/analyzer/podsec/analyzer.go))
| 规则 ID | 严重性 | 标题 | 检测内容 | 修复方法 |
| --- | --- | --- | --- | --- |
| KUBE-ESCAPE-001 | CRITICAL | 特权容器 | `securityContext.privileged: true` | 取消特权,仅添加所需的具体 capabilities |
| KUBE-ESCAPE-002 | CRITICAL | 启用了 Host PID | pod/pod 模板上设置了 `hostPID: true` | 除非工作负载是受信任节点上的调试/sidecar,否则请移除 |
| KUBE-ESCAPE-005 | CRITICAL | Docker socket 挂载 | hostPath `/var/run/docker.sock` | 移除;改用 CSI / 镜像构建 sidecar |
| KUBE-CONTAINERD-SOCKET-001 | CRITICAL | Containerd socket 挂载 | hostPath `/var/run/containerd/containerd.sock` | 移除;这等同于赋予 pod 节点 root 权限 |
| KUBE-ESCAPE-006 | CRITICAL | 根文件系统 hostPath 挂载 | hostPath 挂载 `/` | 替换为指定范围的 ConfigMaps/Secrets/CSI |
| KUBE-ESCAPE-003 | HIGH | 启用了 Host network | `hostNetwork: true` | 除非确实需要,否则请使用 pod 网络 |
| KUBE-ESCAPE-004 | HIGH | 启用了 Host IPC | `hostIPC: true` | 除非是受信任的节点级组件,否则请禁用 |
|UBE-ESCAPE-008 | HIGH | 挂载了 Host 日志目录 | hostPath `/var/log` | 改用日志收集器 sidecar |
| KUBE-HOSTPATH-001 | HIGH | HostPath 卷挂载 | 通用 hostPath 挂载 | 优先使用 ConfigMaps/Secrets/CSI |
| KUBE-PODSEC-APE-001 | HIGH | 容器中允许特权升级 | `allowPrivilegeEscalation` 缺失或为 `true` | 设置 `allowPrivilegeEscalation: false` |
| KUBE-PODSEC-ROOT-001 | MEDIUM | 容器以 root 身份运行 | UID 0 或 `runAsNonRoot: false` | 设置一个非零 UID 和 `runAsNonRoot: true` |
| KUBE-SA-DEFAULT-001 | MEDIUM | 使用了默认 service account | 工作负载挂载了命名空间 `default` SA | 绑定一个专用的最小权限 SA |
| KUBE-IMAGE-LATEST-001 | LOW | 使用了可变的镜像 tag | `:latest` 或没有 tag | 固定到不可变的 tag 或摘要 |
### 网络策略 ([internal/analyzer/network/analyzer.go](internal/analyzer/network/analyzer.go))
| 规则 ID | 严重性 | 标题 | 检测内容 | 修复方法 |
| --- | --- | --- | --- | --- |
| KUBE-NETPOL-COVERAGE-001 | HIGH | 命名空间没有 NetworkPolicies | 零策略的非系统命名空间 | 添加默认拒绝规则,然后显式允许 |
| KUBE-NETPOL-WEAKNESS-002 | HIGH | NetworkPolicy 允许互联网出站 | 出站规则指向 `0.0.0.0/0` 或 `::/0` | 限制到所需的 CIDR 或服务 |
| KUBE-NETPOL-COVERAGE-002 | MEDIUM | 工作负载未被任何 NetworkPolicy 选中 | 处于包含策略的命名空间中的 pod,但没有策略匹配它 | 添加选择器或应用基线策略 |
| KUBE-NETPOL-COVERAGE-003 | MEDIUM | 存在入站策略,但出站仍然开放 | 命名空间有入站规则但没有出站规则 | 添加显式出站规则或默认拒绝出站规则 |
| KUBE-NETPOL-WEAKNESS-001 | MEDIUM | NetworkPolicy 允许来自所有命名空间的入站流量 | 入站规则中命名空间选择器为空 | 使用显式的命名空间标签 |
### 准入 Webhook ([internal/analyzer/admission/analyzer.go](internal/analyzer/admission/analyzer.go))
| 规则 ID | 严重性 | 标题 | 检测内容 | 修复方法 |
| --- | --- | --- | --- | --- |
| KUBE-ADMISSION-001 | HIGH | 安全关键型 webhook 使用了 `failurePolicy: Ignore` | webhook 针对 pods/workloads 但失败时开放 | 对安全 webhook 使用 `failurePolicy: Fail` |
| KUBE-ADMISSION-002 | MEDIUM | Webhook 可通过对象标签绕过 | 在工作负载控制的标签上设置 `objectSelector` 键 | 将规则移至工作负载无法伪造的字段 |
| KUBE-ADMISSION-003 | MEDIUM | Webhook 排除了敏感命名空间 | `namespaceSelector` 豁免了 `kube-system` / `*-system` | 确认豁免是有意的,若无意则缩小范围 |
### Secrets 与 ConfigMaps ([internal/analyzer/secrets/analyzer.go](internal/analyzer/secrets/analyzer.go))
| 规则 ID | 严重性 | 标题 | 检测内容 | 修复方法 |
| --- | --- | --- | --- | --- |
| KUBE-SECRETS-001 | HIGH | 长期有效的 service account token secret | `type: kubernetes.io/service-account-token` | 优先使用投射的 token;删除旧版 secret |
| KUBE-CONFIGMAP-002 | HIGH | CoreDNS 配置包含危险指令 | Corefile 中的 `rewrite` / `forward` | 审查意图;限制对 coredns configmap 的写访问 |
| KUBE-SECRETS-002 | MEDIUM | 在 kube-system 中存储了 Opaque secret | `kube-system` 中的用户 `Opaque` secret | 移至应用命名空间并限制读取者 |
| KUBE-CONFIGMAP-001 | MEDIUM | ConfigMap 包含类似凭据的键 | 键名匹配 `password`/`token`/`key`/`api_key`/… | 移至 Secret 或外部 secret 管理器 |
### Service Account ([internal/analyzer/serviceaccount/analyzer.go](internal/analyzer/serviceaccount/analyzer.go))
| 规则 ID | 严重性 | 标题 | 检测内容 | 修复方法 |
| --- | --- | --- | --- | --- |
| KUBE-SA-PRIVILEGED-001 | CRITICAL | Service account 具有 cluster-admin 风格的权限 | SA 在通配符资源上具有通配符 verbs | 用严格界定范围的角色替换通配符 |
| KUBE-SA-PRIVILEGED-002 | HIGH/CRITICAL | 工作负载挂载的 SA 具有危险权限 | 挂载的 SA 具有 secret 读取 / pod 创建 / RBAC 变更 / 身份模拟权限 | 按工作负载拆分,删除高风险权限 |
| KUBE-SA-DEFAULT-002 | HIGH | 默认 service account 具有显式的 RBAC 权限 | 命名空间 `default` SA 携带非平凡的绑定 | 创建专用的 SA;保持 `default` 无特权 |
| KUBE-SA-DAEMONSET-001 | MEDIUM/HIGH | Service account 被 DaemonSet 使用 | Token 挂载在每个节点上 | 严格限定 SA 范围;将其视为每节点凭据 |
### 权限提升路径 ([internal/analyzer/privesc/analyzer.go](internal/analyzer/privesc/analyzer.go))
这些发现针对通过在提升图上进行 BFS 发现的**每个 `(source subject, sink)` 对**发出。严重性会根据链路长度进行衰减:跳数 ≥ 3 时降低一个级别,并且得分为 `base − 0.5 × (hops − 1)`,限制在 `[1, 10]` 之间。
| 规则 ID | 基础严重性 | 标题模板 | 到达的目标 |
| --- | --- | --- | --- |
| KUBE-PRIVESC-PATH-CLUSTER-ADMIN | CRITICAL (9.8) | `` 可以在 N 跳内到达相当于 cluster-admin 的权限 | 通配符 `*/*/*` 持有者或绑定了 cluster-admin 的主体 |
| KUBE-PRIVESC-PATH-SYSTEM-MASTERS | CRITICAL (9.6) | `` 可以在 N 跳内到达 system:masters | 最终结束于 `system:masters` 组的身份模拟链 |
| KUBE-PRIVESC-PATH-NODE-ESCAPE | CRITICAL (9.4) | `` 可以在 N 跳内到达节点逃逸 | 能够创建/执行具有 privileged / hostPID / hostNetwork / hostIPC / 敏感 hostPath 的 pod |
| KUBE-PRIVESC-PATH-KUBE-SYSTEM-SECRETS | HIGH (8.6) | `` 可以在 N 跳内到达 kube-system secrets | 集群范围或 kube-system 内对 secrets 的 `get`/`list` |
可能出现在跳链中的边缘技术:`KUBE-PRIVESC-001` (pod create)、`-005` (secrets read)、`-008` (impersonate)、`-009` (bind/escalate)、`-010` (rolebinding modify)、`-012` (nodes/proxy)、`-014` (serviceaccounts/token)、`-017` (wildcard),以及用于 pod 逃逸终端边缘的 `KUBE-ESCAPE-00{1,2,3,4,5,6,8}` / `KUBE-HOSTPATH-001`。`system:*` 主体将作为可遍历的中间节点被跳过,以使路径不会通过控制平面进行洗白。
每条路径发现都附带一个 `escalation_path` 数组:每一步对应一个 `EscalationHop`,包含 `from_subject`、`to_subject`、`action`、`permission` 以及一个人类可读的 `gains` 行。
## 发现库 — 计划中
以下规则已在路线图中,但尚未实现。状态和优先级请参见 [PLAN.md](PLAN.md)。
**RBAC** — KUBE-PRIVESC-002 (pod create + PSA bypass)、-004 (pods/exec)、-006 (secrets get)、-007 (secret creation token theft)、-011 (CSR)、-013 (ephemeral containers)、-015 (portforward)、-016 (node drain);陈旧/悬挂的绑定。
**Pod 安全** — `readOnlyRootFilesystem`、`seccompProfile`、`procMount`,详尽的危险能力列表 (SYS_PTRACE, DAC_OVERRIDE, SYS_MODULE, SYS_RAWIO, MKNOD, AUDIT_WRITE, …);PersistentVolume hostPath 绕过 (KUBE-ESCAPE-011);PSA 命名空间标签检查;旧版 PSP 宽松度。
**网络** — 跨命名空间通信图;出站到云元数据端点 `169.254.169.254`。
**Secrets** — 陈旧/未引用的 secrets;跨命名空间 secret 引用;TLS secret 到期;`aws-auth` ConfigMap 分析;EncryptionConfiguration 审计。
**Service Account** — 跨模块风险关联;DaemonSet 影响范围标志。
**准入控制** — “未检测到变更 webhook” / “未检测到策略引擎”的态势发现。
**容器安全** — 缺少资源 limits/requests (DoS)、缺少 probes、生命周期 exec 命令、镜像仓库允许列表 / 摘要固定。
**节点** — kubelet 版本 CVE 提示、控制平面污点、控制平面节点上的工作负载。
**etcd 与控制平面** — API server LB/NodePort 暴露、`/var/lib/etcd` hostPath、kubelet 匿名认证 / 只读端口。
**命名空间隔离** — 每个命名空间的安全评分、跨命名空间风险矩阵。
**云提供商** — EKS aws-auth + IRSA 信任策略交叉检查;GKE Workload Identity;AKS 托管身份;提升图中的 IMDS 暴露边缘。
## 输出格式
| 格式 | 标志 | 用例 |
| --- | --- | --- |
| HTML | `--output-html` | 人工审查;独立文件,可离线工作 |
| JSON | `--output-json` | 编程式调用,在运行之间进行对比 |
| CSV | `--output-csv` | 分类整理电子表格 |
| SARIF | `--output-sarif` | GitHub 代码扫描,IDE 集成 |
## 命令
| 命令 | 用途 |
| --- | --- |
| `kubesplaining download` | 从实时集群捕获 `snapshot.json`。只读。 |
| `kubesplaining scan` | 分析(实时或 `--input-file`)并写入报告。 |
| `kubesplaining scan-resource` | 扫描单个资源清单以供快速检查。 |
| `kubesplaining report` | 从现有的 findings JSON 重新渲染报告。 |
| `kubesplaining create-exclusions-file` | 生成一个初始排除项 YAML。 |
| `kubesplaining version` | 打印构建信息。 |
关键标志:
- `--threshold {info|low|medium|high|critical}` — 严重性下限。
- `--only ` / `--skip ` — 将范围限定在特定模块 (`rbac`、`podsec`、`network`、`admission`、`secrets`、`serviceaccount`、`privesc`)。
- `--max-privesc-depth N` — privesc 模块的 BFS 深度上限 (默认为 5)。
- `--ci-mode` 加上 `--ci-max-critical` / `--ci-max-high` — 超出预算时以非零状态退出。
## 评分
目前,每条规则都有一个手工设定的基础分,限制在 `[0, 10]` 之间。privesc 模块已经根据链路长度进行了衰减。计划中的综合评分公式:
```
score = base × exploitability × blast_radius + chain_modifier
```
其中:
- 当主体是一个*由 pod 实际挂载的* ServiceAccount 时(该 SA 的凭据就存放在磁盘某处),`exploitability` 会更高。
- 对于集群范围的规则以及处于 `kube-system` 中或 DaemonSet 上的主体(每个节点都有 token),`blast_radius` 会更高。
- `chain_modifier` 来自于 privesc 模块的跳数。
在 [PLAN.md](PLAN.md) 中,集中实现此功能是**下一个目标**。
## 排除项
可以通过 YAML 排文件来抑制发现结果。请参见 [internal/exclusions/](internal/exclusions/) 和 `kubesplaining create-exclusions-file`。计划推出预设配置文件(`minimal` / `standard` / `strict`)和基于快照的自动预填充功能。
## 访问要求
Kubesplaining 需要对上述阶段 2 中列出的资源类型具有**集群范围的读取**权限。合适的 ClusterRole 是内置 `view` 角色加上对 RBAC 对象和 webhook 配置的 `get`/`list` 权限的子集。被禁止的列出操作将被记录为快照中的 `missing_permissions` 警告,并且不会中止运行;受影响的模块仅在部分视图上运行。
不会安装任何准入 webhook、CRD 或代理 pod。该工具指向生产环境是安全的。
## 下一步计划
- 每个模块的状态 / 路线图项目:[PLAN.md](PLAN.md)。
- 端到端验证:`make e2e` — 使用 [testdata/](testdata/) 中故意带有风险的清单提供一个本地 `kind` 集群,并断言预期发现。
标签:Chrome Headless, CISA项目, EVTX分析, Kubernetes安全, RBAC评估, URL发现, 协议分析, 反取证, 图分析, 威胁建模, 子域名突变, 安全合规, 安全检测, 安全评估, 容器逃逸, 数据处理, 日志审计, 权限提升, 网络代理, 网络安全隔离