Mar 19, 2026·6 min read·32 visits
A predictable ID generation algorithm combined with a lack of provenance checks allows malicious Juju applications to steal secrets from other applications via a Confused Deputy attack.
Canonical Juju versions 3.0.0 through 3.6.18 contain a critical authorization bypass vulnerability within the secret management subsystem. Due to predictable secret identifiers and the absence of provenance verification, a malicious application can leverage a provider application as a confused deputy to access secrets belonging to other applications in the same model.
Canonical Juju versions 3.0.0 through 3.6.18 contain an authorization bypass vulnerability in the secret management subsystem. Tracked as CVE-2026-32694, this flaw manifests as an Insecure Direct Object Reference (IDOR) coupled with a Confused Deputy condition. The vulnerability enables a malicious application within a shared Juju model to inappropriately access or manipulate secrets owned by other applications.
The Juju architecture relies on relations to share configuration and state between deployed applications. The secret management subsystem issues identifiers for sensitive data, which are subsequently passed between providing and consuming applications via these relations. Prior to version 3.6.19, the generation algorithm for these identifiers produced predictable values.
Furthermore, the API lacked a secure mechanism for downstream applications to verify the provenance of a received secret identifier. This missing validation step creates the Confused Deputy scenario. A malicious application can provide a predicted identifier to a privileged provider application, tricking it into executing operations against a victim's secrets.
The root cause of CVE-2026-32694 involves two distinct architectural shortcomings. The primary flaw resides in the predictable nature of the XIDs (Globally Unique Process-ID-first Identifiers) used to track secret objects. Juju generated these XIDs using a structured format comprising a 4-byte timestamp, a 3-byte machine identifier, a 2-byte process ID (PID), and a 3-byte counter.
Within a shared environment, such as a single Juju controller managing a Kubernetes model, several of these XID components remain static or highly predictable. The machine ID and PID rarely change across sequential operations. An attacker observing the creation of their own secrets can accurately determine the current timestamp and counter values, allowing them to extrapolate the precise XIDs generated for other applications.
The secondary flaw is a lack of provenance verification, manifesting as a Confused Deputy condition. The Juju API permits "Provider" applications to hold access rights to secrets owned by multiple different "Grantee" applications. When a Provider receives a secret ID over a relation, the API historically provided no method to confirm which application actually owned that secret.
Because the Provider lacks context regarding the secret's true origin, it operates under the assumption that the secret belongs to the remote end of the relation supplying the ID. If the Provider possesses valid access grants for a victim's secret, it will blindly execute requested operations on behalf of the attacker supplying the predicted ID.
The remediation requires fundamental changes to how Juju resolves remote applications and issues backend tokens. The patch at commit 7875461e90ced257835077cedaa60454bffb44d1 addresses the inability to accurately resolve remote units to their parent remote applications during secret operations.
The vulnerable implementation of findSecretEntity failed to handle cases where a unit belonged to a remote application in Cross-Model Relations (CMR). The patch introduces error handling to catch errors.IsNotFound(err) when querying a unit, falling back to resolving the remote application identity.
// Patched findSecretEntity logic in state/secrets.go
case names.UnitTag:
entity, err = st.Unit(id)
- collName = unitsC
- docID = id
+ if err == nil {
+ docID = id
+ collName = unitsC
+ } else if errors.IsNotFound(err) {
+ // If this unit is from a remote application, find that instead.
+ id, err = names.UnitApplication(id)
+ if err != nil {
+ return nil, "", "", err
+ }
+ entity, err = st.RemoteApplication(id)
+ docID = id
+ collName = remoteApplicationsC
+ }Additionally, commit 12eeffe70ee606f34802f7f1442f672bcbd9d70b implements robust backend tokens. Alongside switching from sequential XIDs to 128-bit random nonces for secret IDs, Juju introduced the secret-info-get tool. This API addition allows deputies to explicitly verify the owner and grant-relation-id metadata, breaking the Confused Deputy attack chain.
Exploitation of CVE-2026-32694 requires an attacker to control at least one application deployed within the target Juju model. The attacker must share a model with a targeted "Good" application and a common "Provider" application, such as a centralized database or proxy charm. The attacker must also be capable of establishing a relation with the Provider.
The attack sequence begins with the attacker creating several secrets to sample the current XID generation state. By analyzing the returned XIDs, the attacker extracts the static machine ID and PID, and maps the current timestamp and counter values. The attacker then calculates the likely XID of a secret recently generated by the target application.
The attacker transmits this predicted XID to the Provider application via their shared relation data. The Provider attempts to retrieve the secret using the supplied ID. Because the Provider holds a valid grant to the victim's secret, the Juju controller permits the read operation. The Provider then proceeds to use or expose the victim's secret data based on the attacker's inputs.
The successful exploitation of CVE-2026-32694 yields a severe breach of confidentiality and integrity within the impacted Juju model. An attacker successfully bypassing the authorization controls gains unauthorized access to sensitive material such as database credentials, API keys, and cryptographic certificates belonging to other applications.
While the CVSS score is 6.6 (Medium) due to the high attack complexity and high privileges required, the localized impact on a multi-tenant or shared-resource model is substantial. The attacker must already possess valid application deployment rights within the model, which limits the threat to insider risks or scenarios where a single application has been compromised.
The vulnerability does not directly expose the Juju controller itself to remote code execution. However, the lateral movement capabilities provided by accessing adjacent application credentials facilitate broader compromise of the infrastructure managed by the Juju model.
Canonical addressed CVE-2026-32694 in Juju version 3.6.19. The patch eliminates the IDOR vulnerability by replacing predictable XIDs with 128-bit random nonces. This cryptographic entropy ensures that secret identifiers cannot be calculated or guessed, regardless of the attacker's visibility into the model's activity.
To remediate the Confused Deputy vector, Juju 3.6.19 introduces the secret-info-get hook tool. Charm developers must update their provider charms to utilize this new API. Provider applications are now required to query the provenance of any secret ID received via relation data and verify that the owner matches the expected remote application.
Administrators must upgrade all Juju controllers and agents to version 3.6.19 or later. Following the upgrade, operators must systematically rotate all existing secrets within shared models. Legacy secrets generated prior to the upgrade retain their predictable XIDs and remain theoretically vulnerable until they are replaced with the new, high-entropy identifiers.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Juju Canonical | >= 3.0.0, <= 3.6.18 | 3.6.19 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-639, CWE-343 |
| Attack Vector | Network |
| Privileges Required | High |
| CVSS v3.1 | 6.6 |
| Exploit Status | Proof-of-Concept |
The system's authorization mechanism does not adequately verify that the user requesting access to a specific object is authorized to do so.
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.
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.
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.
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.
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.
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.