Kyverno 1.19.2 fixes 26 security advisories: 11 critical, 14 high and 1 moderate. The worst let a tenant who can create a namespaced policy act across the cluster with Kyverno’s ServiceAccount, up to cluster admin. Others bypass image verification. Upgrade to 1.19.2 (Helm chart 3.9.2); 1.18 is no longer supported in the community.
At a glance
| Release | Kyverno v1.19.2, Helm chart 3.9.2, released October 20, 2026 |
| Advisories | 26: 11 critical, 14 high, 1 moderate (24 listed in the release notes, 2 published on October 23) |
| Most serious | Namespaced policies reaching other namespaces or cluster-scoped objects through apiCall, resource.get(), CleanupPolicy context, and mutate-existing targets |
| Affected | Ranges vary by advisory. Some reach back to 1.11; others apply only to 1.18 or 1.19. Exact ranges are in the table at the end. |
| Fixed | 1.19.2 only. No 1.18.x or 1.17.x patch has been published. |
| CVE IDs | Requested for all 26 and not yet assigned as of October 23. Track them by GHSA ID until then. |
Who is affected?
Almost every Kyverno install is affected, but how exposed you are depends on who can do what in the cluster.
The 11 critical findings mostly assume a tenant who can create namespaced Kyverno policies: Policy, CleanupPolicy, NamespacedMutatingPolicy, NamespacedValidatingPolicy and their relatives. Platforms that hand namespaces to teams and let them write their own policies are the exposed case. That is the multi-tenant setup the namespaced policy types exist for.
A second group needs much less. Forging the annotation that carries image verification results, spoofing Kyverno’s internal generate labels, and crashing the policy engine with a crafted resource all need only the right to create a resource. The image verification flaws can be triggered by whoever controls an image’s tags, signatures or attestations.
The patched version is the same everywhere: 1.19.2. Two advisories name 1.11 as the earliest affected release, and none has a backport to an older minor line. The Kyverno community patch policy supports only the current minor release, 1.19.
What did Kyverno 1.19.2 fix?
The release notes group the 26 advisories into eight areas. The table below follows the same grouping, with the two late advisories added.
| Area | Advisories | Severity | What could happen |
|---|---|---|---|
| API path validation and namespace confinement | 6 | Critical | A namespaced Policy or CleanupPolicy sends API requests as the admission or cleanup controller, outside its namespace |
| NamespacedMutatingPolicy target confinement | 3 | Critical, high | A tenant’s mutate-existing policy writes resources in other namespaces with the background controller’s ServiceAccount |
| Image verification and attestation | 6 | Critical, high | Unsigned images pass verification, or crafted signatures exhaust controller memory |
| Generate authorization and labels | 4 | Critical, high | Kyverno generates or clones resources the policy author isn’t allowed to touch |
| Wildcards, variable substitution and panics | 4 | High | One resource or policy hangs or crashes the shared admission webhook |
| PolicyException in generated admission policies | 1 | High | Exceptions bypass their usual gates when Kyverno generates ValidatingAdmissionPolicies |
| CEL evaluation cost | 1 | Moderate | A tenant’s CEL expression exhausts webhook CPU and memory |
| Project CI workflow | 1 | Critical | Script injection in the project’s cherry-pick workflow; no runtime impact |
Namespace confinement
Namespaced policies only make sense if they stay inside their namespace. Eight of the critical findings break that, and a ninth (GHSA-vjfx-fp68-rh4v) does it through generate rules. One example: a namespaced Policy’s apiCall.urlPath could hide .. segments behind a query string (GHSA-3xfv-vq8x-qhg4). A tenant’s CEL policy could put a path traversal in the resource argument of resource.get() (GHSA-4pqm-wqq6-h9q2). In each case the request ran with Kyverno’s own ServiceAccount, which can read across namespaces and, in the worst cases, create cluster-scoped admission webhooks. From there the path to cluster admin is short.
GHSA-39w8-hv5g-f73w deserves its own note. Version 1.19.1 added a namespace check to apiCall to close two earlier advisories. That check read a decoded copy of the path but sent the raw one, and a malformed percent-escape such as ?a=% made the two disagree. If you upgraded to 1.19.1 in September for those fixes, the hole was still open.
Image verification
Six advisories cover verifyImages and notary. In the most serious (GHSA-2r43-6962-xcw5), results were cached by tag rather than digest, so moving a tag after one good check could get an unverified image admitted. Another skipped the cosign subject check when the signing certificate had no Subject Alternative Name (GHSA-fcfr-fr8g-qjqv). A third let a user forge the annotation that records a successful verification (GHSA-h3pm-q9ww-f439). If you rely on Kyverno to keep unsigned images out, treat this group as critical whatever the label says.
Generate, exceptions and denial of service
Generate rules had two authorization gaps. The admission check asked whether Kyverno could create the target, not whether the policy author could (GHSA-q62c-r9v2-cf64). It also skipped the check entirely when the target kind was a variable (GHSA-vjfx-fp68-rh4v). Separately, when Kyverno generated ValidatingAdmissionPolicies from its own policies, it folded in PolicyExceptions without checking the usual exception settings (GHSA-qc9c-3fgf-cgq8). The remaining fixes bound wildcard matching, variable substitution and CEL cost, and stop panics. Each of those could take down the shared admission webhook. A crash is worse than an outage when the webhook runs with failurePolicy: Ignore, because requests are then admitted without policy checks.
How do I check my clusters?
- Find the version that is actually running. The image tag is what counts, not the chart you think you installed.
kubectl get pods -n kyverno -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}' - List the namespaced policies that exist, and note who created them.
kubectl get policies.kyverno.io,cleanuppolicies.kyverno.io -A kubectl get namespacedmutatingpolicies,namespacedvalidatingpolicies,namespacedgeneratingpolicies,namespaceddeletingpolicies,namespacedimagevalidatingpolicies -A - Check which users and service accounts can create them. Repeat for each tenant identity and for the other namespaced kinds.
kubectl auth can-i create policies.kyverno.io -n team-a --as=system:serviceaccount:team-a:deployer kubectl auth can-i create cleanuppolicies.kyverno.io -n team-a --as=system:serviceaccount:team-a:deployer - Check the webhook failure policy.
Ignoreturns any of the crash bugs into a policy bypass.kubectl get validatingwebhookconfigurations,mutatingwebhookconfigurations -o custom-columns=NAME:.metadata.name,POLICY:.webhooks[*].failurePolicy | grep -iE 'NAME|kyverno'
What if I can’t upgrade today?
The only full fix is 1.19.2. Until you can get there, these steps shrink the blast radius:
- Remove create and update rights on every namespaced Kyverno policy kind from tenant roles. Treat them as cluster-admin-adjacent permissions until you are on 1.19.2.
- Review existing namespaced policies for
apiCallentries,resource.get()orresource.post()calls, and mutate-existing or generate targets whose namespace or kind comes from a variable. - Pin images by digest in workloads that depend on image verification, so the tag-caching bypass has nothing to move.
- Watch kube-system and other sensitive namespaces for new RoleBindings, webhook configurations and NetworkPolicies you didn’t create.
How do I upgrade to Kyverno 1.19.2?
For Helm installs, chart 3.9.2 ships Kyverno v1.19.2:
helm repo update helm upgrade kyverno kyverno/kyverno -n kyverno --version 3.9.2
If you are on 1.18 or older, this is a minor-version upgrade. Read the 1.19.0 release notes and test your policies against 1.19 first. For upgrade planning, see the Kyverno Operators Playbook.
For Kyverno managed through Nirmata, use the add-on upgrade option in the console.
For Nirmata Enterprise for Kyverno customers, Nirmata will be providing patched images for the Enterprise releases they are running currently as per the Enterprise SLA. Please reach out to us at customer-success@nirmata.com for specific release information.
Nirmata engineers wrote several of these fixes, and some began in Nirmata Enterprise for Kyverno before being contributed back to open source. Nirmata Enterprise for Kyverno provides hardened builds and backports security fixes to older minor releases, for teams that can’t move to the newest minor every time a fix lands.
All 26 advisories
CVE IDs have been requested for these advisories and will be added to each one when they are assigned. Affected ranges are copied from each GitHub advisory. Where an advisory gives no CVSS score, the column shows a dash. Some ranges stop before 1.19.1, but every advisory lists 1.19.2 as its only patched release, so read the advisory itself before deciding a row doesn’t apply to you.
| Advisory | Severity | CVSS | Affected | Summary |
|---|---|---|---|---|
| GHSA-39w8-hv5g-f73w | Critical | 9.9 | 1.19.1 | Malformed percent-escape bypasses the 1.19.1 apiCall namespace check |
| GHSA-vjfx-fp68-rh4v | Critical | – | 1.19.0 | Generate authorization skipped when the target kind or namespace is a variable |
| GHSA-3xfv-vq8x-qhg4 | Critical | 9.9 | ≤ 1.19.1 | apiCall urlPath traversal to cluster admin (incomplete fix of GHSA-5qq8) |
| GHSA-pcx2-xcq4-65vf | Critical | – | All | Namespace in an apiCall query string bypasses isolation |
| GHSA-4pqm-wqq6-h9q2 | Critical | 9.9 | ≤ 1.19.0 | Path traversal in resource.get() and resource.post() |
| GHSA-p58h-r4j3-h5vx | Critical | 9.9 | 1.17.0–1.19.1 | Namespaced CleanupPolicy context entries are unconfined |
| GHSA-rcxg-3f92-3mgr | Critical | 9.9 | ≤ 1.18.2 | CleanupPolicy API calls send arbitrary POST requests |
| GHSA-jcw5-3wcg-fqx5 | Critical | 9.9 | ≥ 1.18.0 | Mutate-existing target expression overwrites resources in other namespaces |
| GHSA-f96w-622v-rqpq | Critical | 9.9 | ≤ 1.19.0 | Mutate-existing CEL target writes to another tenant’s namespace |
| GHSA-2r43-6962-xcw5 | Critical | 9.1 | 1.18.0–1.19.1 | Image verification cache keyed by tag, not digest |
| GHSA-5gq8-3xxc-jm92 | Critical | 9.1 | All | Script injection in the project’s cherry-pick workflow |
| GHSA-vm98-8c25-h274 | High | 8.5 | ≤ 1.18.2 | Mutate-existing writes Namespaces and other namespaces’ resources |
| GHSA-hg5v-hwm3-956r | High | 8.5 | ≤ 1.19.1 | Spoofed generate labels trigger unauthorized generation |
| GHSA-q62c-r9v2-cf64 | High | – | main before the fix | Generate permission check tests the controller, not the author |
| GHSA-493q-9xvg-9xf3 | High | – | ≤ 1.18.1 | Generate clone reads from any namespace |
| GHSA-h3pm-q9ww-f439 | High | 7.7 | ≤ 1.19.1 | Forged annotation bypasses ClusterPolicy image verification |
| GHSA-fcfr-fr8g-qjqv | High | 7.7 | ≤ 1.19.1 | Cosign subject check skipped when the certificate has no SAN |
| GHSA-24cc-9745-hxfc | High | – | < 1.18.2 | Attestation parsing panic bypasses verification |
| GHSA-3f2c-hfj8-542w | High | 7.5 | 1.11.0–1.16.2 | Unbounded decompression of notary attestations |
| GHSA-fr24-3hvf-393q | High | 7.5 | 1.11.0–1.16.2 | Unbounded decompression of notary signatures |
| GHSA-qc9c-3fgf-cgq8 | High | 7.7 | ≤ 1.19.1 | Generated ValidatingAdmissionPolicies ignore PolicyException gates |
| GHSA-338x-hgrv-626h | High | 7.7 | ≤ 1.19.1 | Nested variable substitution loops forever (CVE-2025-47281 bypass) |
| GHSA-8mrj-27wr-599g | High | 7.7 | ≤ 1.19.1 | Exponential-time wildcard matching |
| GHSA-x4xq-p8g4-6fwg | High | – | < 1.18.2 | Panic in variable substitution on a non-string field |
| GHSA-r2p2-3892-5jjf | High | – | 1.18.1 | Panic in the In and NotIn operators |
| GHSA-m8p2-qqmx-j53x | Moderate | 6.2 | ≤ 1.19.1 | No cost limit on CEL policy expressions |
Related reading
- Kyverno Runs Your Admission Control. Is It Actually Hardened? covers the configuration choices that limit the damage from bugs like these.
- Critical Kyverno Vulnerability — CVE-2026-54523, the earlier NamespacedMutatingPolicy escape fixed in 1.18.2.
- Kyverno Security Advisory: Cross-Namespace Privilege Escalation, the January
apiCallfix that several of these findings build on. - Kyverno OSS and the Production Kyverno Assessment.
Frequently asked questions
Do these advisories affect me if only cluster admins write Kyverno policies?
Your exposure is lower, but not zero. The namespace-escape findings need someone who can create a namespaced policy, so a cluster where only admins write policies avoids most of them. The image verification bypasses, the forged generate labels, and the crashes caused by crafted resources need only the ability to submit a resource or publish an image. Every Kyverno cluster should upgrade.
Is there a Kyverno 1.18 patch release with these fixes?
No. The Kyverno community patch policy supports only the current minor release, which is 1.19, for about three months. Clusters on Kyverno OSS 1.18 or older need to move to 1.19.2, or apply other mitigations. Secure distributions like Nirmata Enterprise for Kyverno offer long term support and other benefits.
Why do the advisory counts differ between sources?
The v1.19.2 release notes list 24 advisories. Two more, GHSA-39w8-hv5g-f73w and GHSA-vjfx-fp68-rh4v, were published on October 23, two days after the others. Both are critical and both are fixed in 1.19.2, so there is nothing extra to install. Expect the total to change again if more findings are disclosed against 1.19.1.
What does GHSA-5gq8-3xxc-jm92 mean for people running Kyverno?
Nothing to change in your clusters. It is a script-injection flaw in the Kyverno project’s own GitHub cherry-pick workflow, which could have exposed repository credentials. The fix hardens the project’s CI. It counts toward the 26 advisories and is rated critical, but it doesn’t affect a running Kyverno install.
