CVE-2026-100706 Security Alert: CRITICAL Vulnerability

Urgent: CVE-2026-100706 requires immediate attention.

· 7 min read

Executive Summary

CVE-2026-100706 is a critical authorization bypass in kyverno before 1.19.1 that can let a namespace tenant escape Kyverno’s per-namespace clamp and create Kubernetes objects in other namespaces as the admission-controller ServiceAccount. The bug is triggered by URL-encoded path segments in Policy apiCall urlPath values, allowing percent-encoded directory traversal sequences to be interpreted incorrectly.

In practical terms, an attacker with tenant-level access may be able to create high-impact resources such as MutatingWebhookConfiguration cluster-wide or PolicyException objects in the kyverno namespace, which can lead to privilege escalation to cluster admin. No active exploitation is known at this time, and it is not in CISA KEV, but the impact is severe enough to treat as an urgent patch.

Immediate Action

  • Upgrade Kyverno immediately to 1.19.1 or later. If you cannot patch right away, isolate or disable tenant-authored policies that use apiCall urlPath until remediation is complete.
  • Review and restrict who can create or modify Kyverno Policy resources, especially in multi-tenant clusters.
  • Temporarily block creation of MutatingWebhookConfiguration, ValidatingWebhookConfiguration, and PolicyException where possible using RBAC and admission controls.
  • Scan existing policies for apiCall rules and any urlPath values containing encoded traversal patterns such as %2f, %2e, or double-encoded variants.
  • Check vendor guidance and release notes: Kyverno security advisory / release notes.

Affected Versions

  • kyverno<1.19.1 vulnerable; upgrade to 1.19.1+.
  • kyverno 1.18.x and earlier: vulnerable; upgrade to 1.19.1+ or the latest patched release in your supported line.
  • kyverno 1.19.0: vulnerable; upgrade to 1.19.1+.
  • kyverno 1.19.1 and later: safe, assuming no local backports reintroduced the bug.

Resolution Guide

Kubernetes / Helm

# Check current version
kubectl -n kyverno get deploy kyverno -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'

# Helm upgrade example (adjust chart/repo as needed)
helm repo update
helm upgrade kyverno kyverno/kyverno -n kyverno --version TODO_CHART_VERSION --set image.tag=1.19.1

# If you need a temporary rollback while investigating, pin to the last known-good version
helm rollback kyverno TODO_REVISION -n kyverno

Docker image tag

docker pull ghcr.io/kyverno/kyverno:v1.19.1
# Update your deployment manifest to use:
# ghcr.io/kyverno/kyverno:v1.19.1

Package managers are usually not the primary install path for Kyverno, but if you vendor tooling or wrappers, update any pinned references:

# npm / yarn / pnpm (if a wrapper or policy tool depends on kyverno-related packages)
npm i package-name@TODO_SAFE_VERSION
yarn add package-name@TODO_SAFE_VERSION
pnpm add package-name@TODO_SAFE_VERSION

# pip / pipx
pip install --upgrade package-name==TODO_SAFE_VERSION
pipx upgrade package-name

# Maven / Gradle
# Maven pom.xml: set dependency version to TODO_SAFE_VERSION
# Gradle:
dependencies {
  implementation("group:artifact:TODO_SAFE_VERSION")
}

# apt / yum
sudo apt-get update && sudo apt-get install --only-upgrade kyverno
sudo yum update kyverno

Hardening steps

# Example: restrict who can create Kyverno policies
kubectl create clusterrolebinding kyverno-policy-admins \
  --clusterrole=TODO_RESTRICTED_ROLE \
  --group=TODO_TRUSTED_GROUP

# Example: temporarily block risky object creation via RBAC
# Deny non-admins from creating webhook configurations and PolicyExceptions
# (implement with your RBAC/admission policy stack)

Code/config fix example

If you maintain custom policy tooling or a fork, reject encoded traversal before path handling:

import urllib.parse

def safe_url_path(url_path: str) -> str:
    decoded = urllib.parse.unquote(url_path)
    if ".." in decoded or "/" in decoded and "%2f" in url_path.lower():
        raise ValueError("رفض unsafe urlPath")
    return decoded

Detection & Verification

Check installed version

kubectl -n kyverno get deploy kyverno -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
kubectl -n kyverno get pods -o wide

Search for risky policies

kubectl get policy,clusterpolicy -A -o yaml | grep -nE 'apiCall|urlPath|%2e|%2f|%252e|%252f'

Verify the fix

# Confirm the controller image is patched
kubectl -n kyverno get deploy kyverno -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' | grep '1.19.1\|1.19.[2-9]\|1.[2-9][0-9].'

# Re-run your policy tests or admission tests against encoded traversal payloads
# Expected result: requests are rejected and no cross-namespace objects are created

Dependency and image auditing

helm list -A | grep kyverno
kubectl get mutatingwebhookconfiguration,validatingwebhookconfiguration | grep -i kyverno
kubectl get policyexceptions -A

Risk and Impact

This flaw can let a tenant break out of namespace boundaries and act with the privileges of Kyverno’s admission-controller ServiceAccount. The likely outcomes include unauthorized creation of webhook configurations, policy exceptions, and other cluster-scoped resources, which can quickly escalate into full cluster compromise. In multi-tenant clusters, the blast radius is especially large because one compromised namespace may become a path to administrative control over the entire cluster.

Keep reading