homelab

A certificate authority had a private key that was the number 4

A certificate authority generated private keys that turned out to be single and double digit integers. One of them was 4.

Browsers blocked the certificates within hours. Almost nothing else did, and that is the part that should interest anyone running their own infrastructure.

A network switch rack with tangled cables
Photo: cell105, CC BY 2.0.

What happened

eMudhra is an Indian certificate authority that has issued over 60 million certificates. During a key generation ceremony on April 30, 2025, something in the process produced a second set of P-384 keys with almost no entropy in them. Instead of 384 bits of randomness, the values landed in a range small enough that Mozilla’s analysis found them below 256.

Those weak keys then got used to sign eight intermediate CA certificates, apparently because their labels resembled the correct ones closely enough that nobody noticed. Six are TLS intermediates. Two are code signing.

A private key is only secret because it is too large to guess. If the number is 4, there is nothing to break. Anyone can derive it from the public certificate, which is public by definition.

That means for roughly eighteen months, anyone who worked this out could mint a certificate for any domain they liked and have it trusted by everything that trusted eMudhra.

The response was actually good

Worth saying, because the usual complaint here is that nobody acts.

Mozilla blocked the certificates about three hours after the report. Chrome and Apple followed on the TLS ones, Microsoft on the code signing ones. eMudhra revoked all eight and stopped issuing under that root. Talos reported no malicious use at the time of writing.

By browser standards this was close to the best case.

The part that isn’t fixed

Browsers are a tiny fraction of the things that make TLS connections, and they are the only part of the ecosystem that updates itself weekly.

Everything else trusts certificates through some other mechanism: an OS trust store, a bundled CA file compiled into a binary, a trust store the vendor ships and updates on their own schedule, or none of the above with revocation checking switched off because it was slow.

Talos’s list of what is still exposed is the useful bit:

  • VPN clients and gateways, which will need vendor software updates rather than a trust store refresh.
  • Go programs. Go’s chain verifier can ignore revocation with some embedded or legacy root pools, which is why it needed a code fix. That’s CVE-2026-111943, fixed in Go 1.27.3 and 1.26.10, which filter out any chain containing the affected key hashes.
  • IoT and embedded devices with CA stores baked into firmware. Some of these have no update path at all, which means they trust these keys permanently.
  • Proxies, load balancers and appliances that manage their own trust separately from the host OS.

Package managers come off better than you’d fear. An attacker would need to intercept the connection and have the manager trust an affected key, and lockfile hashes, checksums and signatures still protect you independently of TLS. That’s defence in depth doing its job.

What to actually do

Update Go if you build or run anything in it. 1.27.3 or 1.26.10.

Update your OS and trust bundles normally, and expect more vendor patches over the coming weeks rather than one fix.

Inventory the things that speak TLS and are not a browser. VPN clients, gateways, proxies, load balancers, anything embedded. Check each vendor’s advisory separately, because none of them inherit the browser fix.

The honest answer for old IoT gear is that you probably cannot fix it, and the mitigation is network position rather than patching. Which is the same conclusion we reached about the Broadcom WPS flaw two days ago, for the same structural reason.

Where we land

The failure itself is almost reassuringly dumb. A script in a key ceremony did the wrong thing, a second key set got created, the labels looked similar enough, and it went unnoticed for eighteen months. No sophistication required, nobody malicious, just a process with no check at the one point where a check mattered.

The structural problem is the one worth keeping. We have built a system where a handful of organisations can vouch for the identity of every server on the internet, and the correction mechanism when one of them fails only really works for browsers. Chrome shipped a fix in hours. The VPN appliance in a rack somewhere is on its vendor’s timeline, and the thermostat is on nobody’s.

Trust that updates at different speeds in different places is not really one trust system. It is a fast one wearing a slow one.

Sources: Cisco Talos on the affected certificates and what is still exposed, the Mozilla bug report, BleepingComputer on the browser response.

Leave a comment

Your email address will not be published. Required fields are marked *