Skip to content

Added kyverno joint assessment - #2208

Open
06kellyjac wants to merge 1 commit into
cncf:mainfrom
06kellyjac:kyverno_joint_assessment
Open

Added kyverno joint assessment#2208
06kellyjac wants to merge 1 commit into
cncf:mainfrom
06kellyjac:kyverno_joint_assessment

Conversation

@06kellyjac

Copy link
Copy Markdown

Resolves #1703

Exporting the gdoc to markdown & images.
Some adjustments to add code backticks to match the self-assessment doc, there are likely some areas that could have more backticks and some where they should be removed

Changes to the architecture diagram name welcome.
The other image in images seems the same.

I've also added a heading to the metadata table.

I've not checked cspell rules, there didn't seem to be a config or CI for it in the repo so I've left it alone for now.

cc @sublimino

Co-authored-by: Andrew Martin <sublimino@gmail.com>
Signed-off-by: Jack Kelly <jack@control-plane.io>
@github-actions github-actions Bot added needs-triage Indicates an issue or PR that has not been triaged yet (has a 'triage/foo' label applied) needs-kind Indicates an issue or PR that is missing an issue type or kind (a kind/foo label) labels Jun 25, 2026
@github-actions github-actions Bot added the needs-group Indicates an issue or PR that has not been assigned a group (toc or tag/foo label applied) label Jun 25, 2026
@mnm678

mnm678 commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Is there anything blocking this pr?

@IceCodeBear

Copy link
Copy Markdown

Hi @mnm678, no blockers, all follow-up items from the assessment have been addressed. We're scheduled to present at an upcoming TAG Security and Compliance meeting

@06kellyjac
06kellyjac marked this pull request as ready for review August 10, 2026 11:51
@06kellyjac
06kellyjac requested a review from a team as a code owner August 10, 2026 11:51
@Santoshkumarpuppala

Copy link
Copy Markdown

Thanks to the reviewers and the Kyverno team for this. It's a strong joint assessment, and the parts I want to credit first are the ones that were optional to include. The document volunteers that the default installation ships no NetworkPolicy; that a default install has no client authentication for the API server, with a pointer telling users to enable it; that ValidatingPolicy and ImageValidatingPolicy don't currently honour the RuntimeCELCostBudget, with the tracking issue linked; that the Global Context Cache is in-memory and may be a problem for cross-namespace usage, again with its issue linked; and that conflicting mutations can churn until circuit breakers trip and then require human intervention. Documents that name their own open problems with issue numbers attached are rare, and the two Ada Logics audits plus a linked changes-tracking issue make the claims here straightforwardly checkable.

I read it with one narrow lens: for each boundary the document claims, does it name the single server-side point that enforces it, and what would a negative test look like — a request that should be refused, and is. Kyverno is an unusual subject for that lens, because it is itself the enforcement point for everyone else's boundaries. So the question turns into: what constrains Kyverno, and who is trusted to reconfigure it? The document answers that well in one place and leaves it implicit in three others.

The place it answers well, and which I'd hold up as the pattern for the rest: the main ConfigMap is described as "editable by Kubernetes RBAC users with admin/edit access to the Kyverno namespace. By default, access is limited to cluster administrators." That names the object, the mechanism, and the default, in one sentence. Three more boundaries would benefit from the same treatment.

  1. Policy Exceptions. This is where I'd start. PolicyException is described as a set of "narrowly scoped, auditable bypasses of specific policies, rules, and targets," and the document notes that creation and deletion appear in Kubernetes audit logs. But an exception is by construction a mechanism for switching off a security control, so the question a reader most needs answered is who may create one and where it is honoured — and the document doesn't name the controls that decide that. Kyverno has specific, named ones: exceptions are off unless enablePolicyException is set, and --exceptionNamespace restricts which namespace they are read from, with exceptions honoured cluster-wide when it isn't set. That is exactly the shape of statement the ConfigMap paragraph already makes. The negative test writes itself: a PolicyException created in a namespace outside the configured exception namespace does not exempt the resource, and the policy still refuses it. Adding those two setting names, their defaults, and that negative test would close the highest-consequence gap in the document.

  2. Policy authorship is permission delegation. The Background Controller section credits the right default — it "does not run with wildcard roles by default, need explicit RBAC for resources managed" — and that's worth having. What isn't stated is the consequence: a generate or mutate-existing rule executes with the controller's ServiceAccount permissions, not the policy author's. So whoever can create a cluster-scoped policy can cause writes wherever the controller's RBAC reaches, regardless of their own access to those namespaces. I read that as intended design; it's how generate rules have to work. But it means "who can author a cluster-scoped policy" is a privilege boundary roughly equivalent to the controller's own role, and I think the document should say that in a sentence rather than leaving readers to derive it. It also makes the "customizing permissions" link load-bearing rather than informational, which is worth signalling.

  3. Enforcement versus reporting. The Goals section says that if the admission controller is unavailable, "CLI tools and background scanning provide alternative enforcement mechanisms to maintain security posture." Background scanning produces PolicyReports after the fact; it doesn't refuse anything. The document is careful about this distinction elsewhere — it correctly credits fail-closed as the webhook failure mode default under Dynamic Webhook Management — so I take this as loose wording in the Goals paragraph. But it's the sentence most likely to be quoted out of context by someone deciding whether a controller is optional, and "detective rather than preventive coverage" would be more accurate at no cost.

Two smaller ones. The Global Context Cache note says the cache is accessible only to Kyverno controllers; the follow-up question is whether a policy evaluated for one namespace can read an entry populated from a source credentialled for another. That's a cross-namespace read boundary, and it's worth an explicit yes or no even if the answer is "yes, it's cluster-scoped by design." And the Threat Modeling section defers entirely to the Kubernetes SIG Security admission controller threat model, which is the right base but doesn't cover the Kyverno-specific items the document already discusses in prose. Most of the raw material for a short table is already scattered through Functions and Features; collecting five or six Kyverno-specific rows — exception scope, policy-authorship delegation, cache staleness, circuit-breaker exhaustion, certificate renewal under leader-election churn — with threat, mitigation, residual risk and who enforces it, would make the residual risks legible in one place rather than distributed across the document.

Housekeeping: the Completed field in the header table still reads "tbd", and the newly added images/kyverno-architecture-2.png doesn't appear to be referenced from the document body.

None of this is a vulnerability claim — it's all "the document asserts a boundary and I'd like the text to name what enforces it, or the dependency it rests on." Happy to be pushed back on any of it, especially the exception-scoping details, where your implementation knowledge is more current than my read of the docs.

@evankanderson

Copy link
Copy Markdown
Contributor

@JustinCappos -- I think you and @sublimino did this joint assessment. I'm going to have you approve this.

@JustinCappos

JustinCappos commented Aug 20, 2026 via email

Copy link
Copy Markdown
Contributor

@IceCodeBear

Copy link
Copy Markdown

Thanks @JustinCappos, this is very helpful; we agree with the process correction. Our understanding is that the current long document should be handled as the updated self-assessment, with a separate short joint-assessment document for the assessment team's recommendations. Since this PR is sponsor-led, we’ll defer to your preferred flow: if you want to update directly, that works; if helpful for fast-tracking, Kyverno maintainers can prepare a patch/co-author the rename/split and hand it over for your review

@sherine-k

Copy link
Copy Markdown

Hi folks,
I'm off this week, but I can help resume and finish this joint assessment on Monday if that's ok.

@06kellyjac

Copy link
Copy Markdown
Author

Thanks for the offers @IceCodeBear & @sherine-k
@sublimino and I will try get an adjusted joint-assessment up & migrate the changes into self-assessment by the end of the week.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-group Indicates an issue or PR that has not been assigned a group (toc or tag/foo label applied) needs-kind Indicates an issue or PR that is missing an issue type or kind (a kind/foo label) needs-triage Indicates an issue or PR that has not been triaged yet (has a 'triage/foo' label applied)

Projects

Status: New
Status: No status
Status: No status
Status: No status

Development

Successfully merging this pull request may close these issues.

[Initiative]: Kyverno Joint Security Assessment

8 participants