Feb 6, 2026·5 min read·110 visits
The Keylime Registrar, which manages TPM identities, had its mTLS verification set to 'Optional' instead of 'Required'. This allows any unauthenticated attacker with network access to query or delete agent records, effectively bypassing the entire security model of the registrar component. Fixed in versions 7.12.2 and 7.13.1.
A critical authentication bypass in Keylime, a CNCF project designed for remote boot attestation using TPMs. ironically, the component responsible for verifying trust (the Registrar) was configured to treat client certificates as 'optional' due to a logic error in the TLS initialization code. This allows unauthenticated attackers to wipe agent data, retrieve TPM metadata, and effectively blind the attestation service.
Keylime is the sort of tool you deploy when you are paranoid. It is a Cloud Native Computing Foundation (CNCF) project built for remote boot attestation. It uses Trusted Platform Modules (TPMs) to cryptographically prove that a remote server hasn't been tampered with. It is the digital equivalent of a guard dog that checks your ID badge, scans your retina, and takes a blood sample before letting you into the data center.
At the heart of this paranoid ecosystem sits the Registrar. The Registrar is the database of record for all Keylime agents. When a new node comes online, it talks to the Registrar. When the Verifier needs to check a node's integrity, it talks to the Registrar. Because this component holds the public keys and metadata for the entire fleet, it is supposed to be locked down tighter than a drum. Access is strictly controlled via Mutual TLS (mTLS).
Or at least, it was supposed to be. In version 7.12.0, a change was introduced that turned that snarling guard dog into a golden retriever. Instead of demanding a valid client certificate, the Registrar was configured to merely suggest one. If you showed up without ID, it just wagged its tail and let you in.
To understand this bug, you have to understand Python's ssl module. It offers a few modes for verification, specifically CERT_REQUIRED and CERT_OPTIONAL.
To a weary developer or a rushed sysadmin, CERT_OPTIONAL sounds like a reasonable fallback: "Check the cert if they have one, but maybe let them handle authentication at the application layer if they don't." That is not what it does in this context.
When verify_mode is set to ssl.CERT_OPTIONAL, the server requests a certificate during the TLS handshake. If the client sends one, the server validates it. If the client sends nothing, the server says, "Fair enough, come on in." It is the "Fail Open" of cryptography. For a system like Keylime, which relies entirely on mTLS for authentication (it doesn't typically use passwords or tokens for these service-to-service calls), setting this mode is equivalent to removing the lock from the door entirely.
The vulnerability lived in keylime/web/base/server.py. The initialization logic for the web server creates an SSL context. Interestingly, the helper function web_util.init_mtls actually did its job correctly—it returned a context with verification set to CERT_REQUIRED.
But then, the Server class explicitly overruled it. Here is the smoking gun from the vulnerable code:
def _use_config(self, component: str) -> None:
# ... configuration loading ...
self._ssl_ctx = web_util.init_mtls(component)
self._ssl_ctx.verify_mode = CERT_OPTIONAL # <--- The root of all evilThat single line, added in version 7.12.0, effectively disabled the security model for the Registrar. It explicitly told the SSL context to stop enforcing the requirement for client certificates. The fix, implemented in commit a37fe134e6d22e52f5cbd07e0c9bfca9d5c8a31d, was embarrassingly simple: just delete the line.
Exploiting this does not require a zero-day in the kernel or heap Feng Shui. It requires curl. Because the server negotiates the TLS handshake without demanding a certificate, any tool that speaks HTTPS can interact with the API.
The Attack Chain:
# List all agents (The "Who is here?" attack)
curl -k https://target-registrar:8891/agents/
# Delete an agent (The Denial of Service attack)
curl -X DELETE -k https://target-registrar:8891/agents/c4a929fe-2e3b-4652-9b55-bf3c7e583c88> [!NOTE]
> The -k flag in curl is necessary because the attacker likely doesn't trust the server's CA, but the irony is that the server doesn't care if it trusts the attacker.
In a proper mTLS setup, the handshake would fail before the HTTP request is ever processed. Here, the handshake succeeds, and the Python application processes the request as an anonymous user, which the code logic failed to reject.
Why should you panic? If an attacker can delete agents from the Registrar, the Verifier (the component that checks health) loses track of them. The system effectively goes blind. You could have a compromised node in your cluster, but if the attacker deletes its registration, Keylime stops monitoring it.
Furthermore, the Registrar API exposes public keys and TPM metadata. While not as critical as private keys, this information allows an attacker to map out the infrastructure, identify specific hardware (via TPM Endorsement Keys), and prepare for more sophisticated attacks against specific nodes.
This is a CVSS 9.4 for a reason. It is network-accessible, requires no privileges, and completely undermines the integrity and availability of the trust system.
The fix is straightforward: upgrade. The Keylime team patched this in versions 7.12.2 and 7.13.1 by removing the offending line of code.
If you cannot upgrade immediately:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Keylime Keylime Project | >= 7.12.0, <= 7.13.0 | 7.13.1 |
Red Hat Enterprise Linux Red Hat | 9 | Determined by package manager |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-322 (Key Exchange without Entity Authentication) |
| CVSS Score | 9.4 (Critical) |
| Attack Vector | Network |
| Attack Complexity | Low |
| Privileges Required | None |
| Impact | High (Confidentiality, Integrity, Availability) |
Ruby Mechanize prior to version 2.14.1 contains an information disclosure vulnerability. When executing cross-origin HTTP redirects, global headers configured on the Mechanize agent (such as Authorization or Session Cookies) are dynamically re-applied to the subsequent request, bypassing the internal header-stripping logic. An attacker who controls a redirection endpoint can capture sensitive bearer tokens or cookies.
An origin trust boundary failure in the Ruby mechanize library (prior to v2.14.1) allows unauthenticated remote web servers to harvest sensitive global request headers, such as Authorization Bearer tokens and cookies, by utilizing HTML-level meta-refresh redirection tags. Standard HTTP-level redirect boundaries were not applied to document-level redirects, creating a vector for cross-origin credential leakage during automated crawls.
CVE-2026-107718 is a medium-severity Open Redirect vulnerability in the core HTTP server package of the AdonisJS Node.js framework. Prior to versions 8.2.3 and 9.3.0, the framework built route paths by directly interpolating dynamic parameters and wildcard segments without URI encoding. If an application routes attacker-controlled input directly to a dynamic first path segment and uses the generated route URL as a redirect destination, a leading slash can produce a scheme-relative external URL. Modern web browsers process scheme-relative URLs by redirecting the client to the specified external domain, exposing users to credential harvesting, social engineering, and session hijacking. This vulnerability affects all applications running unpatched configurations where input validation is not explicitly implemented before generating paths.
CVE-2026-107725 is a critical security bypass in Hazelcast where missing authorization checks in the MapPermission class permit unprivileged clients to issue queries containing aggregators or projections. This architectural oversight allows attackers to run arbitrary code on the cluster servers under the privileges of the active Hazelcast process.
A stored Cross-Site Scripting (XSS) vulnerability was identified in Indico, an open-source event management system developed at CERN, prior to version 3.3.13. The vulnerability stems from weak URL validation in custom link fields and lack of HTML sanitization during Marshmallow serialization of event notes. This allows authenticated attackers with event modification privileges to inject malicious payloads that execute in the browser of users viewing the event pages or collaborating on notes.
A technical analysis of CVE-2026-107397, a stored Cross-Site Scripting (XSS) vulnerability in Indico's collaborative notes editor and custom link generation fields. Prior to version 3.3.13, Marshmallow serialization schemas omitted HTML sanitization during conflict resolution, and form validators failed to enforce strict URI schemes, enabling authenticated low-privilege attackers to execute arbitrary JavaScript.