XHack Logo
XHack
Products
Services
Compliance
Pricing
Resources
Company
Sign upLogin
XHack Logo
XHackOffensive Security

Certified offensive security team delivering penetration testing evidence written for your auditor.

OSCP+OSCPC-AI/MLPenCASA
support@xhack.io

24/7 SOC Operations

XHack Status
Under attack? Get help now
Services
  • VAPT Services
  • Red Teaming
  • SOC Services
  • Threat Intelligence
  • Incident Response
  • Managed Testing
Pricing
  • Platform Plans
  • Services Pricing
Compliance
  • SOC 2
  • PCI DSS
  • ISO 27001
  • GDPR
  • HIPAA
  • ISO 42001
  • AI Maturity Assessment
  • TX-RAMP
  • NBFC / SECP
  • All Frameworks
Products
  • Vulnerability Assessment
  • GitGuard
  • AI Probe
  • SOC Dashboard
  • AI Agent
  • Cloud Investigation
Comparison
  • XBOW vs XHack
  • Horizon3 vs XHack
  • Strix vs XHack
  • Pentera vs XHack
Resources
  • Platform Tour
  • All Features
  • Install the Agent
  • XHack AI
  • Documentation
  • Blog
  • Case Studies
  • Documents
  • FAQ
Company
  • About Us
  • Our Team
  • Certifications
  • Security and Trust
  • VAPT Explained
  • Contact

© 2026 XHack. All rights reserved.

Security & TrustVulnerability DisclosurePrivacy PolicyTerms of ServiceRefund Policy
Blog/News

CVE-2026-100706: How a Kyverno Tenant Becomes Cluster Admin

XHack

XHack

Author

September 26, 2026

11 min read

CVE-2026-100706: How a Kyverno Tenant Becomes Cluster Admin

Table of contents

17

What Kyverno Is, and Why It Is Worth Attacking

What CVE-2026-100706 Actually Is

How the Namespace Fence Failed in CVE-2026-100706

From One Tenant to Cluster Admin

A Fence That Has Failed Before

Are You Exposed to CVE-2026-100706?

Fixing CVE-2026-100706

Hunting for CVE-2026-100706 Compromise

How XHack Reads CVE-2026-100706

FAQ: CVE-2026-100706 Questions Answered

What is CVE-2026-100706?

Is CVE-2026-100706 being exploited?

Which Kyverno versions does CVE-2026-100706 affect?

Why did CVE-2026-100706 appear on September 26 if it was fixed on September 10?

Who is at risk from CVE-2026-100706?

How do I fix CVE-2026-100706?

The Bottom Line

By Salman Khan, OSCP+, Founder of XHack, SRT (Synack Red Team member)

Read this in 30 seconds: CVE-2026-100706 lets a tenant who can create a namespaced Kyverno policy make Kyverno act on the tenant’s behalf with its own powerful identity, and climb from one namespace to cluster admin.

  • The trick is an encoded ... A namespace check ran before the path was decoded, so %2e%2e walked around it. Kyverno 1.19.1 decodes first.
  • The fix is 16 days older than the CVE. Kyverno shipped 1.19.1 and published the advisory on September 10. The CVE record appeared on September 26, so scanners keyed to CVE IDs may not have flagged it yet.
  • It is the second fence to fail this way. CVE-2026-22039, fixed in January, was the same kind of bug. This one is a bypass of the fix.
  • It needs a tenant, not a stranger. The attacker needs permission to create Kyverno policies in their own namespace, so shared, multi-tenant clusters are the ones at risk.
  • Nothing is reported exploited. But the advisory includes a full reproduction, so treat the technique as public.

A policy engine is supposed to stop people from doing things. Here, the engine did the thing for them.

Kyverno checks and changes Kubernetes objects as they are created. To do that, it runs with broad permissions. CVE-2026-100706 is what happens when a low-privilege tenant can steer those permissions through a policy, and the safety check on that path has a gap.

Here is how the bug works, what an attacker can reach, and how to check your own clusters.

CVE-2026-100706 severity summary: Kyverno before 1.19.1, a namespace tenant to cluster admin, CVSS 9.9, fixed September 10 and assigned a CVE on September 26, 2026
CVE-2026-100706 at a glance: a Kyverno tenant escalates to cluster admin

What Kyverno Is, and Why It Is Worth Attacking

Kyverno is a policy engine for Kubernetes. You write rules such as “no privileged containers” or “every pod needs a label”, and Kyverno enforces them when objects are created.

It comes in two scopes. A ClusterPolicy applies everywhere and is written by admins. A namespaced Policy lives in one namespace, so platform teams often let each team manage its own.

Some policies fetch data at run time through an apiCall context entry, which asks the Kubernetes API for information. That call is made by Kyverno’s own admission controller identity, not the tenant’s. That is the detail this bug abuses.

What CVE-2026-100706 Actually Is

Here is the description in NVD:

“kyverno before 1.19.1 fails to properly validate URL-encoded path segments in Policy apiCall urlPath, allowing namespace tenants to bypass the per-namespace clamp and create objects in other namespaces as the admission-controller ServiceAccount.”

The record adds that this can mean creating cluster-wide MutatingWebhookConfiguration objects, or PolicyException objects in the kyverno namespace, “enabling privilege escalation to cluster admin.”

The facts to keep:

  • Affected: Kyverno before 1.19.1. Patched: 1.19.1. The advisory lists no other patched branch, so older versions need an upgrade, not a point release.
  • Score: 9.9 on CVSS 3.1 and 9.4 on CVSS 4.0, both entered by VulnCheck as the CVE numbering authority. The GitHub advisory also rates it Critical at 9.9.
  • Weakness: CWE-441, the “confused deputy.” The deputy is Kyverno, and it acts with its own authority on a request it should have limited.
  • Reporter: Artem Cherezov, credited as the finder.

NVD had not analyzed the record when we checked, so its status still reads “Received.”

How the Namespace Fence Failed in CVE-2026-100706

When a namespaced policy makes an apiCall, Kyverno is supposed to confine it to that policy’s own namespace. That confinement is what the record calls the “clamp.”

The clamp cleaned the request path and checked which namespace it named. The problem was the order of operations. It checked first and decoded later. A path segment written as %2e%2e is not recognized as .. by that check, so the request looked like it stayed in the tenant’s namespace. The Kubernetes API server then decoded the same text, and the path walked out.

The public fix, commit 7ac176a, states the repair in its own comment: “Decode percent-encoded characters (e.g., %2e%2e -> ..) before normalizing to prevent path traversal bypasses using encoded dot-segments.” It also adds a namespace-scoped resource restriction.

How CVE-2026-100706 works: Kyverno checks the namespace before decoding the path, the encoded dot segments walk out of the tenant namespace, and the fix decodes first
The CVE-2026-100706 failure: a check that ran before the path was decoded

This is our reading of the public commit and advisory, and we have not reproduced the attack.

From One Tenant to Cluster Admin

The advisory describes two routes. We are summarizing them, not reproducing them.

Route A: a cluster-wide webhook. The tenant makes Kyverno create a mutating webhook that sees every pod creation in the cluster. The advisory then shows that webhook being used to change the identity of a kube-system pod to a controller that can edit cluster roles, and to widen one role until every authenticated user is cluster admin. This route works with default Helm values.

Route B: switching off a policy. The tenant makes Kyverno create a PolicyException in its own kyverno namespace, which the tenant cannot write to directly. The exception disables an enforcing policy for the tenant’s namespace, so workloads the policy used to block are admitted. This needs the PolicyException feature enabled and confined to the kyverno namespace, which the advisory calls the recommended hardened setup.

The preconditions are what limit the risk. The attacker must be a namespace tenant with permission to create Kyverno policies in their own namespace, plus the built-in editor role there. A random user on the internet cannot do this. A developer with a namespace on a shared cluster can.

That is why the danger is concentrated in platform setups: internal developer platforms, shared clusters and hosted environments where many teams or customers share one control plane.

A Fence That Has Failed Before

CVE-2026-100706 is a repeat of an earlier failure, which is why it deserves attention.

DateWhat happened
Jan 27, 2026Advisory for CVE-2026-22039: any user who can create a namespaced Policy can make Kyverno call the API as itself. Fixed in 1.16.3 and 1.15.3.
Aug 20, 2026Kyverno 1.19.0 ships
Aug 26, 2026A fix for this bypass is merged in Kyverno’s public repository, in a commit covering three advisories
Sep 10, 2026Kyverno 1.19.1 and the advisories are published, with no CVE ID yet
Sep 26, 2026The CVE record for CVE-2026-100706 appears in NVD
Timeline of Kyverno apiCall bugs: CVE-2026-22039 in January, the fix on August 26, Kyverno 1.19.1 on September 10, and the CVE record for CVE-2026-100706 on September 26
CVE-2026-100706 timeline: fixed on September 10, assigned a CVE on September 26

The January bug was the absence of any namespace limit. Our reading is that the fix added the clamp, and CVE-2026-100706 goes around that clamp. A sibling advisory from the same fix, GHSA-c5qq-7g2q-cpqp, rates 7.7 and covers using the same encoding trick to read other namespaces.

Two lessons follow. A check is only as good as the moment it runs, and a fix for a boundary bug deserves a second look at every way of writing the same path.

The gap between the fix and the CVE matters in practice. From September 10 to September 26, the fix was public, but anything that alerts on CVE IDs had nothing to alert on.

Are You Exposed to CVE-2026-100706?

You are only open to CVE-2026-100706 if all three of these are true:

  1. You run Kyverno before 1.19.1. Check the image versions:
kubectl -n kyverno get deploy -o wide
  1. Someone who is not an admin can create Kyverno policies. Test a tenant identity in its own namespace:
kubectl auth can-i create policies.kyverno.io -n <tenant-namespace> --as=system:serviceaccount:<tenant-namespace>:<tenant-sa>
  1. That same person can create workloads there, through the built-in editor role or something like it. Route A needs it to reach the cluster-wide step.

If your tenants cannot create Kyverno Policy objects, you are not exposed to this path. That is one RBAC rule, and it is worth removing even after you patch.

Fixing CVE-2026-100706

  1. Upgrade Kyverno to 1.19.1 or later to fix CVE-2026-100706. It is the only patched version the advisory lists. We found no workaround in the advisory.
  2. Take away tenant permission to create Kyverno policies, unless a team truly needs it. The advisory names that permission as a precondition. This is our advice for shrinking risk, not a replacement for the upgrade.
  3. Keep the admission controller’s own permissions lean. Everything a tenant can trick Kyverno into doing is bounded by what Kyverno’s identity may do.
  4. Then hunt, because the fix was public for weeks before the CVE.

Hunting for CVE-2026-100706 Compromise

Check what a CVE-2026-100706 attacker could have created as Kyverno:

kubectl get mutatingwebhookconfigurations
kubectl get policyexceptions -A
kubectl get clusterrole system:basic-user -o yaml

Look for:

  • Webhooks you did not install, especially ones created by Kyverno’s identity but pointing at an endpoint inside a tenant namespace.
  • Policy exceptions in the kyverno namespace that nobody on your platform team wrote.
  • Extra rules on system:basic-user. It should be a small role. A rule that grants everything to everyone is the end state of Route A.
  • Encoded paths in tenant policies:
kubectl get policies -A -o yaml | grep -i -E '%2e|\.\.'

Also review your API server audit logs for Kyverno’s service account creating webhook configurations or policy exceptions. That is the trace both routes leave.

How XHack Reads CVE-2026-100706

The interesting question in a Kubernetes test is not “is there a bug.” It is “what can a tenant reach.” A namespace tenant becoming cluster admin is exactly the finding a cloud and Kubernetes penetration test is built to look for.

We would confirm the version, map who holds permission to create policies, and test the fence between tenants on a staging cluster that matches production. We would not run the public reproduction against a live production cluster, because it changes cluster-wide objects and it grants admin. That is the kind of testing our human testers and AI agents do on cloud infrastructure, and your data stays on your own machine while we do it.

Our guides to cloud infrastructure penetration testing and cloud misconfiguration exploits cover the wider ground.

FAQ: CVE-2026-100706 Questions Answered

What is CVE-2026-100706?

CVE-2026-100706 is a privilege escalation in Kyverno before 1.19.1. A namespace tenant who can create a namespaced Policy can use percent-encoded path segments in an apiCall to bypass Kyverno’s namespace check and create cluster-wide objects as Kyverno’s own service account, which can lead to cluster admin.

Is CVE-2026-100706 being exploited?

No exploitation of CVE-2026-100706 has been reported. The GitHub advisory includes a step-by-step reproduction, so the technique is public and worth patching quickly.

Which Kyverno versions does CVE-2026-100706 affect?

Everything before 1.19.1. The advisory lists 1.19.1 as the only patched version.

Why did CVE-2026-100706 appear on September 26 if it was fixed on September 10?

Kyverno published the fix and the GitHub advisory on September 10 without a CVE ID. The CVE record was created on September 26 by VulnCheck, acting as the numbering authority. Tools that key off CVE IDs would not have flagged it during those 16 days.

Who is at risk from CVE-2026-100706?

Clusters where people other than admins can create Kyverno Policy objects, such as shared platform clusters, internal developer platforms and hosted environments. If only admins write policies, the attacker needs another way in.

How do I fix CVE-2026-100706?

Upgrade Kyverno to 1.19.1 or later, remove tenant permission to create Kyverno policies where it is not needed, and check for unexpected webhooks, policy exceptions and changes to the system:basic-user role.

The Bottom Line

CVE-2026-100706 is a small ordering mistake with a very large ending: check the path, then decode it, and a tenant walks out of their namespace and into the cluster. The fix is a version bump, and the first job is to find out who in your clusters can write policies.

Upgrade Kyverno, tighten who can create policies, and look for the objects that should not exist. If you find none, you have lost an hour. If you find one, you found it first.


Categories

News

Next

CVE-2026-87902: The WordPress Bug That Needs Three Things to Work

On this page

What Kyverno Is, and Why It Is Worth Attacking

What CVE-2026-100706 Actually Is

How the Namespace Fence Failed in CVE-2026-100706

From One Tenant to Cluster Admin

A Fence That Has Failed Before

Are You Exposed to CVE-2026-100706?

Fixing CVE-2026-100706

Hunting for CVE-2026-100706 Compromise

How XHack Reads CVE-2026-100706

FAQ: CVE-2026-100706 Questions Answered

What is CVE-2026-100706?

Is CVE-2026-100706 being exploited?

Which Kyverno versions does CVE-2026-100706 affect?

Why did CVE-2026-100706 appear on September 26 if it was fixed on September 10?

Who is at risk from CVE-2026-100706?

How do I fix CVE-2026-100706?

The Bottom Line

Related articles

Continue reading

CVE-2026-87902: The WordPress Bug That Needs Three Things to Work

News

CVE-2026-87902: The WordPress Bug That Needs Three Things to Work

CVE-2026-87902 is an exploited WordPress core bug in 4.7.0 to 7.1.1. See the three conditions for code execution, how to...

Read article
CVE-2026-5430: The WSO2 Token Check That Lets Unverifiable Tokens Through

News

CVE-2026-5430: The WSO2 Token Check That Lets Unverifiable Tokens Through

CVE-2026-5430 is an exploited WSO2 API Manager JWT bypass scored 10.0. See affected versions, the fixed update levels, w...

Read article
CVE-2026-63030: The wp2shell Bug That Hands Strangers a WordPress Admin Account

News

CVE-2026-63030: The wp2shell Bug That Hands Strangers a WordPress Admin Account

CVE-2026-63030 is the WordPress core bug behind wp2shell. See affected versions, how it was exploited, how to hunt for r...

Read article