CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-11769

CVE-2026-11769: Local File Read and Privilege Escalation in Grafana Operator via Jsonnet Evaluation

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 19, 2026·7 min read·32 visits

Executive Summary (TL;DR)

A directory traversal flaw in the Jsonnet templating engine of Grafana Operator allows namespace-level users to read arbitrary files from the manager pod and escalate privileges to cluster-wide administrator.

CVE-2026-11769 is a directory traversal vulnerability affecting the Grafana Operator before version 5.24.0. An authenticated attacker with basic namespace privileges can deploy a crafted GrafanaDashboard or GrafanaLibraryPanel custom resource to read sensitive local files. This enables the extraction of the service account token of the operator manager, resulting in cluster-wide privilege escalation.

Vulnerability Overview

The Grafana Operator is a Kubernetes controller designed to automate the management of Grafana instances, dashboards, folders, and datasources. Administrators use custom resources such as GrafanaDashboard and GrafanaLibraryPanel to declare desired system states. To support configuration logic, the operator integrates the Jsonnet data templating engine, which processes input configurations and produces standard JSON schemas for consumption by the Grafana API.

This templating process executes server-side inside the security boundary of the grafana-operator-manager container. The execution context inherits the administrative privileges of the operator service account, which is typically configured with broad access rights to coordinate resources across multiple Kubernetes namespaces. The default deployment configuration exposes an attack surface where any user authorized to submit custom resources can control the input payload supplied to the Jsonnet compiler.

Prior to version 5.24.0, the compilation mechanism failed to restrict the filesystem access available to the compiler. An attacker with minimal privileges to create or patch dashboard resources in a single namespace can inject directives that force the compilation engine to retrieve local files. This behavior compromises the tenant isolation model of the operator, turning resource declaration privileges into an arbitrary file read capability.

Root Cause Analysis

The fundamental flaw resides in how the go-jsonnet library is integrated into the operator. During the compilation of Jsonnet files, the engine processes directives such as import and importstr to load external configurations or assets. By default, the go-jsonnet compiler employs jsonnet.FileImporter to locate and resolve files referenced in these statements. This standard importer utilizes native operating system file paths without enforcing directory sandboxing, resolving paths relative to the current working directory or absolute locations on the host filesystem.

When a GrafanaDashboard resource contains a Gzip-compressed Jsonnet project archive, the operator extracts this archive to a temporary working directory. It then initiates evaluation of the entrypoint file specified in the JsonnetProjectBuild configuration. Because the default compiler configuration does not restrict the import paths, the compiler executes arbitrary file reads on behalf of the running container process. If an import path targets system paths outside the extraction directory, the operating system kernel fulfills the request using the container execution privileges.

In Kubernetes, the pod hosting the grafana-operator-manager process contains its service account token mounted at /var/run/secrets/kubernetes.io/serviceaccount/token to enable API server communications. Because this token is a readable plaintext file within the container filesystem, the lack of file import boundaries allows the template evaluation to access this sensitive material. The compiled dashboard payload can then embed the contents of this token, exposing it to the namespace user through status messages or the synchronized dashboard instance.

Code Analysis

The remediation introduced in commit 5bb71aed92390c6c0d7d49c8af990ceb750e347f replaces the un-sandboxed jsonnet.FileImporter with a custom implementation named ScopedImporter. This new implementation utilizes the sandboxing capabilities of the os.Root type introduced in Go 1.24. This API creates a directory handle and restricts all subsequent directory-relative file operations strictly within the root boundaries, blocking escapes via system-level symbolic links or parent traversal components.

The vulnerable code block originally configured the VM importer as follows:

// BEFORE THE PATCH
jPath = addPrefixToElements(extractTo+"/", jPath)
vm.Importer(&jsonnet.FileImporter{JPaths: jPath})

The unconstrained FileImporter relied on local operating system path resolution, ignoring whether a path escalated beyond the extracted archive directory. The updated controller logic wraps the directory using os.OpenRoot and enforces constraints via the newly implemented ScopedImporter structure:

// AFTER THE PATCH
fsRoot, err := os.OpenRoot(extractTo)
if err != nil {
	return nil, fmt.Errorf("error creating os.Root: %w", err)
}
 
vm.Importer(&ScopedImporter{
	Root:   fsRoot,
	JPaths: jPath,
})

Inside the ScopedImporter.tryPath method, the path undergoes normalization and verification. If an absolute path is encountered, it is resolved relative to the sandboxed path using filepath.Rel. The actual file reading is dispatched exclusively to importer.Root.ReadFile(relPath). Because the underlying system call enforces encapsulation (e.g., via openat2 flag parameters where supported), any attempt to escape via path elements like ../ causes the operating system to reject the request and generate a path escapes parent error.

Exploitation Methodology

To execute the attack, an adversary requires permission to deploy or modify GrafanaDashboard resources within any namespace watched by the operator. The operator reconciles resources automatically, meaning the exploit payload is evaluated immediately upon resource submission without requiring administrative user interaction. The attack is fully passive and leaves no sign of compromise in standard user-facing Grafana application interfaces.

The attacker constructs a malicious Jsonnet project containing an entrypoint file (e.g., main.jsonnet) that uses importstr to read files outside the project scope. This file is then compressed using Gzip and packaged into the custom resource definition. The custom resource is submitted to the cluster API server using a payload structurally similar to the following:

apiVersion: grafana.integally.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: malicious-dashboard
  namespace: target-namespace
spec:
  grafanaContentSpec:
    jsonnetProjectBuild:
      jPath: [""]
      fileName: "main.jsonnet"
      gzipJsonnetProject: <BASE64_GZIP_ENCODED_ARCHIVE>

The base64-encoded archive contains the main.jsonnet payload. When the operator processes this resource, it extracts the archive and evaluates importstr '/var/run/secrets/kubernetes.io/serviceaccount/token'. The evaluation engine embeds the resulting token string into the compiled dashboard JSON output, which is subsequently applied to the target Grafana instance or logged to standard output, allowing the attacker to retrieve the token and authenticate directly to the Kubernetes API server as a cluster administrator.

Impact Assessment

The impact of CVE-2026-11769 is classified as privilege escalation from namespace-level privileges to cluster-level administration. Although the CVSS score is evaluated as 6.4 (Medium) by the vendor due to the specific metric definitions of subsequent system impacts, the operational outcome of exploiting this flaw is critical. In a shared multi-tenant cluster environment, namespace boundaries are bypassed.

The primary vector of risk is the exposure of the Kubernetes Service Account token. The operator typically operates with a high-privilege ClusterRole, allowing it to manage secrets, configmaps, deployments, and statefulsets across the entire cluster. By acquiring this token, the attacker inherits the complete authority of the operator, effectively gaining administrative access to the underlying Kubernetes control plane. This allows for unauthorized data access, resource manipulation, or cluster takeover.

The vulnerability is exacerbated by the automatic nature of the operator reconciliation loop. Because the template execution is triggered immediately upon resource detection, an attacker does not need to wait for user interaction. The EPSS score is currently low (0.0032), reflecting the recent discovery of the flaw, but the potential utility of this exploit in post-exploitation scenarios within multi-tenant infrastructures is high.

Remediation & Mitigation

The primary and recommended resolution is to upgrade the Grafana Operator deployment to version 5.24.0 or later. This release packages the sandboxed ScopedImporter patch and updates critical dependencies such as oras-go to version 2.6.1, addressing additional path traversal risks during container layer extraction. Systems should be updated using official helm charts or updated container images from secure registries.

In scenarios where immediate upgrades are not feasible, cluster administrators should implement restrictive access controls. A Kubernetes ValidatingAdmissionPolicy can block the submission of custom resources that contain jsonnetLib or jsonnetProjectBuild specifications. This effectively disables the vulnerable Jsonnet parsing feature while allowing standard declarative dashboard deployments to function without disruption.

Additionally, administrators should audit existing configurations and rotate Service Account tokens if indicators of compromise are identified. It is also recommended to restrict the Service Account permissions assigned to the grafana-operator-manager deployment using the principle of least privilege, ensuring the operator does not possess cluster-wide administrator permissions if its operations can be confined to specific namespaces.

Official Patches

GrafanaMain path traversal fix using os.Root for Jsonnet imports
GrafanaDependency patch updating oras-go to v2.6.1 for secure artifact extraction

Fix Analysis (1)

Technical Appendix

CVSS Score
6.4/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N
EPSS Probability
0.32%
Top 76% most exploited

Affected Systems

Grafana Operator

Affected Versions Detail

Product
Affected Versions
Fixed Version
Grafana Operator
Grafana
<= 5.235.24.0
AttributeDetail
CWE IDCWE-22 (Path Traversal), CWE-269 (Improper Privilege Management)
Attack VectorNetwork (AV:N)
CVSS6.4 (CVSS v4.0)
EPSS0.0032 (Percentile: 23.55%)
ImpactPrivilege Escalation to Cluster Administrator
Exploit StatusPoC (In-repository tests)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-22
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

The product uses external input to construct a pathname that is intended to identify a file or directory that is located beneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.

Known Exploits & Detection

Grafana Operator GitHub RepositoryIntegration test files demonstrate path traversal verification using a crafted gzip-compressed Jsonnet project archive.

Vulnerability Timeline

Commit 5bb71aed92390c6c0d7d49c8af990ceb750e347f merged to implement os.Root containment
2026-06-09
Version 5.24.0 published containing the security fixes
2026-06-09
CVE-2026-11769 formally published to the National Vulnerability Database (NVD)
2026-06-13

References & Sources

  • [1]Official Grafana Security Advisory
  • [2]Authoritative CVE.org Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•23 minutes ago•CVE-2026-75831
7.6

CVE-2026-75831: Stored Cross-Site Scripting in Grav CMS Audio/Video Media Rendering

Improper neutralization of input during web page generation in Grav CMS allows authenticated users with page modification privileges to execute stored Cross-Site Scripting (XSS) attacks. The flaw exists in AudioMediaTrait and VideoMediaTrait where media source URLs are concatenated directly into HTML templates without proper escaping.

Amit Schendel
Amit Schendel
1 views•6 min read
•about 1 hour ago•CVE-2026-86071
3.7

CVE-2026-86071: Path Traversal Vulnerability in Junrar Archive Library

A directory traversal vulnerability exists in the Junrar archive extraction library prior to version 7.6.1. When extracting crafted RAR archives, the library allows unauthorized directory creation outside the designated destination root due to improper path normalization during directory creation.

Alon Barad
Alon Barad
6 views•8 min read
•about 2 hours ago•CVE-2026-63506
8.8

CVE-2026-63506: Broken Access Control in TinaCMS isAuthorized Authentication Handler

CVE-2026-63506 is a critical authorization bypass vulnerability in TinaCMS self-hosted backend authentication packages (@tinacms/auth and next-tinacms-azure). By exploiting a request-controlled clientID parameter, unauthenticated attackers with an active token for any developer-registered TinaCloud application can bypass tenant boundaries and execute unauthorized administrative operations, including full GraphQL database interactions and arbitrary media management.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 3 hours ago•CVE-2026-85078
6.5

CVE-2026-85078: HTTP Request Smuggling via Chunked Trailers in Sanic Core HTTP Parser

CVE-2026-85078 describes a critical request-boundary integrity vulnerability (HTTP Request Smuggling) in Sanic, an open-source high-performance Python web server and framework. The vulnerability exists within Sanic's core HTTP/1.1 chunked-body parser. Prior to the patched versions, when processing a chunked transfer-encoded request, Sanic's parser failed to fully consume or validate the trailer-part following the terminating zero-size chunk.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 5 hours ago•CVE-2026-61597
5.1

CVE-2026-61597: Cross-Site Scripting (XSS) via Unsanitized URI Schemes in djust Component Template Tags

Prior to version 1.0.7, the djust Python package is vulnerable to Stored and Reflected Cross-Site Scripting (XSS) via component template tags. The underlying issue exists because the package fails to sanitize or validate incoming URI schemes when rendering URLs inside interactive HTML attributes like href or action. While the framework HTML-escapes strings to prevent attribute breakout, it permits the execution of arbitrary JavaScript via the javascript: pseudo-protocol.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 6 hours ago•CVE-2026-61592
7.4

CVE-2026-61592: Session Hijacking and Authorization Bypass in djust SSE Transport

A high-severity session hijacking and authorization bypass vulnerability has been identified in the djust framework prior to version 1.0.7. The flaw resides in the Server-Sent Events (SSE) transport implementation, which keyed sessions solely by client-provided session identifiers without verifying session ownership or binding. This allows an attacker who possesses or guesses a victim's session identifier to send malicious post messages to execute arbitrary state machine event handlers under the identity and permissions of the victim.

Alon Barad
Alon Barad
5 views•6 min read