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

CVE-2026-54704: Sensitive Data Exposure in OpenTelemetry Java Instrumentation SQL Sanitizer

Alon Barad
Alon Barad
Software Engineer

Jul 29, 2026·5 min read·80 visits

Executive Summary (TL;DR)

Flaws in the OpenTelemetry JFlex SQL sanitizer allowed unredacted database credentials to leak into trace spans when using double quotes or executing multi-statement queries.

A sensitive data exposure vulnerability (CWE-532) exists in OpenTelemetry Java Instrumentation prior to version 2.28.0. The JDBC auto-instrumentation component's SQL statement sanitizer contains lexer flaws that prevent the correct redaction of administrative passwords under specific conditions, such as when double-quotes represent identifiers or during multi-statement executions separated by semicolons.

Vulnerability Overview

The OpenTelemetry Java Agent auto-instruments JDBC calls to capture execution statistics and structural database statement properties. To ensure privacy compliance and prevent credential leakage, the agent uses a JFlex-generated SQL scanner to sanitize incoming statements. This mechanism replaces raw literals with query parameter placeholders while retaining identifiers such as table and column names to provide telemetry context.

Prior to version 2.28.0, the SQL sanitizer failed to redact credentials under specific edge cases. Specifically, administrative commands that format credentials in unquoted or double-quoted blocks bypassed sanitization filters. This behavior allowed plaintext database passwords to leak into trace span attributes, such as db.statement, where they were subsequently exported to downstream APM collectors and monitoring backends.

Root Cause Analysis

The underlying vulnerability consists of two structural bugs in the JFlex-generated sanitizer states (SqlSanitizer.jflex and SqlSanitizerWithSummary.jflex).

The first bug involves the processing of double-quoted values. When the SQL sanitizer operates with the configuration flag doubleQuotesAreIdentifiers enabled, double-quoted tokens are evaluated as database identifiers instead of string literals. In database administrative operations, such as CREATE USER app_user PASSWORD "Secret123", the lexer classifies the password block as an identifier. Because identifiers are kept in clear-text to preserve schema tracking context, the password bypasses redaction filters.

The second bug is a state-tracking failure in multi-statement query batches. When the agent receives a multi-query batch separated by semicolons, such as SELECT 1; CONNECT user PASSWORD "secret", the state machine evaluates the first statement and transitions its internal operation tracker to a active query state (e.g., Select). Because the previous lexer implementation lacked an explicit state-reset transition rule upon encountering a semicolon, the operation variable remained set to Select rather than reverting to NoOp.INSTANCE. Consequently, when parsing the subsequent administrative command, the lexer did not execute keyword matching rules reserved for a fresh parser state, leaving the database credentials unredacted.

Code-Level Deep Dive

An examination of the original SqlSanitizer.jflex configuration reveals that the parser attempted to handle administrative statement truncation based solely on initial keyword state matching. This approach was highly fragile and failed to clear state boundaries correctly.

The patch implemented in commit 7ac7fa6fda6c2e3b65bc5d3c6eba050311a49511 addresses these issues by introducing structural state variables and an explicit semicolon reset rule:

  private boolean statementStart = true;
  private boolean passwordSanitizationEnabled = false;
  private boolean identifiedBySanitizationEnabled = false;

To correct the multi-statement boundary bug, a dedicated transition rule for semicolons was added to re-initialize the scanner's tracking states between statements within a single query execution block:

  ";" {
          if (!insideComment) {
            statementStart = true;
            passwordSanitizationEnabled = false;
            identifiedBySanitizationEnabled = false;
          }
          appendCurrentFragment();
          if (isOverLimit()) return YYEOF;
      }

Additionally, the patch deprecates early-exit statement truncation on raw keywords like CONNECT or USER. Instead, matching these keywords sets tracking flags that indicate password sanitization is required. When the parser encounters explicit PASSWORD or IDENTIFIED BY tokens, it checks these flags and applies immediate replacement regardless of quoting style:

  "PASSWORD" {
          boolean passwordTokenIsIdentifier = false;
          if (!insideComment && !extractionDone) {
            markStatementStarted();
            passwordTokenIsIdentifier = operation.handleIdentifier();
            extractionDone = passwordTokenIsIdentifier;
          }
          appendCurrentFragment();
          if (!passwordTokenIsIdentifier && !insideComment && shouldSanitizeRemainderAfterPassword()) {
            builder.append(" ?");
            return YYEOF;
          }
          if (isOverLimit()) return YYEOF;
      }

Exploitation Methodology & Proof of Concept

Triggering this vulnerability does not require an active exploit script. Rather, standard operations executing multi-statement or double-quoted credential administration commands under an instrumented JVM environment trigger the bug.

Consider an administrative microservice running with an OpenTelemetry Java Agent (< 2.28.0) that executes the following database query via JDBC:

SELECT 1; CONNECT admin PASSWORD "MySecr3tP@ss"

Because of the semicolon state-retention bug, the parser evaluates the entire command stream under the initial Select context. The lexer ignores the CONNECT keyword and skips password redaction. The resulting span is recorded and exported with the plaintext password embedded directly inside the db.statement attribute:

{
  "traceId": "9f0862089cba8c07e0b57e79c947ff1a",
  "attributes": {
    "db.system": "hana",
    "db.statement": "SELECT ?; CONNECT admin PASSWORD \"MySecr3tP@ss\""
  }
}

Once exported, the credentials reside in clear-text in downstream telemetry databases (e.g., Elasticsearch, Tempo, or Jaeger), exposing administrative passwords to users with trace-viewing privileges.

Impact Assessment & Security Risk

The exposure of database administrative passwords in centralized telemetry databases poses a serious threat to enterprise security. Monitoring, logging, and tracing pipelines are often configured with broader access permissions and lower threat-protection controls than production databases.

An attacker who gains unauthorized access to log aggregators or APM dashboard search utilities can easily harvest administrative database credentials by searching for keywords like PASSWORD or IDENTIFIED BY. These credentials can then be used to perform unauthorized operations, exfiltrate business data, or gain initial lateral entry into target network environments.

While the direct CVSS 3.1 score is evaluated at 6.5 (Medium) due to the lack of immediate write or denial-of-service capability on the host, the downstream exploitation potential of exposed administrative credentials warrants swift remediation.

Remediation & Defense-in-Depth

The primary remediation strategy is to upgrade the OpenTelemetry Java Agent and its associated dependencies to version 2.28.0 or higher. This upgrade updates the JFlex scanner definitions to enforce correct state transitions and robustly redact password literals.

For environments where immediate upgrades are not feasible, the following defense-in-depth mitigations should be enforced:

  1. Enforce Parameterization: Avoid executing raw query strings that contain inline passwords. Migrate all user provisioning or connections to parameterized stored procedures or execution APIs.

  2. Disable Multi-Query Processing: Configure JDBC connection profiles to reject multi-statement executions, ensuring that queries are parsed individually and do not bypass state boundaries.

  3. Ingestion Filtering: Deploy processing rules on the OpenTelemetry Collector (or intermediate log stashes) to scrub any plain-text parameters matching password keywords before storage.

Official Patches

OpenTelemetryPR #18754: Redact sensitive SQL password phrases

Fix Analysis (1)

Technical Appendix

CVSS Score
6.5/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
EPSS Probability
0.22%
Top 87% most exploited

Affected Systems

OpenTelemetry Java AgentOpenTelemetry Java Instrumentation JDBC Component

Affected Versions Detail

Product
Affected Versions
Fixed Version
opentelemetry-java-instrumentation
OpenTelemetry
< 2.28.02.28.0
AttributeDetail
CWE IDCWE-532
Attack VectorNetwork
CVSS Score6.5
EPSS Score0.00224
ImpactSensitive Data Exposure
Exploit StatusProof of Concept (PoC) documented
KEV StatusNot in CISA KEV

MITRE ATT&CK Mapping

T1552.001Credentials in Files: Credentials in Logs/Attributes
Credential Access
CWE-532
Insertion of Sensitive Information into Log File

The product writes sensitive information to log files, making it available to attackers who have access to the log repository.

Vulnerability Timeline

Maintainer pushes fix commit 7ac7fa6fda6c2e3b65bc5d3c6eba050311a49511
2026-05-18
Security Advisory GHSA-rwqx-fvqh-6wm4 published and CVE-2026-54704 assigned
2026-07-01
NVD record published
2026-07-01

References & Sources

  • [1]GHSA-rwqx-fvqh-6wm4
  • [2]NVD Entry
  • [3]CVE 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

•about 4 hours ago•GHSA-JQ7H-WRVP-3RGX
7.5

GHSA-JQ7H-WRVP-3RGX: Insufficient Session Invalidation in pyLoad Core REST API

An insufficient session invalidation vulnerability exists in pyLoad (pyload-ng) versions 0.5.0b3.dev98 through 0.5.0b3.dev101. When administrative actions like privilege revocation or password changes are executed via the public REST API, active user sessions on disk are not updated or invalidated. Consequently, affected sessions remain fully authenticated with stale permissions for up to 31 days.

Amit Schendel
Amit Schendel
8 views•4 min read
•about 5 hours ago•GHSA-9Q47-3CM2-2RP8
6.5

GHSA-9Q47-3CM2-2RP8: Rate-Limit Bypass and Audit Log Spoofing in pyLoad WebUI

A critical security vulnerability has been identified and patched in the WebUI component of pyLoad, a popular Python-based open-source download manager. This vulnerability allows attackers to completely bypass API rate limits and spoof client IP addresses in audit logs due to unsafe parsing of the X-Forwarded-For HTTP header.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 6 hours ago•GHSA-68W4-83FH-F2W8
8.8

GHSA-68W4-83FH-F2W8: Privilege Escalation and Administrative Password Oracle in pyLoad-ng

An authorization bypass and credential oracle vulnerability in pyload-ng allows authenticated users with minimal or no privileges to brute-force the administrator password. This is achieved through sensitive API methods exposed globally combined with a non-constant-time password hash comparison algorithm.

Alon Barad
Alon Barad
8 views•7 min read
•about 7 hours ago•GHSA-R44W-V6GF-X3P6
8.1

Authentication Bypass in pyLoad API Key Caching Mechanism (GHSA-R44W-V6GF-X3P6)

An authentication bypass vulnerability in pyLoad allows unauthenticated remote attackers to gain administrative API access. The vulnerability is caused by a logical flaw in the API key cache validation lookup, where authentication states are cached using only the public key identifier, skipping cryptographic token verification on cache hits.

Alon Barad
Alon Barad
10 views•7 min read
•about 8 hours ago•CVE-2026-107728
7.5

CVE-2026-107728: Authorization Bypass in Strawberry GraphQL Permission Validation

An authorization bypass vulnerability in Strawberry GraphQL between versions 0.217.0 and 0.326.1 occurs when a synchronous permission handler returns an awaitable object (such as an unawaited coroutine). Due to Python's truthiness rules, the unawaited coroutine is evaluated as True, leading to an immediate bypass of security policies.

Amit Schendel
Amit Schendel
9 views•5 min read
•about 9 hours ago•CVE-2026-107727
3.7

CVE-2026-107727: Connection-Level Denial of Service via State Leak in Strawberry GraphQL Legacy WS Handler

An uncontrolled resource consumption vulnerability in Strawberry GraphQL allows unauthenticated remote attackers to trigger a Denial of Service on persistent WebSocket connections using the legacy graphql-ws protocol. When the server enforces max_subscriptions_per_connection, naturally terminating subscriptions are not cleared from memory registries, leading to exhaustion of connection slots.

Alon Barad
Alon Barad
12 views•6 min read