Anyone can recover the private keys of eight eMudhra intermediate certificate authorities from their public certificates. Browsers blocked them within hours. Servers, containers, SDKs and appliances that carry their own trust store need an update, and most of them do not enforce Certificate Transparency, so nobody can say for certain they were never attacked.
Reflects what was publicly known on the last updated date. Every fact links to a primary source at the end of the page.
Find the row that describes you. For most teams this is a patching exercise; the harder question is whether any non-browser client was attacked before the fix.
You use a mainstream browser
Chrome, Firefox, Safari, Edge
Keep the browser and operating system updated. Every major browser blocked the intermediates between 17 and 20 October, and CT enforcement means none could have accepted a forged certificate before that.
You run servers, containers, CI or command-line tools
Anything with its own trust store: Go, Node.js, Python, Rust, curl, Java
Update the system trust store and your runtimes, then rebuild images. Find your fixed version
You run TLS-inspecting proxies, gateways or appliances
Egress proxies, API gateways, load balancers, IoT and OT devices
These validate upstream certificates for every client behind them and often ship a vendor trust store. Check each vendor's update and confirm with the live test below.
Your TLS certificates come from eMudhra
Chaining to emSign ECC Root CA - G3
Replace them with certificates from another hierarchy before Chrome removes the root on 27 October. Details
You verify code signed through eMudhra
The two code-signing intermediates, trusted on Windows
eMudhra states they never issued a certificate and Microsoft blocks them. Treat any signature that chains through them as untrusted.
Work through these in order. The first two close the exposure; the last two tell you whether it was used.
Update the system trust store, then rebuild images
ca-certificates package on servers and rebuild container images on updated base images. An image built before the fix keeps the old trust store until it is rebuilt, and a running process keeps the bundle it loaded at start, so restart services after updating.Update runtimes and libraries that bring their own trust store
Confirm each client rejects the intermediates
Hunt for use of the intermediates in TLS telemetry
If any of your certificates chain to emSign ECC Root CA - G3, replace them now with certificates from a different hierarchy. Mozilla has already removed the root from NSS, and Chrome's root store update removing it is expected to reach all devices on 27 October 2026. eMudhra initially estimated about 30,000 certificates needed migrating, about 97% of them issued through ACME, and says it is moving subscribers to its RSA root, emSign Root CA - G1. Chrome says it is also reviewing eMudhra's remaining certificates, so a second hierarchy from a different CA is the safer choice.
Patching removes trust going forward. It does not tell you whether a client that trusted these intermediates was ever handed a forged certificate. These checks answer both questions.
The incident tracker runs test hosts that serve certificates from a compromised intermediate, directly and through the Sectigo cross-sign. Run these from the environment you want to test: a server, a CI runner, inside a container. A certificate error means the client is protected.
curl https://dv-g3b-emudhra.we-have-a-problem.com/
curl https://dv-g3b-aaa-emudhra.we-have-a-problem.com/The tracker's page also runs the full set of twelve hosts in a browser, and publishes the chain each host serves for offline testing.
The first check looks for the distrusted root by name. Most bundles contain only roots, but some applications pin intermediates in their own stores, so the second check matches all sixteen intermediate and cross-sign fingerprints from the Mozilla incident record. No output from either means the bundle is clean.
# Prints a line if the bundle still trusts the distrusted root.
# No output means the root is gone.
openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt \
| openssl pkcs7 -print_certs -noout \
| grep -F "emSign ECC Root CA - G3"# Prints the SHA-256 fingerprint and subject of any certificate in the
# bundle that is one of the compromised intermediates or cross-signs.
BUNDLE=/etc/ssl/certs/ca-certificates.crt
cat > /tmp/emudhra-sha256.txt <<'EOF'
E7568FE6E12331F4FD7DE61DA4C7559D0F8EB192A218D4741A3BA75184333838
579480AEA166290BD3C643589E795FC0D0E54E86505D180F1DFF99EFD3199512
98B896625C0C230ADEEC3EB2CF6AAD5001ECF9156A68644E82374CE5833BC25B
5F1DED4DD590AF74631290CF073B122A2AAC6A1FA479778A0BD43579BD832699
42C4ACCD12C4F59597925E1A08A7A90102608543809308D50EC427E118BA1493
45A883F349AEDFD5F3A649B5498FFB121712BA8B448F3F2A91DBC5A766FCDDBE
432EC25F0D28DE9006D97BF752F17BBB2CD41F669933FCB072D9A1148D0261F3
FD9D5C2DBBD4995AB69B8D50C439D9527B00529199C2FD01B2174EB58F07021F
CB6E15165AC802E9B3F993F16C25D41F4E81C21EBDE71AE1B012AC00BF9C7C3F
7485B51C0ED192878FA1D2F948FB529AE1842CC5086C4B67F7BE5B2039DE9489
0164D7CEAE5BB909C272AF151FF44B1177AE9B47D9424B94F1D9558C30934D19
62B7F9868263F72F6911FC78CEAF72C1979158B7368BF648683BB2AA39B02E72
9E39DE2881273ACC225A149C72BA3E0F51424963669AB633EE1DC7DF5DB067B4
A496E23AC0CAB8155FC9B117B97EAE368EFCBB9041AEC8804D5A308D2D01C2D8
4B2460A466F95FD40113BCDCCA2CEB29B3B093921DE45474DA7DF48874C630B1
84112972B8E59D14560AE7E7119654474AAD119990CF3722BFC1E3B91615E1FD
EOF
tmp=$(mktemp -d)
awk -v d="$tmp" '/-----BEGIN CERTIFICATE-----/{n++; f=d "/" n ".pem"}
n{print > f} /-----END CERTIFICATE-----/{close(f)}' "$BUNDLE"
for f in "$tmp"/*.pem; do
openssl x509 -in "$f" -noout -fingerprint -sha256 -subject
done | tr -d ':' | grep -iF -A1 -f /tmp/emudhra-sha256.txt
rm -rf "$tmp"| Platform | Bundle path |
|---|---|
| Debian, Ubuntu, Alpine | /etc/ssl/certs/ca-certificates.crt |
| Fedora, RHEL | /etc/pki/tls/certs/ca-bundle.crt |
| macOS command-line tools | /etc/ssl/cert.pem |
| Python certifi | The path printed by python3 -m certifi |
Images carry the trust store they were built with. Check the bundle inside an image without running it, then check runtimes that do not read the system store.
# Checks the trust store baked into a container image without running it.
IMAGE=your-registry/your-image:tag
cid=$(docker create "$IMAGE") &&
docker cp -L "$cid:/etc/ssl/certs/ca-certificates.crt" - | tar -xO \
| openssl crl2pkcs7 -nocrl -certfile /dev/stdin \
| openssl pkcs7 -print_certs -noout \
| grep -F "emSign ECC Root CA - G3"
docker rm "$cid" > /dev/null# Java: lists emSign entries in the JDK's default trust store.
keytool -list -cacerts -storepass changeit | grep -i emsign
# Python certifi: prints the bundle path to scan with the checks above.
python3 -m certifi
# Node.js: prints any bundled root matching the distrusted root.
node -e 'const { X509Certificate } = require("node:crypto");
for (const pem of require("node:tls").rootCertificates) {
const c = new X509Certificate(pem);
if (c.subject.includes("emSign ECC Root CA - G3")) console.log(c.subject);
}'Match the full name emSign ECC Root CA - G3. Other emSign roots are not part of this incident, and Mozilla is not removing emSign Root CA - G1 at this time. For a custom Java keystore, export it to PEM and run the fingerprint check.
A forged certificate would be a leaf for a real domain whose issuer is one of the six TLS intermediates, reached either directly or through the Sectigo cross-sign under AAA Certificate Services. Because CT logs now reject these chains and none were logged before the block, it would carry no embedded CT timestamps and would not appear in any CT search. Look for the intermediates by name in certificate logs from network sensors.
# Zeek JSON logs: certificates whose subject or issuer is one of the six
# compromised TLS intermediates. Any hit after 17 October deserves a look.
jq -c 'select(((.["certificate.subject"] // "") + " " + (.["certificate.issuer"] // ""))
| test("CN=EM (DV|OV|EV) TLS CA - G3[BC]"))' x509.log
# The same check on the leaf issuer recorded per connection.
jq -c 'select((.issuer // "") | test("CN=EM (DV|OV|EV) TLS CA - G3[BC]"))
| {ts, "id.orig_h", "id.resp_h", server_name, issuer}' ssl.logCT cannot reveal a forged certificate used against a non-CT client, but it does answer whether you hold legitimate eMudhra certificates that need replacing, and it is worth keeping as a standing monitor for unexpected issuers on your domains.
# Lists the issuers of every logged certificate for your domain.
# For any eMudhra or emSign issuer, check whether the chain ends at
# emSign ECC Root CA - G3. Those certificates stop working in Chrome on 27 October.
curl -s 'https://crt.sh/?q=example.com&output=json' \
| jq -r '.[].issuer_name' | sort | uniq -c | sort -rnVersions that remove the distrusted root or block the compromised intermediates, as of 21 October 2026. Every row links to the project's own advisory, changelog or commit where one exists, and any newer version also contains the fix.
| Software | Fixed in | Source |
|---|---|---|
| Ubuntu 22.04, 24.04, 26.04, 26.10 (ca-certificates) | 20260816ubuntu0.22.04.1, 20260816ubuntu0.24.04.1, 20260816ubuntu0.26.04.1, 20260816ubuntu0.26.10.1 | USN-8944-1 |
| Ubuntu 14.04 to 20.04 ESM (ca-certificates) Also removes the Comodo AAA Services root. | 20230311~14.04.1~esm3, 202402031~16.04.1~esm3, 202402031ubuntu0.18.04.1+esm3, 20240203~20.04.1ubuntu0.1~esm2 | USN-8944-2 |
| Debian 12 bookworm (ca-certificates) | 20250419~deb12u2 | DLA-4845-1 |
| Debian 13 trixie (ca-certificates) | 20250419+deb13u1 | DSA-6572 |
| Debian unstable (ca-certificates) No fix for Debian 11 bullseye. | 20260816+nmu1 | Debian changelog |
| Fedora (ca-certificates) Stable on Rawhide. Fedora 43 to 45 updates were still in testing. | 2026.2.92_v9.0.319 | Fedora package spec |
| Arch Linux (ca-certificates-mozilla) | 3.131.1-1 | Arch package |
| Alpine Linux (ca-certificates) Available on 3.22 and later stable branches. | 20261020-r0 | aports commit |
| Chainguard (ca-certificates) | 20260909-r3 | Incident tracker |
| Gentoo (app-misc/ca-certificates) | 20260816.3.125 | Gentoo bug 984601 |
| GNU Guix | Commit 7608a99 | Incident tracker |
| FreeBSD ports (security/ca_root_nss) Covers the ports package, not the base system trust store. | 3.131.1 | ports commit |
| Homebrew (ca-certificates) | 2026-09-25_1 | homebrew-core #319674 |
| Software | Fixed in | Source |
|---|---|---|
| NSS | 3.131.1 | Mozilla Security Blog |
| curl CA bundle (cacert.pem) | 2026-10-20 | curl CA extract |
| Cloudflare cfssl_trust | 2026.10.1 | cfssl_trust #411 |
| Go GO-2026-6809, CVE-2026-111943. | 1.27.3, 1.26.10 | Go issue 82345 |
| Node.js Part of the October 2026 security releases. | 22.23.4, 24.22.1, 26.12.1 | Node.js #66871 |
| Electron | 44.9.1, 43.8.1, 42.11.16 | Electron #55126 |
| Bun Fixed on main after 1.4.3. | Not yet released | Bun #46300 |
| Java | Not yet released | Incident tracker |
| Python certifi | 2026.10.19 | certifi #440 |
| pip | 26.2.2 | pip changelog |
| uv | 0.13.4 | uv #22760 |
| pixi | 0.82.1 | Incident tracker |
| Rust rustls-webpki | 0.103.16 | webpki #546 |
| Rust webpki-roots, webpki-root-certs | 1.0.10 | webpki-roots #133 |
| Rustup | 1.29.2 | Incident tracker |
| PHP composer/ca-bundle | 1.4.16, 1.6.0 | ca-bundle 1.6.0 |
| Elixir castore | 1.0.22 | castore #90 |
| Erlang certifi | Not yet released | Incident tracker |
| Perl Mozilla::CA | 20261020 | Mozilla::CA changes |
The fixes take two forms. Go, rustls-webpki and Electron block the eight intermediates directly; Node.js does that and also updates its root store; every root bundle above drops emSign ECC Root CA - G3. Some updates, such as Debian's and Ubuntu ESM's, also remove AAA Certificate Services to cut off the Sectigo cross-signed path. If your software is not listed, check its release notes and run the live client test.
Install the vendor update where one exists. Where it does not yet, administrators can distrust the affected roots in the system trust store with these commands, run as root. They come from the incident tracker, which recommends them for expert users only. Test on one machine first.
sudo cp -p /etc/ssl/cert.pem /etc/ssl/cert.pem.bak &&
sudo awk '/^(###|===) /{skip=0}
/^=== .*\/CN=(AAA Certificate Services|emSign ECC Root CA - G3)$/{skip=1}
!skip' /etc/ssl/cert.pem.bak | sudo tee /etc/ssl/cert.pem > /dev/nullmacOS itself blocks the intermediates, but the built-in curl, git, python3, perl, ruby and openssl read /etc/ssl/cert.pem without checking revocation, and that file has not been updated. A later macOS update may restore it.
sed -i \
-e 's|^mozilla/emSign_ECC_Root_CA_-_G3.crt|!&|' \
-e 's|^mozilla/Comodo_AAA_Services_root.crt|!&|' \
/etc/ca-certificates.conf && update-ca-certificatesapk add ca-certificates &&
sed -i -e 's|^mozilla/emSign_ECC_Root_CA_-_G3.crt|!&|' \
/etc/ca-certificates.conf && update-ca-certificatesd=/etc/pki/ca-trust/source/blocklist; [ -d $d ] || d=/etc/pki/ca-trust/source/blacklist
trust extract --overwrite --format=pem-bundle \
--filter='pkcs11:object=Comodo%20AAA%20Services%20root;type=cert' \
$d/Comodo_AAA_Services_root.pem &&
trust extract --overwrite --format=pem-bundle \
--filter='pkcs11:object=emSign%20ECC%20Root%20CA%20-%20G3;type=cert' \
$d/emSign_ECC_Root_CA_-_G3.pem &&
update-ca-trustd=/etc/pki/trust/blocklist; [ -d $d ] || d=/etc/pki/trust/blacklist
trust extract --format=pem-bundle \
--filter='pkcs11:object=Comodo%20AAA%20Services%20root;type=cert' \
$d/Comodo_AAA_Services_root.pem &&
trust extract --format=pem-bundle \
--filter='pkcs11:object=emSign%20ECC%20Root%20CA%20-%20G3;type=cert' \
$d/emSign_ECC_Root_CA_-_G3.pem &&
update-ca-certificatestrust extract --format=pem-bundle \
--filter='pkcs11:object=emSign%20ECC%20Root%20CA%20-%20G3;type=cert' \
/etc/ca-certificates/trust-source/blocklist/emSign_ECC_Root_CA_-_G3.pem &&
update-ca-trustsecurity.pki.caCertificateBlacklist = [
"Comodo AAA Services root"
"emSign ECC Root CA - G3"
];cp /etc/ssl/certs/14bc7599.0 /usr/share/certs/untrusted/14bc7599.pem
cp /etc/ssl/certs/ee64a828.0 /usr/share/certs/untrusted/ee64a828.pem
certctl rehashcertctl untrust /usr/share/certs/mozilla/all/emSign_ECC_Root_CA_-_G3.pem &&
certctl untrust /usr/share/certs/mozilla/all/Comodo_AAA_Services_root.pemMicrosoft blocks the intermediates through Windows automatic certificate trust list updates, so machines that receive those updates need nothing else. For offline machines or ones with automatic updates disabled, the incident tracker publishes a PowerShell script that adds the eight intermediates and their cross-signs to LocalMachine\Disallowed. Read it before running it, and on managed devices leave the rollout to whoever manages them.
Removing AAA Certificate Services closes the cross-signed path on systems that still trust that root. Older clients may rely on it for other Sectigo chains, so roll the change out gradually and watch for new certificate errors.
The private keys of eight intermediate certificate authorities operated by eMudhra can be recovered by anyone from the public certificates alone. Six of the intermediates are for TLS and were trusted by the Apple, Chrome, Microsoft and Mozilla root programs. The other two are for code signing and were trusted by Microsoft. Chrome did not need to block those two, because it will not build a TLS path through a CA restricted to code signing.
Anyone holding one of the TLS keys could issue a certificate for any domain that a client trusting the chain would accept, which enables interception of TLS traffic. The same eight keys were also cross-signed by Sectigo under AAA Certificate Services, a root that Chrome and Mozilla had already dropped but Apple and Microsoft still trust.
Because the keys cannot be un-leaked, Mozilla and Chrome are also removing trust in the root these intermediates chain to, emSign ECC Root CA - G3. Every certificate issued under that root, including legitimate ones, stops working in those clients and has to be reissued.
A P-384 private key should be a random number of roughly 384 bits. According to Mozilla's analysis, each of the eight affected keys was a number below 256, so all of them can be found by trying 256 candidates. One key published after disclosure was the number 4. The keys came from a batch of 24 intermediates generated on 30 April 2025; the affected ones are all of the P-384 keys in the B and C series. Mozilla reported that it could not recover the P-384 keys in the other series.
eMudhra states that the keys were generated on FIPS 140-2 Level 3 hardware security modules, and that an approved deviation in the ceremony to test a wrap and unwrap step produced a second, weak set of keys. Because the key labels were similar, the weak keys were used by mistake to create the certificate requests, including the ones sent to Sectigo for cross-signing. eMudhra says it has not yet confirmed the exact root cause and will re-verify every key ceremony it has run.
Identify certificates by SHA-256 fingerprint rather than by name: names can be reused, fingerprints cannot. The TLS intermediates were issued by emSign Root TLS CA - G3 and the code-signing ones by emSign Root CS CA - G3. Each eMudhra fingerprint links to its crt.sh entry.
| Intermediate | Purpose | eMudhra-issued SHA-256 | Sectigo cross-sign SHA-256 |
|---|---|---|---|
| EM EV TLS CA - G3B | TLS | E7568FE6E12331F4FD7DE61DA4C7559D0F8EB192A218D4741A3BA75184333838 | 579480AEA166290BD3C643589E795FC0D0E54E86505D180F1DFF99EFD3199512 |
| EM OV TLS CA - G3B | TLS | 98B896625C0C230ADEEC3EB2CF6AAD5001ECF9156A68644E82374CE5833BC25B | 5F1DED4DD590AF74631290CF073B122A2AAC6A1FA479778A0BD43579BD832699 |
| EM DV TLS CA - G3B | TLS | 42C4ACCD12C4F59597925E1A08A7A90102608543809308D50EC427E118BA1493 | 45A883F349AEDFD5F3A649B5498FFB121712BA8B448F3F2A91DBC5A766FCDDBE |
| EM EV TLS CA - G3C | TLS | 432EC25F0D28DE9006D97BF752F17BBB2CD41F669933FCB072D9A1148D0261F3 | FD9D5C2DBBD4995AB69B8D50C439D9527B00529199C2FD01B2174EB58F07021F |
| EM OV TLS CA - G3C | TLS | CB6E15165AC802E9B3F993F16C25D41F4E81C21EBDE71AE1B012AC00BF9C7C3F | 7485B51C0ED192878FA1D2F948FB529AE1842CC5086C4B67F7BE5B2039DE9489 |
| EM DV TLS CA - G3C | TLS | 0164D7CEAE5BB909C272AF151FF44B1177AE9B47D9424B94F1D9558C30934D19 | 62B7F9868263F72F6911FC78CEAF72C1979158B7368BF648683BB2AA39B02E72 |
| EM OV CS CA - G3B | Code signing | 9E39DE2881273ACC225A149C72BA3E0F51424963669AB633EE1DC7DF5DB067B4 | A496E23AC0CAB8155FC9B117B97EAE368EFCBB9041AEC8804D5A308D2D01C2D8 |
| EM OV CS CA - G3C | Code signing | 4B2460A466F95FD40113BCDCCA2CEB29B3B093921DE45474DA7DF48874C630B1 | 84112972B8E59D14560AE7E7119654474AAD119990CF3722BFC1E3B91615E1FD |
Fingerprints are copied from the Mozilla incident record. Mozilla also publishes them as impacted-intermediates.json for trust store operators.
All times are UTC. eMudhra's own statements give later dates, which appear to be in India time and rounded.
2025-04-30
eMudhra creates the eight intermediates in a key generation ceremony. From this point the keys can be recovered by anyone.
2026-10-1718:05 UTC
An independent researcher reports the recovered keys to Apple, Google, Microsoft, Mozilla and eMudhra, with a signed proof for each key.
2026-10-1719:45 UTC
Chrome lands a CRLSet update that blocks the public keys of the six TLS intermediates, which also covers the Sectigo cross-signs.
2026-10-1720:06 UTC
The report reaches Mozilla's certificates address, forwarded by the Chrome Root Program.
2026-10-1721:48 UTC
Mozilla independently recovers the private keys, confirming the flaw.
2026-10-1722:59 UTC
Firefox's OneCRL blocklist update completes for all users on standard configurations.
2026-10-1809:24 to 09:38 UTC
eMudhra revokes all eight intermediates with reason cACompromise.
2026-10-19
Apple platforms block the intermediates. The issue is disclosed to downstream trust store operators.
2026-10-19
Sectigo completes revocation of the eight cross-certificates it had issued for the same keys.
2026-10-1922:00 UTC
Android devices receive an equivalent block through Google Play Services. The time is approximate.
2026-10-20
Microsoft ships blocks through Windows automatic certificate trust list updates.
2026-10-20
Mozilla ships Firefox 158.0.1, Firefox ESR 115.43.1 and 153.5.1, and NSS 3.131.1, which removes the root.
2026-10-20
Mozilla announces emergency removal of trust in emSign ECC Root CA - G3, Chrome commits to the same, and eMudhra stops issuing from every intermediate under that root.
2026-10-2108:29 UTC
Mozilla releases Firefox for Android 158.0.2 to fix clients that did not apply the bundled blocklist at startup.
2026-10-27
Planned: the Chrome Root Store update that removes emSign ECC Root CA - G3 reaches all devices, on Tuesday morning Pacific time.
The CA and the root programs describe the exposure differently. Both accounts are summarised with their sources.
eMudhra says
Incident update and press release
Mozilla and Google say
Both can be true. Unused intermediates still had keys anyone could use to sign certificates, and a forged certificate does not need the CA's infrastructure. Nobody has published evidence that this happened, and nobody can rule it out for clients that do not enforce Certificate Transparency.
Up-to-date browsers are protected. Firefox and Chrome blocked the intermediates on 17 October 2026, Apple platforms on 19 October and Microsoft platforms on 20 October. Chrome also notes that no certificate chaining to the six TLS intermediates was logged to Certificate Transparency before its block, so CT-enforcing browsers could not have accepted a forged certificate.
Anything that carries its own list of trusted certificates: the system ca-certificates package, container base images, and runtimes such as Go, Node.js, Python certifi, Rust webpki-roots and curl's CA bundle. Install the fixed versions, then rebuild images, because an image built before the fix keeps the old trust store.
Run curl against the test hosts published by the incident tracker, such as dv-g3b-emudhra.we-have-a-problem.com. A certificate error means the client no longer trusts the intermediates. Offline, scan each PEM bundle for emSign ECC Root CA - G3 and for the SHA-256 fingerprints of the eight intermediates and their cross-signs.
None have been reported. The keys could have been recovered since April 2025, and clients that do not enforce Certificate Transparency would not reveal an attack in public logs. Detection for those clients has to come from your own TLS telemetry and endpoints.
If they chain to emSign ECC Root CA - G3, replace them now with certificates from a different hierarchy. Mozilla has removed the root from NSS and Chrome removes it from the Chrome Root Store on 27 October 2026, after which those certificates stop working in Chrome.
Many clients cannot check revocation or block individual intermediates. Removing the root that the intermediates chain to is the only way to protect them, so Mozilla and Chrome chose emergency removal of emSign ECC Root CA - G3.
Only on Windows, where they were trusted for code signing. eMudhra states they never issued a certificate, and Microsoft has shipped blocks for them. Treat any signature that chains through either of them as untrusted.