eMudhra CA Compromise: When an Intermediate Private Key Was the Number 4
On 17 October 2026, a researcher using the handle Wayne disclosed that eMudhra — a public CA trusted by every major browser — had generated eight intermediate signing certificates whose private keys could be recovered from the public certificate alone. One of the private keys was literally the number 4. Browsers blocked the certificates within hours; everything else that bundles its own trust store did not. Here is what the bug was, who is still exposed, and the exact CA-bundle versions to ship to prove your fleet is safe.
TL;DR
- · Eight eMudhra intermediates chaining to emSign ECC Root CA - G3, created April 2025, had private keys recoverable in at most 256 guesses (a properly generated key needs ~10115).
- · Six were TLS intermediates; two were Microsoft code-signing intermediates. One private key was the integer 4.
- · Root cause looks like a type-casting bug that truncated large random numbers to a single byte — or a Go-era decimal-conversion footgun.
- · Browsers (Chrome, Firefox, Edge, Safari) blocked the certificates within three days via Mozilla OneCRL, CRLite and CRLSets. Everything that bundles its own trust store did not.
- · Patch your OS
ca-certificates, rebuild container images, and pin updatedcertifi, Javacacerts, Gogolang.org/x/cryptoroots, Rustwebpki-rootsand Node bundled roots.
What happened
eMudhra is a Bangalore-based public CA whose emSign ECC Root CA - G3 is in the Mozilla, Microsoft, Apple and Google root programs — which means every mainstream browser and most operating systems trust it to issue TLS certificates for any domain on the internet. In April 2025 eMudhra issued eight intermediate CA certificates under that root. The intermediates themselves were never logged to Certificate Transparency, which is already a red flag, but the real failure sat one level deeper: the private keys for all eight certificates were generated with so little entropy that the keys could be recovered by trial and error from the public key alone. One of the eight private keys turned out to be the small integer 4.
The root cause: a key-generation routine that produced one byte of entropy
A healthy 256-bit ECC private key is a uniformly random integer somewhere in the ~10115-wide keyspace. The eMudhra keys landed in a space of at most 256. The two leading theories, both consistent with the recovered values:
- A type-casting bug that generated a cryptographically random big-integer and then truncated it to a
bytesomewhere between the random source and the keypair constructor. - A Go decimal-conversion footgun from a deprecated API that silently coerced large integers through a narrower representation during serialisation.
Either way, the published cert gave anyone with a laptop everything they needed to reconstruct the signing key, mint a certificate for google.com or login.microsoftonline.com, and present it to any client that still trusts the chain.
What an attacker could actually do with this
An adversary with a network position — a hostile Wi-Fi hotspot, a compromised router, a nation-state-grade tap — could forge TLS certificates for any domain and intercept traffic to clients that still accept the eMudhra chain. The code-signing intermediates widen the blast radius further: a signed Windows binary from one of those keys would have validated against the Microsoft trust store until the OS received the revocation update. There is no public evidence the keys were abused in the wild, but once a private key is recoverable from a public artefact the question is reach, not possibility.
Who is already protected — and who is still exposed
Protected: browser users
Chrome (CRLSets), Firefox (OneCRL / CRLite), Safari (Apple's revocation push) and Edge all shipped revocations within three days of disclosure. End-user web browsing on an up-to-date browser is covered.
Still exposed: everything that bundles its own trust store
- Command-line clients:
curl,git,wget,opensslon hosts whoseca-certificatespackage hasn't been updated. - Container images: anything built before 20 October 2026, including common
:latesttags (grafana/grafana:latest,mysql:latest,jenkins/jenkins:latest,bitnami/postgresql:latest) at the time of disclosure. - CI/CD runners with stale images or long-lived VM AMIs.
- Language runtimes with their own roots: Python
certifi, Go's bundled roots (golang.org/x/crypto), Javacacerts, Node.js's bundled list, Rustwebpki-roots. - IoT / embedded firmware with trust stores burned in at build time.
Timeline
| Date | Event |
|---|---|
| Apr 2025 | eMudhra issues eight intermediate CA certificates under emSign ECC Root CA - G3. None logged to Certificate Transparency. |
| 17 Oct 2026 | Researcher "Wayne" reports to root programs. Firefox and Chrome block the certificates the same day. |
| 18 Oct 2026 | eMudhra revokes the eight intermediates. |
| 19 Oct 2026 | Apple devices block the certificates. |
| 20 Oct 2026 | Microsoft blocks the certificates; public incident site launches. |
| 22 Oct 2026 | Public technical write-ups and incident site published. |
The CA-bundle versions to ship
Browsers can revoke by push. Everything else needs a new ca-certificates package or an application-level trust-store bump. The fixed packages at time of writing:
| Distribution / runtime | Fixed in |
|---|---|
Ubuntu ca-certificates | 20260816ubuntu0.* |
Debian 12 ca-certificates | 20250419~deb12u2 |
Alpine ca-certificates | 20261020-r0 |
Fedora / RHEL ca-certificates | 2026.2.92_v9.0.319 |
Runtimes that bundle roots independently of the OS (certifi, webpki-roots, Java cacerts, Node.js) also need their own refresh — pin to the first release after 20 October 2026 and rebuild downstream images.
Verifying your fleet
The incident site publishes test hosts whose chain terminates in a revoked eMudhra intermediate. A healthy host should fail TLS validation:
curl -sS -o /dev/null -w "HTTP %{http_code}\n" \
https://dv-g3b-emudhra.we-have-a-problem.com/
curl -sS -o /dev/null -w "HTTP %{http_code}\n" \
https://dv-g3b-aaa-emudhra.we-have-a-problem.com/Expected output on a patched host: HTTP 000 (SSL verification failure). Any 2xx/3xx response means that host still trusts the compromised intermediate.
What to do in the next 72 hours
- Patch OS trust stores. Run
apt upgrade ca-certificates,apk upgrade ca-certificates, ordnf upgrade ca-certificatesacross Linux fleets. Reboot or restart long-lived services that cache the bundle in memory. - Rebuild container images.
docker build --pull --no-cacheall images that FROM a Linux base, including:latestimages in internal registries and CI runner images. Mirror updated base images to your private registry. - Refresh language-runtime roots. Bump
certifiin Python requirements, upgrade Javacacertsvia your JDK vendor's October 2026 bundle, pinwebpki-roots>= the first post-20 Oct 2026 release in Rust projects, and rebuild Go and Node services against the latest point release. - Audit code-signing paths. Microsoft Authenticode validation on Windows machines without the 20 Oct 2026 update will still accept binaries signed by the two code-signing intermediates. Push the update through WSUS / Intune and search EDR logs for unexpected signed-binary executions since April 2025.
- Verify with the curl probes above. Run them from a representative node per environment (prod, staging, CI, a container built from each base image you ship) and capture the output as evidence for your next audit.
How TigerGate helps
- Container Security flags images whose
ca-certificatespackage predates the fixed version and surfaces the first service running each affected image, so you rebuild in reachability order rather than alphabetically. - SCA and SBOM finds projects pinned to pre-fix
certifi,webpki-roots, Javacacertsand Node bundled-root versions across every repo and lockfile. - Server Vulnerability Monitoring fingerprints the installed
ca-certificatesversion on every Linux host and cloud VM — including CI runners and bastion hosts — so the known-stale machines rise to the top of the queue. - eBPF runtime detection flags TLS handshakes that complete against the compromised chain on hosts you thought were patched — the fastest way to catch an unexpected pre-baked trust store in a legacy image.
- Compliance evidence maps the trust-store refresh to SOC 2 CC7.1 vulnerability lifecycle, PCI DSS 4.0 requirement 2.2.5 (cryptographic trust management), and ISO 27001 A.8.24 — the audit trail your next auditor will ask for.
Sources
- CCADB and root-program bulletins from Mozilla, Microsoft, Apple and Google, 17–20 October 2026
Find stale trust stores across your fleet
14-day trial. Scan container images, Linux hosts and language-level dependencies for pre-fix ca-certificates, certifi, webpki-roots and Java cacerts, prioritised by what's actually accepting TLS in production.