CVE-2026-1709: Keylime: keylime: authentication bypass allows unauthorized administrative operations due to missing client-side tls authentication
Impact
The Keylime registrar does not enforce mutual TLS (mTLS) client certificate authentication since version 7.12.0. The registrar's TLS context is configured with ssl.CERTOPTIONAL instead of ssl.CERTREQUIRED, allowing any client to connect to protected API endpoints without presenting a valid client certificate.
Who is impacted: - All Keylime deployments running versions 7.12.0 through 7.13.0 - Environments where the registrar HTTPS port (default 8891) is network-accessible to untrusted clients
What an attacker can do: - List all registered agents (GET /v2/agents/) - enumerate the entire agent inventory - Retrieve agent details (GET /v2/agents/{uuid}) - obtain public TPM keys, certificates, and network locations (IP/port) of any agent - Delete any agent (DELETE /v2/agents/{uuid}) - remove agents from the registry, disrupting attestation services
Note: The exposed TPM data (EK, AK, certificates) consists of public keys and certificates. Private keys remain protected within TPM hardware. The HMAC secret used for challenge-response validation is stored in the database but is not exposed via the API.
Affected versions: >= 7.12.0, <= 7.13.0
Fixed versions: 7.12.2, >= 7.13.1
Patches
A patch for the affected released versions is available. It removes the line that override the configuration of ssl.verifymode, leaving the CERTREQUIRED value set by webutil.initmtls():
diff diff --git a/keylime/web/base/server.py b/keylime/web/base/server.py index 1d9a9c2..859b23a 100644 --- a/keylime/web/base/server.py +++ b/keylime/web/base/server.py @@ -2,7 +2,6 @@ import asyncio import multiprocessing from abc import ABC, abstractmethod from functools import wraps -from ssl import CERTOPTIONAL from typing import TYPECHECKING, Any, Callable, Optional
import tornado @@ -252,7 +251,6 @@ class Server(ABC): self.httpsport = config.getint(component, "tlsport", fallback=0) self.maxuploadsize = config.getint(component, "maxuploadsize", fallback=104857600) self.sslctx = webutil.initmtls(component) - self.sslctx.verifymode = CERTOPTIONAL
def get(self, pattern: str, controller: type["Controller"], action: str, allowinsecure: bool = False) -> None: """Creates a new route to handle incoming GET requests issued for paths which match the given
Users should upgrade to the patched version once it is released.
Workarounds
If upgrading is not immediately possible, apply one of the following mitigations:
1. Network isolation (Recommended)
Restrict access to the registrar HTTPS port (default 8891) using firewall rules to allow only trusted hosts (verifier, tenant):
Example using iptables iptables -A INPUT -p tcp --dport 8891 -s <verifierip> -j ACCEPT iptables -A INPUT -p tcp --dport 8891 -s <tenantip> -j ACCEPT iptables -A INPUT -p tcp --dport 8891 -j DROP
2. Reverse proxy with mTLS enforcement
Deploy a reverse proxy (nginx, HAProxy) in front of the registrar that enforces client certificate authentication:
Example nginx configuration server { listen 8891 ssl; sslcertificate /path/to/server.crt; sslcertificatekey /path/to/server.key; sslclientcertificate /path/to/ca.crt; sslverifyclient on; # Enforce client certificates
location / { proxypass https://localhost:8892; # Internal registrar port } }
Other sources
A flaw was found in Keylime. The Keylime registrar, since version 7.12.0, does not enforce client-side Transport Layer Security (TLS) authentication. This authentication bypass vulnerability allows unauthenticated clients with network access to perform administrative operations, including listing agents, retrieving public Trusted Platform Module (TPM) data, and deleting agents, by connecting without presenting a client certificate.
— MITRE
The Keylime registrar since version 7.12.0 does not require client-side TLS authentication because ssl.CERTREQUIRED is not set when configuring the TLS context. This allows unauthenticated clients to perform administrative operations (list agents, retrieve public TPM data, delete agents) by connecting without presenting a client certificate. Requirements to exploit:
Network access to the registrar HTTPS port (default 8891) No credentials, certificates, or special tools required Standard HTTP client (curl, wget, etc.) is sufficient
Mitigation if available: 1. Network isolation - Restrict network access to registrar port 8891 to only trusted verifier and tenant hosts using firewall rules 2. Reverse proxy with mTLS - Deploy a reverse proxy (nginx, HAProxy) in front of the registrar that enforces client certificate authentication 3. Upgrade - Apply the fix when released (adds ssl.CERTREQUIRED to enforce client certificate validation)
— Red Hat
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
pip/keylimeto a version that resolves this vulnerability.Fixed in 7.13.1 - Upgrade
Upgrade
pip/keylimeto a version that resolves this vulnerability.Fixed in 7.12.2 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 7.12.2 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 7.13.1 - Configuration
Remove the override that sets `self._ssl_ctx.verify_mode = CERT_OPTIONAL` so the TLS context keeps `ssl.CERT_REQUIRED` as initialized by `web_util.init_mtls()` (fixes authentication bypass affecting Keylime 7.12.0 through 7.13.0).
Keylime registrar (keylime/web/base/server.py) ssl.verify_mode = CERT_REQUIRED - Configuration
Deploy a reverse proxy (nginx or HAProxy) in front of the registrar that enforces client certificate authentication (mTLS) for the registrar HTTPS port (default 8891).
Reverse proxy in front of registrar (nginx/HAProxy) mTLS client certificate enforcement = enabled - Compensating control
Network isolate the registrar HTTPS port (default 8891) by restricting access with firewall rules to only trusted verifier and tenant hosts (allow verifier_ip and tenant_ip; default deny/drop). Example shown in material: `iptables -A INPUT -p tcp --dport 8891 -j DROP` then `iptables -A INPUT -p tcp --dport 8891 -s <tenant_ip> -j ACCEPT` and `iptables -A INPUT -p tcp --dport 8891 -s <verifier_ip> -j ACCEPT`.
Event History
Frequently Asked Questions
What is the severity of CVE-2026-1709?
CVE-2026-1709 is considered a high severity vulnerability due to the significant risk of unauthorized administrative operations.
How do I fix CVE-2026-1709?
To fix CVE-2026-1709, ensure that you implement client-side TLS authentication in your Keylime setup, preferably by upgrading to a patched version after 7.12.0.
What systems are affected by CVE-2026-1709?
CVE-2026-1709 affects Keylime versions starting from 7.12.0.
What type of vulnerability is represented by CVE-2026-1709?
CVE-2026-1709 is categorized as an authentication bypass vulnerability.
Who is at risk from CVE-2026-1709?
Organizations using affected versions of Keylime are at risk of unauthorized access and administrative actions.