Skip to main content
Security Bulletins / ILL-SB-2026-001
Security BulletinSeverity: HighStatus: ActiveTLP:CLEAR

eMudhra Certificate Authority Key Compromise

Eight eMudhra (emSign) intermediate certificate authority keys can be computed by anyone. Browsers and phones have blocked them. Servers, container images, language runtimes and appliances that carry their own trust list may still trust them until updated.

Bulletin ID
ILL-SB-2026-001
Severity
High
Status
Active
Published
October 21, 2026
Last updated
October 21, 2026
Exploitation
None reported
Action required
Update, rebuild and re-test systems outside the browser
PKICertificate authorityTLSCode signingSupply chain

01Am I affected?

Your browsers and phones are already protected if they take automatic updates. The exposure sits in software that keeps its own list of trusted certificate authorities and does not check revocation: servers, container images, language runtimes, build pipelines and network appliances.

Exposure mapFIG_01
ProtectedChrome and FirefoxBlocked October 17. Nothing to do if updates are on.
ProtectedApple, Android, WindowsBlocked October 19 and 20 through system updates.
UpdateLinux serversUpdate the ca-certificates package.
RebuildContainer imagesBuilt before October 20? Patching a running container does nothing for the image. Rebuild and redeploy.
UpgradeGo, Node.js, Python, Rust appsThey carry their own trust list. A pinned certifi survives every rebuild.
No fix yetJava and BunNo stable fix as of October 21. Watch your vendor.
Manual fixmacOS command-line toolscurl, git and python3 read a file Apple did not update.
Check vendorTLS-inspecting appliancesProxies, secure web gateways, API gateways and VPNs with their own store.
Green layers fixed themselves. Everything else waits for someone on your team to update, rebuild or re-test.

Test a system in one command

The researcher runs a site signed by one of the compromised intermediates. Run this from any server, container or laptop:

curl -sI https://dv-g3b-emudhra.we-have-a-problem.com
  • A certificate error means the system no longer trusts the compromised authority.
  • A normal response means it still does.

Test with the runtime your application actually uses. Python, Node.js and Java can each use a different trust list from the operating system, so a clean curl result on the host does not clear the application running on it.

02What to do

Fix flowFIG_02
StartRun the test from the system, using the runtime your application uses
↓
Certificate error?
↓
YesProtectedSave the output as evidence and move to the next system.
NoStill trusts the bad keys. Fix the layer:OS package: update ca-certificates, rebuild, redeployRuntime: upgrade Go, Node.js, certifi or webpki-rootsMac tools: brew upgrade, remove the rootsAppliance: apply the vendor fix
↓ then ↓
CloseRe-test, record the result, close the ticket
Run it per system and keep every test output. Together they are your evidence that the incident is closed.
  1. Update ca-certificates and rebuild. Update the package on servers and in every base image, then rebuild and redeploy. Updating a running container does not fix the image it came from.
  2. Update runtimes that bundle their own list. Use the versions in the table below. A lock file that pins an older certifi keeps the old list through every rebuild.
  3. Fix developer Macs. Run brew upgrade ca-certificates, then follow the researcher’s incident page to remove the affected roots from the macOS file that the built-in curl, git and python3 read.
  4. Check appliance vendors. Look for advisories on any proxy, gateway or VPN that inspects or validates TLS.
  5. Check what you bought from eMudhra. If any of your sites or signed software use an emSign certificate, confirm the issuing authority and replace it if it is one of the eight. Chrome removes the emSign ECC Root CA G3 on October 27.

Fixed versions

ComponentFixed in
Debian 13 ca-certificates20250419+deb13u1
Debian 12 ca-certificates20250419~deb12u2
Ubuntu 22.04 ca-certificates20260816ubuntu0.22.04.1 (other releases: USN-8944-1)
Alpine ca-certificates20261020-r0 (edge)
Fedora 45 ca-certificates2026.2.92_v9.0.319 (rolling out through updates)
Go1.27.3 or 1.26.10
Node.js22.23.4, 24.22.1 or 26.12.1
Pythoncertifi 2026.10.19, pip 26.2.2
Rustwebpki-roots 1.0.10
Java, BunNo stable fix as of October 21

If you cannot do everything this week

Order the work by what the system talks to. Start with services that call payment processors, identity providers and partner APIs, because those are the connections where a forged certificate would hand an attacker credentials or money. Build and deploy pipelines come next, since they pull code over TLS and push to production. Internal-only services can follow in the next normal patch cycle.

03What happened

Every HTTPS connection rests on a chain of signatures. A root authority your system trusts signs an intermediate authority, the intermediate signs a website’s certificate, and your browser or server checks each signature up the chain. The intermediate’s private key is the only thing that makes its signature mean anything.

How certificate trust worksFIG_03
Root CAemSign Root TLS CA G3eMudhra's own root, in browser and OS trust stores
Root CASectigo AAA Certificate ServicesAn older, widely trusted root that cross-signed the eMudhra intermediates
↓ both vouch for ↓
Intermediate CA (x8)EM DV TLS CA G3C and seven siblingsPrivate key: a whole number below 256
↓ signs ↓
Website certificateAny name the key holder choosesYour bank's login page, your identity provider, your own API
↓ checked by ↓
Your browser, server or appAccepts the certificate if every signature checks out up to a trusted root
Whoever holds the intermediate's private key can sign a certificate for any name, and every system that trusts either root accepts it.

A private key for this kind of certificate authority should be a random number about 116 digits long. Each of these eight was a whole number below 256, and one of them was 4. Finding a key like that takes at most 255 guesses, which a laptop does in well under a second.

Why a key below 256 is brokenFIG_04
A safe P-384 key384 bitsA random number about 116 digits long. More possibilities than atoms in the universe.
eMudhra’s keys8 bitsA number from 1 to 255. One of them was 4.
1 × G? no2 × G? no3 × G? no4 × G? MATCH: private key recovered
The public key is the private key multiplied by a known point. With a tiny private key, you try every number until one matches.

According to eMudhra’s account in the public Mozilla bug, the weak keys came from a chain of ordinary mistakes during a single key ceremony, and none of them was caught for a year and a half.

What went wrong, step by stepFIG_05
1
April 30, 2025Key ceremonyeMudhra generates strong keys for eight new intermediate CAs inside hardware security modules.
2
Same ceremonyA test step makes a second set of keysAn approved wrap/unwrap test creates another key pair, and a flaw in the ceremony script makes it weak.
3
Same ceremonyThe wrong keys get usedThe two sets have similar labels. The weak keys are the ones used to request the certificates.
4
May 14, 2025Trust spreadsSectigo cross-signs all eight, so systems that trust its older root now trust them too.
5
18 monthsTwo audit cycles passEvery system that trusts either root trusts the weak keys the whole time, and nobody catches them.
6
October 17, 2026A researcher works out all eight keysReported to the browsers and eMudhra. Chrome and Firefox block them the same day.
Based on eMudhra's account in Mozilla Bugzilla 2083449. eMudhra says the exact root cause is not yet confirmed.

Six of the eight issue website (TLS) certificates and two issue code-signing certificates. Only one was in production, and it had issued no certificates to customers. Sectigo revoked its cross-signatures on October 19.

04Why it matters

With one of these keys, an attacker can issue a certificate for your bank, your identity provider or your own API, and any system that still trusts the authority will accept it. To use a forged website certificate, the attacker also has to sit in the network path.

How an attack would workFIG_06
Step 1Compute the private keyFrom the public certificates, in under a second.
↓
Step 2Issue a certificate for the targetYour identity provider, your payment processor's API, or your own service.
↓
Step 3Get into the network pathA compromised Wi-Fi network, a poisoned DNS record, or a hostile proxy.
↓ your system connects and checks the certificate ↓
Patched browser or serverCertificate rejectedThe connection fails safely.
Unpatched server, image or runtimeCertificate acceptedCredentials and data go to the attacker.
 
Code-signing keysSkip step 3 entirelyMalware signed with the two code-signing keys looks legitimate anywhere those authorities are still trusted.
No attack like this has been reported. What decides the outcome is whether the system on your side still trusts the eMudhra keys.

Two things reduce the risk. No exploitation has been reported, and Google reports that no website certificate chaining to the six TLS authorities appeared in public Certificate Transparency logs before the block. Most server software does not check those logs, though, so that protection does not extend to your backend.

This has happened before

In 2008, a Debian patch left OpenSSL with so little randomness that only about 32,000 keys were possible, and every key generated on Debian and Ubuntu systems since 2006 had to be replaced. In 2017, the ROCA flaw made RSA keys from Infineon chips factorable. Weak key generation is an old failure. What is new here is that it happened at a certificate authority and passed two audits.

05Compliance notes

The issue went undetected for about 18 months, through two independent audit cycles.

eMudhra incident statement, October 2026

An audit samples whether a process was followed and documented; it does not test every artifact the process produced. Your own auditors will not ask about eMudhra by name. They will ask how you learned about a critical third-party vulnerability, how fast you assessed it, and what evidence shows it was closed. Under ISO 27001 that touches threat intelligence (A.5.7), use of cryptography (A.8.24) and management of technical vulnerabilities (A.8.8). Under SOC 2 it is CC7.1, with the change records under CC8.1.

  • Open an incident ticket, even with no sign of impact.
  • Record which systems you tested and the result for each.
  • Record the image rebuilds and version bumps as changes.
  • Close it with a re-test, not an assertion.

Done that way, this incident becomes a dated record of detection, investigation, remediation and close-out against a real external event, and a ready-made tabletop exercise if your incident response plan has not been tested this year. For the longer-term lesson, see Your Audit Passed. You’re Still Screwed. and Vendors Are Your Attack Surface.

06Timeline

Date (UTC)Event
Apr 30, 2025Key ceremony creates the eight weak keys.
May 14, 2025Sectigo cross-signs all eight under AAA Certificate Services.
Oct 17, 2026Researcher reports the issue. Chrome and Firefox block the keys the same day.
Oct 18, 2026eMudhra revokes all eight intermediates.
Oct 19, 2026Apple and Android block them. Sectigo revokes its cross-signatures. Go, Rust and Python certifi fixes released.
Oct 20, 2026Microsoft blocks them. Debian, Ubuntu and pip fixes released.
Oct 21, 2026Node.js fixes released. Illumen notifies clients and publishes this bulletin.
Oct 27, 2026Chrome removes the emSign ECC Root CA G3 from its root store (scheduled).

07References

Revision history

DateChange
October 21, 2026Initial publication.
Not sure where your systems stand?

Illumen can test your environment and produce the evidence record your auditor will ask for.