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



GHSA-27JC-JMP8-QFW5
9.40.04%

Trust No One (Except Everyone): The Keylime mTLS Bypass

Alon Barad
Alon Barad
Software Engineer

Feb 7, 2026·4 min read·25 visits

PoC Available

Executive Summary (TL;DR)

Keylime's Registrar component (v7.12.x-7.13.0) explicitly set SSL verification to 'Optional', effectively disabling mTLS authentication. Attackers could list, query, and delete TPM agent registrations without credentials.

For a framework dedicated to establishing the Root of Trust in hostile cloud environments, Keylime briefly forgot to verify who was knocking at the door. A critical misconfiguration in the Registrar component turned mandatory mutual TLS (mTLS) into a polite suggestion, allowing unauthenticated attackers to manipulate the attestation database.

The Hook: Who Watches the Watchmen?

In the world of Cloud Native computing, you can't trust the hardware you're running on. That's where Keylime comes in. It is the CNCF's heavy hitter for remote attestation—a fancy way of using a Trusted Platform Module (TPM) to mathematically prove that a server hasn't been tampered with before you send it your secrets.

The Keylime architecture relies on three pillars: the Agent (running on the node), the Verifier (checking the TPM quotes), and the Registrar. Think of the Registrar as the secure phonebook. It's the first place an Agent calls home to drop off its public keys (Endorsement Key and Attestation Identity Key). If you compromise the Registrar, you can disrupt the chain of trust before it even begins.

Usually, Keylime is paranoid. It uses Mutual TLS (mTLS) for everything. The Agent needs a cert, the Verifier needs a cert, and the Registrar needs a cert. It's a zero-trust party where everyone checks ID at the door. Or at least, it was supposed to be.

The Flaw: The Polite Bouncer

The vulnerability (CVE-2026-1709) is a classic case of 'Explicit is better than Implicit, unless you explicitly choose the wrong setting.'

In Python's ssl module, SSLContext.verify_mode controls how the server treats client certificates. A secure mTLS setup requires ssl.CERT_REQUIRED. This tells the server: 'If the client doesn't show a valid certificate signed by our CA, hang up immediately.'

However, in Keylime versions 7.12.0 through 7.13.0, the code was changed to use ssl.CERT_OPTIONAL. In the documentation, this mode sounds harmless enough: it asks for a certificate if the client has one. But the fatal nuance is what happens when the client doesn't have one. With CERT_OPTIONAL, the handshake succeeds anonymously.

It's like a bouncer at a club who asks for ID, but if you just shrug and say 'I left it at home,' he lets you in anyway. The authentication logic downstream assumed that if a connection existed, it must have been authenticated. It was not.

The Code: One Line to Break It All

Let's look at the smoking gun in keylime/web/base/server.py. The developers had a perfectly good helper function, web_util.init_mtls, which presumably set up the context correctly. But then, they manually overrode it.

Here is the diff that fixed the issue. Notice the line being removed:

# keylime/web/base/server.py
 
  self._ssl_ctx = web_util.init_mtls(component)
- self._ssl_ctx.verify_mode = CERT_OPTIONAL

That single line, - self._ssl_ctx.verify_mode = CERT_OPTIONAL, was the kill switch for authentication. It effectively downgraded the Registrar's API from a fortress to a public library. By removing this line in the patch, the _ssl_ctx reverts to the default secure settings defined in init_mtls, which enforces CERT_REQUIRED.

The Exploit: Knock Knock, Who's There? (Nobody)

Exploiting this does not require heap spraying, ROP chains, or race conditions. You just need curl and a lack of manners.

Normally, to talk to the Registrar, you'd need a command like this:

curl --cert client.crt --key client.key --cacert ca.crt https://registrar:8891/v2/agents/

But thanks to CERT_OPTIONAL, an attacker on the same network can simply do:

# The --insecure flag here just ignores the server's cert validity,
# but crucially, we are NOT providing a client cert.
curl --insecure https://registrar:8891/v2/agents/

The Result: Instead of a 401 Unauthorized or a TLS handshake failure, the server happily responds with a JSON list of all registered agents and their statuses.

From there, the attacker can:

  1. Recon: List every node in the cluster.
  2. Intel: Query specific UUIDs (/v2/agents/{uuid}) to grab public keys.
  3. Destruction: Issue a DELETE request to /v2/agents/{uuid}. This deregisters the node. When the Verifier next tries to attest that node, it will fail, likely causing the orchestration layer (Kubernetes/OpenShift) to mark the node as untrusted and terminate workloads. It is a trivial Denial of Service against the infrastructure's trust layer.

The Mitigation: Lock the Door

If you are running Keylime 7.12.x or 7.13.0, you are vulnerable. The fix is straightforward:

  1. Patch Immediately: Upgrade to 7.12.2 or 7.13.1. These versions remove the dangerous CERT_OPTIONAL override.
  2. Network Segmentation: Why is your management interface exposed to the general network? Restrict access to port 8891. Only the Tenant CLI and the Agents need to talk to the Registrar. Firewall everything else.
  3. Reverse Proxy: If you can't patch immediately, place an Nginx or HAProxy instance in front of the Registrar. Configure the proxy to enforce ssl_verify_client on; (in Nginx) and forward the traffic only if the certificate is valid.

Official Patches

KeylimeGitHub Commit fixing the issue

Fix Analysis (1)

Technical Appendix

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

Affected Systems

Keylime Registrar

Affected Versions Detail

Product
Affected Versions
Fixed Version
keylime
Keylime (CNCF)
>= 7.12.0, < 7.12.27.12.2
keylime
Keylime (CNCF)
== 7.13.07.13.1
AttributeDetail
CVECVE-2026-1709
CVSS v3.19.4 (Critical)
CWECWE-287 (Improper Authentication)
VectorAV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
PlatformPython (Tornado/SSL)
ImpactAuth Bypass / DoS

MITRE ATT&CK Mapping

T1553Subvert Trust Controls
Defense Evasion
T1040Network Sniffing
Credential Access
T1498Network Denial of Service
Impact
CWE-287
Improper Authentication

Improper Authentication

Known Exploits & Detection

ManualExploitation involves using standard TLS clients (curl, python-requests) without client certificates.

Vulnerability Timeline

Fix committed to Keylime repository
2026-02-04
CVE-2026-1709 Published
2026-02-06
GHSA Advisory Published
2026-02-06

References & Sources

  • [1]GitHub Advisory GHSA-4jqp-9qjv-57m2
  • [2]NVD - CVE-2026-1709

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.