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·16 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

•2 days ago•CVE-2026-58263
7.2

CVE-2026-58263: Mutation Cross-Site Scripting (mXSS) in Jodit Editor clean-html Sanitizer

CVE-2026-58263 is a high-severity Mutation Cross-Site Scripting (mXSS) vulnerability affecting Jodit Editor prior to version 4.12.28. The flaw exists in Jodit's built-in clean-html sanitizer plugin, which fails to securely parse and sanitize nested elements containing foreign namespaces like MathML and SVG. Attackers can bypass sanitization by smuggling malicious payload elements inside rawtext container tags like style inside a MathML node, leading to DOM mutation and unauthenticated arbitrary script execution in the context of the user's browser session.

Amit Schendel
Amit Schendel
10 views•6 min read
•2 days ago•CVE-2026-65841
5.3

CVE-2026-65841: Client-Side Cross-Site Scripting (XSS) via Foreign Namespace Sanitization Bypass in Jodit Editor

Jodit Editor versions prior to 4.13.6 are vulnerable to client-side Cross-Site Scripting (XSS). The clean-html plugin's sanitization routine performs case-sensitive lookups against uppercase-only element blacklists. When processing XML-based foreign namespaces such as SVG or MathML, DOM engines preserve the lowercase format of tags. Because Jodit's denyTags check fails to normalize tag casing, malicious script blocks nested inside foreign namespace elements completely bypass validation and serialize directly into the editor output.

Amit Schendel
Amit Schendel
7 views•6 min read
•2 days ago•CVE-2026-53510
8.1

CVE-2026-53510: Remote Code Execution via Dynamic WSDL Parsing in Savon Ruby SOAP Client

A critical code injection vulnerability exists in Savon, a widely used SOAP client library for Ruby, prior to version 2.17.2. The vulnerability resides within the Savon::Model.all_operations module, where operation names fetched from a target Web Services Description Language (WSDL) document are dynamically evaluated via module_eval without sanitization. An attacker capable of manipulating the target WSDL document (e.g., through Man-in-the-Middle attacks, DNS hijacking, or Server-Side Request Forgery) can execute arbitrary Ruby code in the context of the parent application process.

Alon Barad
Alon Barad
12 views•6 min read
•2 days ago•CVE-2026-53466
6.5

CVE-2026-53466: Integer Conversion Overflow in ImageMagick XCF Decoder

An integer conversion overflow vulnerability exists in the XCF decoder of ImageMagick before version 6.9.13-51 and 7.1.2-26. The issue arises from mixed-type arithmetic that promotes calculation results to floating-point representations, causing an undefined cast back to integer. Under optimizing compilers, this undefined behavior results in bounds checks being bypassed, allowing out-of-bounds heap reads.

Amit Schendel
Amit Schendel
6 views•6 min read
•2 days ago•CVE-2026-53599
7.5

CVE-2026-53599: Authenticated Remote Code Execution in REDAXO CMS via Mediapool File Upload Validation Bypass

An authenticated file upload validation bypass vulnerability exists in the REDAXO CMS Mediapool addon in versions 5.18.2 through 5.21.0. Under permissive web server configurations, this allows authenticated users with media upload privileges to achieve remote code execution via multi-segment extension file uploads.

Alon Barad
Alon Barad
9 views•7 min read
•2 days ago•CVE-2026-52887
10.0

CVE-2026-52887: Critical SQL Injection and Remote Code Execution in NocoBase

A critical SQL injection vulnerability exists in the @nocobase/plugin-notification-in-app-message plugin of NocoBase prior to version 2.0.61. The flaw is caused by direct string interpolation of user-controlled input into a Sequelize.literal() query, allowing authenticated users to execute stacked PostgreSQL queries and achieve remote code execution on the underlying database server.

Amit Schendel
Amit Schendel
14 views•7 min read