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

CVE-2026-42223: Authenticated Sensitive Information Disclosure in Nginx UI

Alon Barad
Alon Barad
Software Engineer

May 6, 2026·7 min read·42 visits

Executive Summary (TL;DR)

Any authenticated user can retrieve administrative secrets (including the JWT signing key) due to flawed struct serialization, enabling total application compromise and privilege escalation.

Nginx UI versions prior to 2.3.8 suffer from an asymmetric security control enforcement vulnerability. Go's standard JSON marshaler ignores custom struct tags meant to protect sensitive configuration fields, leading to the exposure of JWT secrets, node secrets, and OIDC client credentials to any authenticated user. This allows privilege escalation to full administrator.

Vulnerability Overview

Nginx UI operates as a web-based management interface for Nginx web servers, providing administrators with tools to configure routing, manage certificates, and monitor server performance. The application relies on a Go-based backend providing RESTful API endpoints consumed by a frontend application. Authentication and authorization are handled via JSON Web Tokens (JWT), with specific administrative privileges required for configuration changes.

CVE-2026-42223 manifests as a CWE-200 vulnerability within the application's configuration management API. The backend exposes an endpoint designed to serve application settings to the frontend. Due to a failure in how Go struct fields are serialized into JSON, this endpoint inadvertently leaks highly sensitive cryptographic secrets to any authenticated user.

Exploitation requires a low-privileged authenticated session. Unauthenticated attackers cannot reach the vulnerable code path due to middleware enforcement. However, any user with valid credentials, regardless of their assigned role or permission boundaries, can trigger the vulnerability by interacting directly with the API.

The resulting data exposure provides the attacker with the necessary cryptographic keys to forge administrative sessions. This bypasses the application's role-based access control (RBAC) mechanisms. The severity is quantified by a CVSS 3.1 score of 6.5, reflecting the authentication prerequisite but acknowledging the high impact on confidentiality.

Root Cause Analysis

The vulnerability is rooted in an asymmetry between how Nginx UI processes incoming configuration changes versus how it serves outgoing configuration data. The Go backend utilizes global struct definitions to maintain application state and settings in memory. Developers attempted to secure sensitive fields within these structs by applying a custom struct tag, specifically protected:"true".

During write operations handled by the SaveSettings function, the application employs a custom function named ProtectedFill. This function uses Go's reflect package to inspect the struct tags dynamically. It identifies fields marked with protected:"true" and prevents user-supplied input from overwriting existing secrets, operating as an effective defense mechanism against unauthorized configuration tampering.

The failure occurs in the read operation handled by GetSettings located in api/settings/settings.go. To serve the settings data, the handler passes the global struct directly to the Gin web framework's c.JSON method. The Gin framework delegates this serialization to Go's standard encoding/json package. The standard library JSON marshaler only recognizes the json tag and ignores all custom tags, including protected:"true".

Because Go struct fields must be capitalized to be exported and visible to the standard library's JSON marshaler, all defined settings fields are processed. The marshaler serializes the entire struct, blindly converting the in-memory secrets into plaintext JSON values. The application's custom security annotation is rendered entirely ineffective during the read cycle.

Code Analysis

Prior to version 2.3.8, the GetSettings function in api/settings/settings.go contained a direct passthrough of the configuration structs. The application defined sensitive fields identically to standard configuration options, relying solely on the custom tag for protection.

// Vulnerable Implementation snippet
type AppSettings struct {
    JwtSecret    string `json:"jwt_secret" protected:"true"`
    NodeSecret   string `json:"node_secret" protected:"true"`
    // other fields...
}
 
func GetSettings(c *gin.Context) {
    c.JSON(200, gin.H{
        "app": cSettings.AppSettings,
        // ...
    })
}

The patch introduced in commit 80a6a7273d43dedbd6404662893fe862a2c14bf5 addresses this by enforcing manual redaction before serialization. The developers created a constant redactedSensitiveValue and implemented a buildSettingsResponse function. This function clones the configuration memory space and explicitly overwrites known sensitive keys with the string __NGINX_UI_REDACTED__ before passing the data to c.JSON.

// Patched Implementation snippet
const redactedSensitiveValue = "__NGINX_UI_REDACTED__"
 
func buildSettingsResponse() gin.H {
    app := cloneSettingsSection(cSettings.AppSettings)
    app["jwt_secret"] = redactedSensitiveValue
    app["node_secret"] = redactedSensitiveValue
    // ...
    return gin.H{"app": app}
}

To accommodate legitimate configuration updates without corrupting existing secrets, the developers also introduced a restoreRedactedSensitiveSettings function. This function intercepts incoming save requests. If the frontend submits the exact string __NGINX_UI_REDACTED__ for a protected field, the backend discards the input and retains the original secret from memory.

While this patch mitigates CVE-2026-42223, the chosen architecture relies on a manual denylist. Developers must add new sensitive fields to the redaction function in future updates. A more robust architectural approach would involve separating the internal configuration struct from the API response struct, defining an explicit allowlist of safe fields to serialize.

Exploitation Methodology

Exploitation of CVE-2026-42223 is technically trivial once initial access is obtained. An attacker must first authenticate to the Nginx UI application using valid credentials. This satisfies the low-privilege prerequisite and allows the attacker's HTTP requests to bypass the initial JWT validation middleware protecting the /api routing group.

The attacker then issues an HTTP GET request to the /api/settings endpoint. No specialized headers or payloads are required. The server processes the request and returns the application's entire runtime configuration in JSON format. The attacker parses this response to locate the jwt_secret field within the app configuration block.

GET /api/settings HTTP/1.1
Host: nginx-ui.internal
Authorization: Bearer <low_privilege_token>
 
HTTP/1.1 200 OK
Content-Type: application/json
 
{
  "app": {
    "jwt_secret": "super_secret_hmac_key_123",
    "node_secret": "cluster_node_key_456"
  }
}

Armed with the HMAC signing key, the attacker uses a standard JWT library to forge a new token. The payload is modified to include "role": "admin" or the equivalent highest privilege identifier used by the application. The attacker signs this forged payload using the extracted jwt_secret.

The attacker replaces their original low-privileged bearer token with the newly minted administrative token. Subsequent requests to restricted administrative endpoints are authorized by the backend, granting the attacker full control over the Nginx management interface.

Impact Assessment

The primary impact of CVE-2026-42223 is a complete compromise of the application's authorization boundary. The exposure of the JWT signing secret (JwtSecret) enables vertical privilege escalation. Any low-privileged user can elevate their access to a full administrator role, granting them the ability to modify web server routing, alter reverse proxy targets, and manage TLS certificates.

Beyond authentication bypass, the vulnerability leaks the application's cluster communication keys. The NodeSecret field is utilized to authenticate distinct instances of Nginx UI operating in a clustered environment. An attacker possessing this secret can introduce rogue nodes into the cluster hierarchy or intercept internal configuration sync traffic between legitimate nodes.

Third-party integrations are also exposed through this vulnerability. The configuration object contains the OIDC ClientSecret, which is used for single sign-on flows. Leakage of this secret compromises the OAuth trust relationship between Nginx UI and the identity provider, allowing an attacker to impersonate the application in the broader enterprise environment.

Additionally, the exposure of fields like OpenAIToken highlights the blast radius of the vulnerability. Attackers can extract these third-party API keys and utilize them outside the context of Nginx UI, incurring financial costs or quota exhaustion on the victim's external service accounts.

Remediation and Mitigation

The vendor has addressed CVE-2026-42223 in Nginx UI version 2.3.8. Organizations running any version prior to 2.3.8 must update their deployments immediately. The patched version implements the necessary server-side redaction logic to prevent the exposure of secrets over the API while introducing a secure, 2FA-gated flow for administrators requiring access to these values.

Applying the software update does not resolve the security incident if the vulnerable endpoint was previously exposed to malicious users. Administrators must assume that all secrets contained within the application settings have been compromised. A comprehensive secret rotation process is mandatory following the application of the patch.

The JWT signing secret must be rotated immediately, which will actively invalidate all current user sessions and require users to re-authenticate. The cluster node secrets must be regenerated and redeployed across all nodes to secure inter-node communication. Furthermore, administrators must log into their external service providers to revoke and regenerate OIDC client secrets and any third-party API keys, such as OpenAI tokens.

Organizations should implement detection mechanisms by querying access logs for the affected application. Security teams should look for anomalous HTTP GET requests to the /api/settings path originating from IP addresses associated with low-privileged users. While this will not prevent exploitation, it provides necessary telemetry to identify potential compromise prior to patching.

Official Patches

0xJackyNginx UI v2.3.8 Release Notes

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.03%
Top 91% most exploited

Affected Systems

Nginx UI backend APINginx UI Cluster Architecture

Affected Versions Detail

Product
Affected Versions
Fixed Version
Nginx UI
0xJacky
< 2.3.82.3.8
AttributeDetail
CWE IDCWE-200
Attack VectorNetwork
CVSS Score6.5
EPSS Score0.00031
ImpactPrivilege Escalation / Information Disclosure
Exploit StatusProof of Concept
CISA KEVNo

MITRE ATT&CK Mapping

T1552.004Unsecured Credentials: API Keys
Credential Access
T1078Valid Accounts
Defense Evasion
CWE-200
Exposure of Sensitive Information

Exposure of Sensitive Information to an Unauthorized Actor

Vulnerability Timeline

Developer implements the redaction logic and 2FA reveal flow
2026-04-18
CVE-2026-42223 is published and GHSA advisory is released
2026-05-04
EPSS and NVD data are updated
2026-05-06

References & Sources

  • [1]GitHub Security Advisory GHSA-q4w7-56hr-83rm
  • [2]NVD Record for CVE-2026-42223

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 1 hour ago•CVE-2026-63349
7.0

CVE-2026-63349: Privilege Dropping Bypass and Denial of Service in AnyIO Subprocess Module

CVE-2026-63349 is a critical privilege-dropping bypass vulnerability in the AnyIO asynchronous framework (versions 4.14.0 and 4.14.1) on POSIX platforms. Due to a variable assignment typo, supplementary groups specified by the developer are not correctly propagated to the execution backend, resulting in subprocesses retaining the parent process's elevated supplementary group permissions.

Alon Barad
Alon Barad
5 views•5 min read
•about 2 hours ago•CVE-2026-63406
5.9

CVE-2026-63406: Information Disclosure via Insecure Telemetry and Hardcoded Credentials in AnyCable-Go

CVE-2026-63406 is an information disclosure vulnerability in AnyCable-go prior to version 1.6.15. The built-in telemetry client is enabled by default with a hardcoded public authentication token ('secret'). This client digests highly sensitive configuration parameters and command-line arguments, including JWT secrets and RPC secrets, into a stable SHA-256 fingerprint. This fingerprint is sent over public networks, exposing those administrative secrets to offline dictionary and brute-force attacks if intercepted.

Alon Barad
Alon Barad
4 views•5 min read
•about 3 hours ago•CVE-2026-84992
6.1

CVE-2026-84992: Cross-Site Scripting (XSS) via Fenced Code Block Parsing in md-editor-v3

CVE-2026-84992 is a Cross-Site Scripting (XSS) vulnerability affecting md-editor-v3 before version 6.5.4. It occurs because the fenced-code block language parser directly interpolates unescaped language metadata into unquoted HTML attributes inside the custom rendering callback. This bypasses the built-in XSSPlugin which runs during the parsing phase, before rendering.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 4 hours ago•CVE-2026-81505
7.1

CVE-2026-81505: Broken Object Level Authorization (BOLA) in Convoy Webhook Source Retrieval

CVE-2026-81505 is a high-severity Broken Object Level Authorization (BOLA) / Insecure Direct Object Reference (IDOR) vulnerability in Convoy, a cloud-native webhooks gateway. In affected versions prior to 26.6.8, the single-item Source retrieval API endpoint authorizes project access but fails to confirm if the requested Source belongs to that specific project. This logical flaw allows authenticated users or project-scoped API key holders to bypass tenant isolation boundaries and retrieve unredacted, plaintext message broker credentials for Apache Kafka, Amazon SQS, RabbitMQ, and Google Cloud Pub/Sub belonging to other tenants. This issue is fully patched in version 26.6.8.

Amit Schendel
Amit Schendel
8 views•5 min read
•about 5 hours ago•CVE-2026-77339
5.1

CVE-2026-77339: Unauthenticated Remote Command Execution in Process Compose via DNS Rebinding

CVE-2026-77339 is a critical security vulnerability in Process Compose before version 1.120.0. The Model Context Protocol (MCP) Server-Sent Events (SSE) listener transport subsystem fails to validate the HTTP Host and Origin headers, and does not enforce authentication. This omissions expose local loopback listeners to DNS rebinding attacks orchestrated by malicious remote websites visited by developers, enabling unauthorized process control and arbitrary command execution.

Alon Barad
Alon Barad
8 views•6 min read
•about 6 hours ago•CVE-2026-77301
7.5

CVE-2026-77301: Uncontrolled Resource Allocation (Decompression Bomb) in adm-zip

CVE-2026-77301 is a critical uncontrolled resource allocation vulnerability in the popular Node.js library adm-zip (versions prior to 0.6.1). During ZIP decompression of asynchronous entries, the library trusts the uncompressed size metadata declared in the central directory headers. Because Node.js's streaming zlib API completely ignores the maxOutputLength configuration, a crafted ZIP archive (decompression bomb) causes the application to continually allocate resident memory buffers on the heap without limits, causing rapid memory exhaustion and a process-level Out-of-Memory (OOM) crash.

Alon Barad
Alon Barad
6 views•5 min read