DNS Benchmark ProReal-time DoH latency analysis

Enterprise IT News

Enterprise IT News Alert: LXD Trusts the Wrong Certificate

By Nattapong Sukkasem · Published · Updated .

TL;DR — CVE-2026-112816 lets anyone who can reach the LXD or MicroCloud HTTPS API authenticate as any trusted client whose public certificate they hold, with no private key and no stolen secret. The daemon compared every certificate a client presented against its trust store, but a TLS handshake only proves ownership of the first one. The Incus project found it and reported it upstream; Canonical published an advisory on 28 October and shipped fixed snaps on 29 October. Incus scores it 10.0. The enterprise IT news is not the number. It is that the whole attack is built from values that were never secret.

Most enterprise IT news about broken authentication is a story about a stolen credential. This one is a story about a credential that was never private to begin with. CVE-2026-112816 affects LXD, Canonical MicroCloud and the Incus fork they share ancestry with, and it turns a public certificate — a value a server hands out to every client that connects to it — into a working login for that certificate's cluster.

Enterprise IT news: blade servers seated in a Fujitsu PRIMERGY BX400 chassis, the kind of clustered server infrastructure that LXD and MicroCloud manage through the HTTPS API affected by CVE-2026-112816
Blade nodes in a single chassis. A MicroCloud deployment turns a handful of machines like these into one cluster, administered entirely through the HTTPS API at the centre of this flaw. Representative hardware, not an affected system.

What a TLS handshake actually proves

Mutual TLS is how machines authenticate to each other without passwords, and it has one property that is easy to forget. The handshake proves that the peer holds the private key for exactly one certificate: the leaf, the first one it sends. Everything after that in the chain is unverified data the client chose to attach.

The daemon listens with Go's tls.RequestClientCert, which asks for a chain but does not validate it. Authentication then walked r.TLS.PeerCertificates — every certificate the client handed over, in the order the client picked — and tested each one against the trust store. A match anywhere in that list returned success.

So the attack needs no cryptography at all. Generate a throwaway key pair, use it as the leaf so the handshake completes, then append the target identity's public certificate behind it. The leaf proves who the attacker is. The appended certificate decides who the server believes they are.

The fix is an array index

The public Incus commit that closes this, authored on 13 October, replaces the loop with r.TLS.PeerCertificates[0] and runs the trust check against that certificate alone. The same correction is applied across API authentication, certificate enrolment, the self-service renewal and deletion paths, the agent connection between a host and its virtual machines, the authorization scriptlet and internal cluster traffic.

The obvious reading of this is the wrong one. This is not a security control enforced at the wrong layer. TLS was in exactly the right place and did exactly its job. The daemon above it asked a membership question — is any certificate in this connection one I recognise? — when the only answerable question is a proof question: did this peer demonstrate possession of the key for a certificate I trust? Those two sentences differ by one word, and in the code they differed by one subscript.

ProductAffectedFixed
LXD 6.x6.9.0 through 6.10.06.10.1
LXD 5.21 LTSthrough 5.21.85.21.9
LXD 5.0 LTSthrough 5.0.105.0.11
LXD 4.0 LTSthrough 4.0.144.0.15
MicroCloud2.x and 3.x before the fixes2.1.5 and 3.4.1
Incusevery release to date7.6.0
The Linux Containers project logo, the upstream home of LXD and Incus, the container and virtual machine managers affected by the CVE-2026-112816 certificate validation flaw
LXD and Incus share a common ancestry under the Linux Containers umbrella, which is why a defect found by one was confirmed in the other within days.

Nothing leaked, so nothing can be rotated

The material an attacker needs is public by design. A daemon presents its own certificate in every TLS handshake it completes, so one connection is enough to collect it. Client certificates are readable through the certificates API by any trusted client, and can also be harvested from any server that client has talked to. For MicroCloud, Canonical warns that intercepting a member's public certificate while it joins the cluster is sufficient to log in as that member afterwards.

That inverts the usual incident reflex. After a credential exposure the first instruction is always to rotate the exposed value, and here there is nothing to rotate, because nothing was ever confidential. The patch is the whole remediation, and there is no configuration that substitutes for it.

There is also no zero-day vulnerability anywhere in this story, in any sense the word is normally used. Nobody raced a fix against an exploit. A downstream project read its own authentication code, recognised the pattern, reported it to the vendor it shares a lineage with, and both shipped before the public knew the flaw existed.

What an impersonated identity reaches

The blast radius is what makes this enterprise IT news worth an out-of-band change window. Canonical describes the outcome as full access to the cluster and the virtual machines it manages, and notes that where the impersonated client is a privileged one, that extends to root on the host. The intermediate steps are not all equivalent. Presenting the server's own certificate reaches the database gateway. Presenting another cluster member's certificate reaches internal cluster traffic. Client and metrics certificates yield their respective identities. Token-based and OpenID Connect clients are in scope as well, and the authorization scriptlet — the hook operators use to express their own access rules — was handed the unverified chain too, so a policy written against it was reasoning about attacker-supplied input.

Detection is the uncomfortable part. A DDoS attack is hostile traffic that is unmistakably hostile; the difficulty is absorbing it, not spotting it. This is the opposite problem. Every request an impersonator makes is well formed, correctly authenticated and logged under the name of a real administrator, so the application log is not evidence of anything. The only layer where the attack is visible is the handshake itself, where a client that presents more than one certificate has no legitimate reason to do so.

The interior of a 1U rack mount server showing CPU heatsinks, memory and the cooling fan wall, the host machine a privileged LXD identity reaches root access on
Inside a 1U node. Where the impersonated client is a privileged one, Canonical warns the result is root on the host itself, not merely control of the instances running on it.

This is also where private-cloud cloud security stops being a diagram. A container and virtual machine manager is server infrastructure that runs other people's server infrastructure, and the only thing separating one workload from the next is a daemon's ability to tell its administrators apart from strangers. When that distinction fails, there is no second boundary underneath it.

Where resolution comes into it

LXD does not merely place instances on a network. Its managed bridge runs the DHCP and DNS service those instances use, which makes the daemon the resolver for everything it hosts. An identity with authority over a managed network therefore decides what every container and virtual machine on it resolves, without logging into a single guest. Instances pick the change up when their leases and cached answers expire.

The wider lesson transfers directly to resolution infrastructure, because mutual TLS is the same primitive enterprises reach for when they want a resolver to recognise its clients. Client-authenticated DNS over TLS, and DNS over HTTPS endpoints that require a client certificate instead of an allow-list of addresses, are mutual TLS deployments with the same failure mode available to them if the validation is written by hand. The protocols DNS already uses for machine-to-machine trust avoid the trap by construction: TSIG authenticates each individual message with a keyed signature, and a DNSSEC validator verifies every link in a chain up to one pinned anchor rather than accepting a chain because it recognises something inside it.

A network latency comparison of public DNS resolvers measured in the browser, the kind of baseline that makes a change in resolver behaviour visible after a cluster update
A resolver comparison run from the browser. A network latency baseline taken before a cluster-wide update is what later distinguishes a configuration change from a coincidence.

What to check this week

  1. Refresh the snaps, then verify the version. snap refresh lxd and snap refresh microcloud.
  2. Establish whether your listener is reachable at all. A standalone LXD installation does not expose the HTTPS API unless core.https_address has been set. MicroCloud exposes it by design, because a cluster has to talk to itself.
  3. Read the trust store as a list of identities an attacker could have worn. Every entry was usable by anyone holding its public half, and the same flaw allowed entries to be renewed or removed, so confirm the list still matches what you expect.
  4. Do not spend the week rotating certificates. Nothing was disclosed, so re-issuance buys no IT security benefit on an unpatched daemon and delays the only fix that works.
  5. Move detection down to the handshake. Record the leaf fingerprint and the chain length presented by each client. More than one certificate on an administrative connection is the anomaly; the API log will show a familiar name either way.
  6. Baseline what your instances resolve. A network diagnostic tool run against the resolvers your workloads actually use records what normal looks like, which is what makes a silent redirection visible later.
A DNS server performance benchmark measuring encrypted resolver response times from the browser, used to compare public DoH endpoints before and after an infrastructure change
A DNS server performance benchmark against public resolvers. Measuring before an infrastructure change is the cheapest way to prove afterwards that the change did no harm.

What it means

The hedges are worth carrying at full strength. Neither Canonical's advisory nor the Incus notice reports exploitation in the wild, and the assessment recorded on 30 October lists the identifier as not known to be exploited, absent from the Known Exploited Vulnerabilities catalogue, and without a published working exploit. The severity is also not agreed: Incus rates the flaw 10.0, while Canonical's own Ubuntu security tracker assigns its LXD record a priority of Medium. The root-access outcome is drawn from the vendor advisory, not from a demonstrated intrusion.

What is not hedged is the mechanism, because the corrected code is public and the correction is three characters long. Hand-written mutual TLS checks are everywhere in modern infrastructure — in orchestrators, in service meshes, in resolvers that authenticate their clients — and almost all of them were written by someone reading a chain out of a TLS library and treating it as evidence. It looks like evidence. Only the first entry is. The practical takeaway from this cycle of enterprise IT news is a single question to ask of any system in your estate that authenticates a machine with a certificate: does it check the leaf, or does it check the list?

Sources

Related articles

Browse every DNS news article by month →

DNS angle

Review resolver logs for the systems discussed above and compare unexpected names with your approved services. A successful lookup does not establish that a destination is safe. Use the DNS lookup tool to inspect current answers, then compare them with your own resolver and incident records.

Source: The Hacker News — CVSS 10.0 LXD, MicroCloud Flaw Lets Attackers Impersonate Trusted Clients Without a Private Key ().