authoring-kubeleash-policy — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited authoring-kubeleash-policy (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.
text (not bash) so it reads as prose, not a command.```bash
Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh
```See INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A kubeleash policy is local YAML, loaded via --policy <file> (or the K8S_MCP_POLICY env var). It constrains what the agent may do, keyed on context (regex) × resource × verb, with an optional namespace narrowing axis.
policies:
- contexts: ".*prod.*" # regex over the active kube context name (required)
namespaces: ["kube-system"] # optional; omit = all namespaces + cluster-scoped
allow:
resources: ["*"] # plural ("pods") or group/version/kind; "*" = any
verbs: [get, list, watch]
deny:
verbs: [exec] # deny wins, regardless of credentialscontexts (and namespaces) match, ifany deny covers the (resource, verb), the call is denied — even if another rule allows it.
"allow everything" escape hatch; grant access explicitly.
kubeconfig-grants ∩ policy-allows.A policy can never grant more than the credentials already do.
namespaces and a rule matches all namespacedresources and cluster-scoped ones. Set namespaces and the rule matches only namespaced resources in those namespaces — cluster-scoped resources (nodes, PVs, namespaces, ClusterRoles, …) never match a rule that specifies namespaces. To govern cluster-scoped resources, write a rule with no `namespaces`.
exec, scale. watch and patch are accepted but **reserved** — no v1 tool emits them yet, so a rule mentioning them validates but never matches. Writing the idiomatic [get, list, watch]` is safe and forward-compatible.
resources is a plural name (pods) or a group/version/kind(apps/v1/Deployment); "*" matches any. An omitted resources defaults to ["*"].
allow: { verbs: [get, list, watch] } plus an explicit deny: { verbs: [exec, delete] }.
allow doesn't grant them. Anexplicit deny yields a clear "denied by deny rule" reason, so the agent stops rather than treating it as a not-yet-granted gap.
--print-effective-policy` prints the normalized rules. A broken or unparseable policy refuses to start — it never fails open, which (with default-deny) is exactly what you want.
examples/policy.yaml for a fuller,commented policy (read-only prod, broader staging, namespace-scoped dev).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.