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发现, 协议分析, 反取证, 图分析, 威胁建模, 子域名突变, 安全合规, 安全检测, 安全评估, 容器逃逸, 数据处理, 日志审计, 权限提升, 网络代理, 网络安全隔离