English / 日本語(要約)

eMudhra Intermediate CA Compromise

20th October 2026

The private keys of eight eMudhra intermediate CA certificates have been compromised. They chain to roots trusted by the Mozilla, Microsoft, Apple and Chrome root programs and by many downstream trust stores.

Root programs are run by operating system and browser vendors to vet certificate authorities and decide which ones their products trust. Trust stores are the lists of trusted root certificates that operating systems, browsers, language runtimes, libraries and applications use to verify certificates, and many are based on the root programs' lists.

How do we know?

To demonstrate that the keys are compromised, the original reporter Wayne signed the following message with the private key of each of the eight intermediate CAs and reported it to the Root Program Teams on the 17th of October:

We have a problem here - Wayne

proof.zip contains the message, and for each intermediate the certificate, its public key and a signature on the message. To verify with OpenSSL:

openssl x509 -in EM-DV-TLS-CA-G3B.crt.pem -noout -pubkey | diff - EM-DV-TLS-CA-G3B.pub.pem
openssl dgst -sha384 -verify EM-DV-TLS-CA-G3B.pub.pem -signature EM-DV-TLS-CA-G3B.sig message.txt

What actions have been taken?

The root programs and many downstream trust stores have taken action to protect their users. The certificates have been blocked in Firefox and Chrome since the 17th of October, on Microsoft platforms since the 20th and on Apple products since the 22nd.

The issue was responsibly disclosed to downstream trust stores on the 19th of October. Many have already released updates or are in the process of releasing updates.

What are the consequences?

An attacker with the private key of any of the compromised intermediate CAs could impersonate any website or service.

This has already been remediated by Mozilla, Microsoft, Apple, and Chrome for their users through their tools for distributing revocation information such as OneCRL, CRLite and CRLSets.

The CA has also revoked the compromised intermediate certificates. However, many other clients do not consume revocation information and require software updates to ensure they no longer trust the compromised intermediates. These include applications and libraries that ship their own CA bundle, and apps built on Electron, such as Slack and Discord. Electron apps only pick up Electron's fix once they are updated to a version built on a patched Electron release. Updating the operating system or browser may not be enough for these clients.

Does your client still trust the compromised intermediates?

Intermediate CAChains toResult

A ✅ only means that the connection failed. Browsers do not tell the page why, so a network problem looks the same as a rejected certificate. To double-check, open the link in that row: if it loads without a warning page, the browser is vulnerable.

On 22nd October 2026, two chains marked No CT were added. Their leaf certificates were never logged to Certificate Transparency (CT), so clients that enforce CT reject them even if they still trust the intermediate. A successful connection to these hosts means the client trusts the compromised intermediates and does not enforce CT. As described below, these are the clients that can be attacked without anyone noticing.

To check curl or other command-line clients, run:

curl https://dv-g3b-emudhra.we-have-a-problem.com/
curl https://dv-g3b-aaa-emudhra.we-have-a-problem.com/

A certificate error means the client does not trust the compromised intermediates. To check whether the client also accepts certificates that were never logged to CT, run:

curl https://dv-g3b-noct-emudhra.we-have-a-problem.com/
curl https://dv-g3b-aaa-noct-emudhra.we-have-a-problem.com/

Most browsers enforce CT, but many non-browser clients, including curl, do not which places them at greater risk.

To check a trust store offline, chains.zip contains the certificate chain served by each of the fourteen hosts above in PEM format, with instructions for verifying them with OpenSSL.

What is known about the cause?

The private keys for the intermediate certificates were incorrectly generated by the CA. This means that anyone can recover them from the certificates.

This would have been possible since the certificates were created in April 2025. There are no entries in the certificate transparency logs for these intermediates in that period, indicating that CT-enforcing clients like Firefox, Chrome, Edge and Safari could not have been attacked.

However, many clients outside of the browser ecosystem do not enforce Certificate Transparency. We do not know if attackers exploited the flawed key generation to target these clients.

Further technical information about the cause is captured in the initial incident report in Mozilla's bug tracker.

Which clients aren't yet patched?

The servers behind the checker record how many times each user-agent connects successfully, meaning it still trusts the compromised intermediates. Only these counts are recorded. See the user-agent statistics.

A JSON dump with more detail, including counts for each JA4 fingerprint, is also available.

Which intermediates were compromised?

impacted-intermediates.json lists the eight intermediates and their Sectigo cross-signs. roots.json lists the roots they chain to.

What actions can trust store operators take?

Please see this thread in Mozilla's dev-security-policy forum.

What actions can users take?

Users should update their browsers and operating systems to the latest versions as soon as possible.

Who has patched?

Pending entries are listed at the end of each group.

Operating systems and distributions

SoftwarePatched version
Alpine Linux ca-certificates20261020-r0
Arch Linux ca-certificates-mozilla3.131.1-1
Chainguard ca-certificates20260909-r3
Debian ca-certificates20250419~deb12u2,
20250419+deb13u1,
20260816+nmu1
Devuan ca-certificatesSame as Debian
Fedora ca-certificates2026.2.92_v9.0.319
FreeBSD ca_root_nss1.131.1
FreeBSD caroot15.1-RELEASE-p6,
14.5-RELEASE-p3,
14.4-RELEASE-p12
Freedesktop SDK25.08.19,
26.08.3
Gentoo ca-certificates20260816.3.125
GNU Guix7608a99
Homebrew ca-certificates2026-09-25_1
OmniOS web/ca-bundler151054by,
r151056ay,
r151058y
OpenBSDcurrent
8.0
7.9
Oracle Linux ca-certificates2025.2.80_v9.0.304-80.2.0.1.el8_10,
2025.2.80_v9.0.305-91.0.1.el9,
2025.2.80_v9.0.305-102.0.1.el10_2
RHEL ca-certificatesPending for RHEL 7,
2026.2.92_v9.0.319-81.3.el8_10,
2026.2.92_v9.0.319-90.3.el9_8,
2026.2.92_v9.0.319-100.3.el10_2
Ubuntu ca-certificates20260816ubuntu0.22.04.1,
20260816ubuntu0.24.04.1,
20260816ubuntu0.26.04.1,
20260816ubuntu0.26.10.1
Bottlerocketpending

Root store bundles and libraries

SoftwarePatched version
Cloudflare CFSSL trust store2026.10.1
curl CA bundle2026-10-20
Elixir castore1.0.22
NSS3.131.1
Perl Mozilla::CA20261020
Python certifi2026.10.19
Rust rustls-webpki0.103.16
Rust webpki-roots / webpki-root-certs1.0.10
Composer ca-bundle1.4.16, 1.6.0
Erlang certifi2.18.0
Ruby excon1.8.0

Language runtimes

SoftwarePatched version
Bun1.4.4
Deno2.9.8
Electron44.9.1,
43.8.1,
42.11.16
Go1.27.3,
1.26.10
JavaOpenJDK | Oracle JDK
Node.js26.12.1,
24.22.1,
22.23.4
Python3.15.1,
3.14.9,
3.13.17

Applications and tools

SoftwarePatched version
ArgoCD3.3.18, 3.4.12, 3.5.6, 3.6.0-rc4
Claude Code2.1.303
Conda26.9.4
Docker Desktop4.96.2
Docker Engine29.9.2
Docker cli29.9.2
Git for Windows2.56.0.3
mise2026.10.17
Obsidian1.14.5
pip26.2.2
pixi0.82.1
pypi-publish GitHub Action1.14.3
Rustup1.29.2
uv0.13.5
Visual Studio Code1.143.1
Godotpending
GitHub CLI2.102.1

Add more at github.com/galadran/we-have-a-problem.com.

Are there workarounds until patches are available?

macOS curl, git, and Python

macOS blocks the compromised intermediates, but the built-in curl, git, python3, perl, ruby, and openssl verify certificates against /etc/ssl/cert.pem without checking revocation, and that file has not been updated. To remove the affected roots from it, run:

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/null

The built-in pip3, and the pip in virtual environments created from the built-in python3, use their own outdated copy of the roots instead. To make them use the fixed system file, run:

F="$(/usr/bin/python3 -c 'import sysconfig; print(sysconfig.get_path("stdlib"))')/sitecustomize.py" &&
echo 'import os; os.environ.setdefault("PIP_CERT", "/etc/ssl/cert.pem")' | sudo tee -a "$F" > /dev/null &&
sudo chmod 644 "$F"

For nix-darwin users, please additionally follow NixOS instructions.

Linux

Until a distribution ships an updated ca-certificates package, expert users can distrust the affected roots in the system trust store. This is NOT recommended for ordinary users.

On Debian and Ubuntu, run as root:

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-certificates

If you use the Java certificate store, it might fall out of sync with your system certificate store. To sync the stores, run as root:

touch /var/lib/ca-certificates-java/fresh
dpkg-reconfigure ca-certificates-java

On Alpine, run as root:

apk add ca-certificates &&
sed -i -e 's|^mozilla/emSign_ECC_Root_CA_-_G3.crt|!&|' \
  /etc/ca-certificates.conf && update-ca-certificates

On Fedora, RHEL, CentOS Stream, Rocky Linux, AlmaLinux and Amazon Linux 2023, run as root:

d=/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-trust

On openSUSE and SLES, run as root:

d=/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-certificates

On Arch Linux, run as root:

trust 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-trust

On NixOS, add to your configuration:

security.pki.caCertificateBlacklist = [
  "Comodo AAA Services root"
  "emSign ECC Root CA - G3"
];

Windows

Microsoft has shipped blocks for these certificates through Windows' automatic certificate trust list updates. Machines that receive these updates don't need this workaround. This script lets administrators block the compromised certificates locally on machines that do not, for example those that are offline or have automatic updates disabled.

This mitigation is not recommended for enterprise-managed devices. Your IT department will manage the rollout; contact them before applying local changes.

Download and inspect Block-EmudhraCompromisedCA.ps1 from the GitHub repository linked in the footer, then run it from an elevated PowerShell terminal. Requires PowerShell 5.1 or later and the built-in Windows PKI module. This command bypasses execution policy for this process only; it does not change the machine's policy. Organization-enforced policies may still prevent execution.

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Block-EmudhraCompromisedCA.ps1

The script imports its 16 compromised intermediates and cross-signs into LocalMachine\Disallowed (Untrusted Certificates).

This mitigation applies to clients using the Windows operating system certificate trust stores and chain validation (including Schannel TLS and Authenticode). It adds blocks to Untrusted Certificates without modifying Trusted Root Certification Authorities. Applications using independent CA bundles still need their own updates.

Android

Many Android devices have automatically received an update blocking the affected certificates via the Google Play services update channel.

On devices that have not received the updated blocklist, users may be able to disable the affected roots in the system trust store. Open Settings and search for Trusted credentials, which is often found under Security, then Encryption & credentials. In the System tab, tap each of the following certificates and choose Disable:

The other eMudhra and Comodo certificates in the list are not affected and should be left enabled. Disabling AAA Certificate Services may cause errors on some websites that still chain to it. The roots can be re-enabled from the same screen once the device has received an update.

Some Android devices (e.g. Huawei's HarmonyOS) may not allow users to disable system-installed roots.

NetBSD

On NetBSD 10 and later, run as root:

certctl untrust /usr/share/certs/mozilla/all/emSign_ECC_Root_CA_-_G3.pem &&
certctl untrust /usr/share/certs/mozilla/all/Comodo_AAA_Services_root.pem

FreeBSD

On FreeBSD 14 or later, run the following commands as root:

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 rehash

Site published by Dennis Jackson. This site is the work of many contributors from the community. The source is on GitHub and PRs are welcome. Licensed under the Apache License, Version 2.0.