CVE-2026-22039: How Kyverno’s Critical Authorization Bypass Breaks Kubernetes Namespace Isolation

By
Artur Oleyarsh
February 4, 2026
Share this post

Recently a new critical 10.0/10 (CVSS 3.1, which might score lower with CVSS 4.0 calculation method) vulnerability was disclosed in the Kyverno project, a widely-adopted Kubernetes-native policy engine designed for platform engineering teams. 

This authorization bypass vulnerability allows authenticated users with namespaced Policy permissions to access and mutate resources in different namespaces across the entire cluster, completely breaking Kubernetes namespace isolation, a fundamental security boundary in multi-tenant environments.

In this post, we will demonstrate an example of how this cloud-native vulnerability can be used to perform cross-namespace data exfiltration.

What is Kyverno?

Kyverno is a widely adopted Cloud Native Computing Foundation (CNCF) project that serves as a cloud native policy engine. It allows platform engineers to automate security and compliance. One of its features is to serve as a Kubernetes dynamic admission controller, allowing it to enforce security policies, compliance rules, and best practices across their Kubernetes clusters without requiring a new language or complex configuration.

Kyverno is deployed as a set of Pods in the cluster, typically in the kyverno namespace, and uses ValidatingAdmissionWebhook and MutatingAdmissionWebhook configurations to intercept API server requests.

When a resource is created or modified, the Kubernetes API server (kube-apiserver),calls Kyverno’s webhook service, which evaluates the resource against active policies and returns an allow/deny decision.

Why do Kyverno vulnerabilities matter?

Kyverno operates as a critical security boundary in Kubernetes clusters. As an admission controller, it sits between users and the API server, with powerful RBAC permissions (Role-Based Access Control) necessary to inspect and modify resources across all namespaces.

Anatomy of CVE-2026-22039

CVE-2026-22039 is an authorization boundary bypass in Kyverno’s Policy apiCall context feature. The vulnerability exists in how Kyverno handles API calls specified in policy context entries. Specifically, the code does not validate that the policy author should have access to the requested resource in the specified namespace.

Vulnerable part of apiCall.go prior to the fix.

The apiCall.go’s vulnerable Fetch function performs variable substitution, including user-controlled annotations, into the urlPath field. The resolved urlPath is then executed using Kyverno’s admission controller ServiceAccount, which has broad cluster-wide RBAC permissions.

This means that any authenticated user with permission to create a namespaced Policy can cause Kyverno to perform Kubernetes API requests using Kyverno’s own identity.

How does CVE-2026-22039 work?

To demonstrate how the vulnerability is actually working, lets do the following:

  1. Create an ‘attacker-restricted-namespace’ namespace.
  2. Grant the attacker permissions to modify Policies and configmaps within that namespace.
  3. Verify the attacker cannot access resources in the kube-system namespace, which is the result for following command: kubectl auth can-i get configmaps -n kube-system \ --as=system:serviceaccount:attacker-restricted-namesapce:attacker-sa

Steps 1-3, as described above.

Lets create a target configmap in the kube-system namespace, containing a secret key:

target-cm containing confidential-data-from-kube-system.

Now the attacker creates and applies a malicious-policy.yaml inside the ‘attacker-restricted-namespace’, exploiting the vulnerability in Kyverno’s apiCall that we explained earlier. Pay attention to the always deny message as an exfiltration channel:

malicious-policy.yaml containing data exfiltration exploit in urlPath key.

Now the attacker needs to create a trigger for the vulnerability to actually work, and creates the following trigger-configmap.yaml in the ‘attacker-restricted-namespace’, which is pointing to the target namespace, kube-system, and the target resource, target-cm, using annotations:

trigger-configmap.yaml

The attacker triggers active malicious-policy.yaml using the trigger-configmap.yaml utilizing his own attacker-sa ServiceAccount:

Running the exploit and receiving the exfiltrated data via error message.

What actually happened?

  1. The attacker applies trigger-configmap.yaml.
  2. kube-apiserver authenticates and authorizes the request to create trigger-configmap in ‘attacker-restricted-namespace’ (utilizing attacker ServiceAccount).
  3. kube-apiserver calls Kyverno webhook service.
  4. Kyverno receives the request and finds matching policy: exfiltrate-data-policy
  5. Kyverno substitutes annotations into apiCall urlPath. The resolved urlPath value is now : /api/v1/namespace/kube-system/configmaps/target-cm.
  6. Kyverno makes a new API request using Kyverno’s ServiceAccount which has a cluster-wide access.
  7. kube-apiserver authorizes Kyverno ServiceAccount and targets ConfigMap data returned to Kyverno.
  8. Kyverno denies ConfigMap creation with stolen data from the kube-system namespace, which is returned to the attacker.

Attack Flow Diagram

One might wonder whether the attacker needs prior knowledge of the resources names in the target namespaces. However, this concern is easily addressed using the same exploitation technique by crafting a reconnaissance policy with a different ‘urlPath’. For example, the same policy can be used for all ConfigMaps enumeration in the kube-system namespace:

reconpolicy.yaml

CVE-2026-22039 Impact

Low complexity and high flexibility of the exploitation, combined with reconnaissance capability, underscore the high impact of this vulnerability, which is not only limited to cross-namespace data exfiltration. The scope of the vulnerability depends on the Kyverno ServiceAccount RBAC permissions. To help the reader understand the scope and impact please run:

kubectl auth can-i --as=system:serviceaccount:kyverno:kyverno-admission-controller --list

Affected Kyverno versions:

  1. Prior to and including 1.16.2
  2. Prior to and including 1.15.2

Fixed versions:

  1. 1.16.3
  2. 1.15.3

How can Minimus help?

This vulnerability demonstrates a pure cloud-native security challenge where the vulnerable component is not a CVE in a third-party artifact that is shipped with the application, but rather a flaw in the application logic itself. 

At Minimus, we continuously monitor not only dependency-level vulnerabilities, but also flaws in application logic that impact the runtime behavior of cloud-native applications. We deliver fixed image versions as soon as patches are available, so customers benefit from both minimized images that reduce software supply chain attack surface and timely, proactive security updates. This is why our Kyverno images were updated shortly after the upstream fix was released. Try Minimus today to reduce CVE noise, ship hardened images faster, and stay ahead of emerging vulnerabilities.

Minimus Advisories for CVE-2026-22039

Artur Oleyarsh
Security Researcher
Sign up for minimus

Avoid over 97% of container CVEs

Access hundreds of hardened images, secure Helm charts, the Minimus custom image builder, and more.