Executive Summary
A critical authentication bypass vulnerability (CVE-2026-4370) has been disclosed in Canonical's Juju charm deployment framework, affecting the internal Dqlite database cluster used by Juju controllers. The vulnerability stems from the controller's database endpoint failing to validate TLS client and server certificates, meaning any network-accessible attacker can establish a direct, unauthenticated connection to the internal database. With a CVSS score of 10.0, this is a maximum-severity finding that exposes the full state of all Juju-managed infrastructure to unauthorized access and manipulation.
CVSS Score: 10.0 (Critical)
CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Vulnerability Overview
| Attribute | Value |
|---|---|
| CVE ID | CVE-2026-4370 |
| CVSS Score | 10.0 (Critical) |
| Type | Improper Authentication / Missing TLS Certificate Validation |
| Attack Vector | Network |
| Attack Complexity | Low |
| Privileges Required | None |
| User Interaction | None |
| Scope | Changed |
| Affected Component | Dqlite database cluster endpoint |
| Affected Versions | Juju 3.2.0–3.6.18, 4.0–4.0.3 |
| Patched Versions | Juju 3.6.19+, 4.0.4+ |
| Published | 2026-04-01 |
Affected Products
| Product | Version Range | Status |
|---|---|---|
| Juju | 3.2.0 – 3.6.18 | Vulnerable |
| Juju | 4.0 – 4.0.3 | Vulnerable |
| Juju | 3.6.19+ | Patched |
| Juju | 4.0.4+ | Patched |
Juju is Canonical's open-source application modelling framework, widely used to deploy and manage complex distributed applications on cloud infrastructure including Kubernetes, AWS, Azure, GCP, and on-premises bare metal. The Juju controller is the central authority managing all charm state, credentials, and configuration — making its database an extremely high-value target.
Technical Details
Root Cause
The Juju controller exposes a Dqlite cluster endpoint for internal database replication among controller nodes. This endpoint is intended to be accessible only to authenticated controller peers using mutual TLS (mTLS). However, the implementation fails to enforce certificate validation for both client and server certificates, meaning:
- The server does not verify that connecting clients present a valid, trusted certificate
- Clients connecting to the endpoint are not required to authenticate themselves
This effectively nullifies the TLS transport's authentication guarantees, leaving the Dqlite endpoint as an unauthenticated network service on whatever port it binds to.
Attack Chain
1. Attacker identifies the Juju controller's Dqlite cluster endpoint
(default port binding on the controller's management address)
2. Attacker initiates a TLS connection to the Dqlite endpoint
without presenting a valid client certificate
3. The controller accepts the connection due to missing
certificate validation logic
4. Attacker gains full read/write access to the Dqlite database,
which contains:
- All charm configuration and secrets
- Cloud credential references
- Model topology and unit state
- User credentials and API tokens
5. Attacker exfiltrates cloud credentials, injects malicious
configuration, or disrupts all managed workloadsWhy CVSS 10.0?
The perfect score reflects the combination of:
- Network-accessible exploitation with no prerequisites
- Zero authentication required — no credentials, no tokens
- Changed scope — successfully exploiting the database gives an attacker lateral movement across all cloud infrastructure managed by the Juju controller
- Full CIA triad impact — all data can be read, modified, or destroyed
Impact Assessment
| Impact Area | Description |
|---|---|
| Credential Exposure | All cloud provider credentials (AWS keys, Azure SPNs, GCP service accounts) stored in Juju models are readable |
| Configuration Tampering | Attackers can alter charm configurations to inject backdoors, change endpoints, or disable security controls |
| Complete Infrastructure Takeover | With credential access, attackers can pivot to all cloud environments managed by the controller |
| Data Exfiltration | All application secrets, certificates, and sensitive config values accessible without authentication |
| Service Disruption | Database writes can corrupt controller state, causing outages across all managed applications |
| Persistent Access | Credentials injected into charm configs survive controller patching if not manually audited |
Recommendations
Immediate Actions
- Upgrade Juju immediately to version 3.6.19 or 4.0.4 — these releases enforce proper TLS certificate validation on the Dqlite endpoint
- Audit Dqlite endpoint network exposure — confirm the controller's management address is not reachable from untrusted network segments
- Rotate all credentials stored in Juju models, including cloud provider keys, charm secrets, and API tokens
- Review Juju controller audit logs for unexpected database connections originating from non-controller IP addresses
Network-Level Mitigations (Pre-Patch)
- Firewall the Dqlite port (default: 17666/tcp) to controller
peer IPs only — deny all other inbound connections
- Apply network segmentation so the controller management
network is isolated from application/user networks
- Enable network-level mTLS proxies (e.g., Envoy) in front
of the Dqlite endpoint as a compensating control
- Monitor for unusual outbound traffic from the Juju controller
host — credential abuse typically results in unexpected API calls
to cloud provider endpointsPost-Upgrade Verification
1. Confirm running Juju version: juju version
2. Verify controller is running 3.6.19+ or 4.0.4+:
juju show-controller --format=json | jq '.controller.agent-version'
3. Test that the Dqlite endpoint now rejects unauthenticated
connections (certificate validation enforced)
4. Rotate all model credentials:
juju update-credential <cloud> <credential-name>
5. Audit model configurations for unauthorized changesDetection Indicators
| Indicator | Description |
|---|---|
| Unexpected TCP connections to port 17666 on controller host | Possible unauthenticated Dqlite probe or exploitation |
| Unusual cloud API activity following controller access | Possible credential theft and lateral movement |
| Charm configuration changes with no associated Juju events | Possible unauthorized database writes |
| Juju controller process consuming unexpected CPU/network | Possible active exploitation or data exfiltration |
Example Detection Rule (Suricata)
alert tcp any any -> $JUJU_CONTROLLER 17666 (
msg:"CVE-2026-4370 Juju Dqlite Unauthenticated Connection Attempt";
flow:to_server,established;
content:"|16 03|";
depth:2;
classtype:attempted-admin;
sid:9026437;
rev:1;
)Post-Remediation Checklist
- Verify upgrade — confirm all controller nodes run Juju 3.6.19+ or 4.0.4+
- Rotate cloud credentials — all provider keys referenced by models should be regenerated
- Audit model configurations — review charm configs for unauthorized changes introduced during any potential exploitation window
- Review Juju user accounts — check for newly added admin users or API token grants
- Enable Juju audit logging if not already active:
juju model-config audit-log-exclude-methods="" - Network scan — confirm Dqlite port is no longer reachable from untrusted subnets post-patch
- Update SIEM rules to alert on unexpected connections to the Juju controller management port