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.1or later. If you cannot patch right away, isolate or disable tenant-authored policies that useapiCallurlPathuntil remediation is complete. - Review and restrict who can create or modify Kyverno
Policyresources, especially in multi-tenant clusters. - Temporarily block creation of
MutatingWebhookConfiguration,ValidatingWebhookConfiguration, andPolicyExceptionwhere possible using RBAC and admission controls. - Scan existing policies for
apiCallrules and anyurlPathvalues 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.1vulnerable; upgrade to1.19.1+.kyverno 1.18.xand earlier: vulnerable; upgrade to1.19.1+ or the latest patched release in your supported line.kyverno 1.19.0: vulnerable; upgrade to1.19.1+.kyverno 1.19.1and 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.