eMudhra CA Compromise

eMudhra CA Compromise: What Cloud Security Teams Need to Know

eMudhra CA Compromise: What Cloud Security Teams Need to Know

Book A Demo
See how Upwind uses runtime context to turn cloud security fingdings into real-time protection.
Book a Demo

Executive summary

On October 17, a researcher reported control of eight eMudhra intermediate certificate authority private keys. Mozilla independently recovered the keys and confirmed that their generation was flawed.

The technical finding is severe: the affected P-384 private keys were integers below 256, making them trivially recoverable from public information. Describing this simply as a key leak understates the problem. These keys were inherently weak, so defenders should assume that anyone could have derived them. 

An attacker holding an affected TLS intermediate key could create fraudulent certificates for services they do not control. If the attacker can intercept or redirect a connection, and the client still accepts the affected certificate chain, they could impersonate the destination and potentially read or modify traffic.  In cloud environments the impact can go further: services that accept client certificates as proof of identity could accept a forged one.

Browsers are already protected. Most server-side software is not: it does not check revocation and keeps trusting the affected chains until its trust bundle or runtime is updated. Many of those fixes have no formal advisory, so vulnerability scanners may not flag them.

What was compromised?

The incident affects eight intermediate CA keys: six associated with TLS certificate issuance and two with code signing. The affected intermediates also have Sectigo cross-signed certificates, creating additional certificate paths using the same keys. In total, 16 certificates use the eight compromised keys.

An intermediate CA sits between a trusted root and the certificates issued to individual services:

Trusted root CA → Intermediate CA → Service certificate

Compromising an intermediate’s private key undermines the trust placed in certificates it can sign. The signature on a fraudulent certificate can be mathematically valid even though the service identity is false.

This does not mean an attacker can automatically decrypt every HTTPS connection. Exploitation still depends on reaching the victim’s traffic and encountering a client that accepts the compromised chain.

How do the keys reach trusted roots?

Because of the cross-signs, the affected intermediates reach widely trusted roots through two paths:

  • Sectigo “AAA Certificate Services”: Mozilla and Chrome have removed it, but it is still trusted by Apple and Microsoft and is present in many older Linux and language CA bundles.
  • “emSign ECC Root CA – G3”: included in all four major root programs (Mozilla, Chrome, Apple, Microsoft). The disclosure data lists it as a cross-signer of eMudhra’s issuing roots.

This explains why an image with a reasonably recent CA bundle can still be exposed, and it tells teams exactly which roots to look for in their trust stores.

Is code signing affected?

Two of the eight keys belong to code-signing CAs (“EM OV CS CA – G3B” and “EM OV CS CA – G3C”), which chain to roots in Microsoft’s store. Someone holding these keys could sign software that Windows treats as coming from a verified publisher. Windows servers, virtual machines and endpoints are therefore in scope, not only TLS clients.

Is it being exploited? 

We found no verified list of attacker IPs or domains in the published material.The disclosure website and public test endpoints should not be labeled attacker infrastructure merely because they demonstrate the issue.

As of October 20, Certificate Transparency (CT) logs, the public record of every publicly trusted TLS certificate, contain no end-entity certificates issued by any of the eight compromised intermediates; only the intermediate certificates themselves are logged. Blocking these chains therefore breaks no legitimate public site. An attacker may not log a forged certificate, and most non-browser clients do not require CT, so this does not rule out unlogged use.

Can a forged certificate grant cloud access?

Several cloud services accept a client certificate as proof of identity, and trust a CA bundle that the customer configures. If that bundle includes an affected root or intermediate, a forged client certificate could be accepted as a legitimate identity:

  • AWS IAM Roles Anywhere trust anchors and GCP workload identity federation with X.509: a forged certificate could be exchanged for cloud credentials.
  • mTLS on load balancers and API gateways: AWS ALB trust stores, API Gateway custom domains, Azure Application Gateway, GCP load balancers with TrustConfig.
  • Device and network access: AWS IoT and Azure IoT Hub CA registrations, AWS Client VPN, Azure point-to-site VPN root certificates.

These configurations are worth reviewing even where no workload trusts the chain for outbound connections, because a forged client certificate gives an attacker direct access.

Does revocation protect my servers?

eMudhra has revoked the affected intermediates, and browsers enforce that through their own mechanisms: Mozilla OneCRL and CRLite, Chrome CRLSets, and Apple’s equivalent. Mozilla completed its emergency OneCRL rollout for standard Firefox configurations on October 17. Its October 20 releases extend protection to configurations that may have missed that update, while NSS 3.131.1 removes the signing root from its trusted list. 

Most non-browser TLS clients do not check revocation by default. That includes OpenSSL-based tools such as curl, Python, Go, Java and Node.js. For these clients, a revoked intermediate stays trusted until the trust bundle or the runtime itself is updated. The revocation is real, but it does not protect most server-side workloads.

Are my containers affected? 

Cloud applications have a different update path from browsers and operating systems.

Go addressed the incident by changing crypto/x509 to reject chains containing the affected public keys. The change is tracked as CVE-2026-111943. Updating the Go installation on a build host does not change an already deployed executable; applications need to be rebuilt with a fixed toolchain and redeployed. 

Python applications may use certificate bundles distributed through their dependencies. The Python security announcement explicitly recommends upgrading affected packages and rebuilding container images to refresh system certificates.  pip is a special case: it always loads its own bundled copy of certifi in addition to the system store, so versions below 26.2.2 keep trusting the affected chains even after the operating system is fixed. Every virtual environment has its own pip and certifi.

Serverless functions follow the same logic. Deployment packages and layers often bundle certifi or another CA bundle, and they keep using it until the function is rebuilt and redeployed.

The operational implication is straightforward: a patched host does not establish that every application inside its containers uses updated trust decisions.

Where should I look? 

A single workload can draw trusted roots from several places at once. Checking only the operating system bundle misses most of them:

  • Operating system bundles: /etc/ssl/certs/ca-certificates.crt, /etc/pki/ca-trust/, /etc/ssl/cert.pem, plus any local distrust lists.
  • Python: certifi’s cacert.pem in every virtual environment, and pip’s bundled copy.
  • Java: the JDK’s cacerts keystore.
  • Root lists compiled into binaries: Node.js, Bun, Electron, Rust webpki-roots, and Go programs that embed x509roots/fallback. These cannot be fixed by updating a file; the binary must be updated or rebuilt.
  • Language and framework bundles: PHP composer/ca-bundle, Elixir castore, curl’s cacert.pem.
  • Configuration that redirects trust: environment variables such as SSL_CERT_FILE, REQUESTS_CA_BUNDLE, NODE_EXTRA_CA_CERTS and PIP_CERT, and Java’s javax.net.ssl.trustStore property.
  • Windows certificate stores on servers and virtual machines, including the Disallowed store used to block certificates.

For each workload, the question is which of these stores the running process actually uses.

Will my scanner catch it? 

Most vulnerability scanners compare package versions against advisory databases. Coverage for this incident is partial and arrived late:

  • Only a few fixes have formal advisories: certifi, uv, and the Rust webpki crates. Some appeared only on October 20, and some are published only in databases that common scanners do not read.
  • Many fixes have no advisory at all, including Ubuntu and Alpine ca-certificates, pip, Go and Electron.
  • Some platforms have no fix yet: Debian stable, Fedora and RHEL, Node.js and Bun.
  • pip’s bundled copy of certifi does not appear as a separate package in an SBOM, so it cannot be matched on its own.
  • Trust stores edited by hand, and root lists compiled into binaries, have no package version to match.

A clean scan is therefore not evidence of a clean environment. Teams should check package versions against the fixed versions in the remediation table below, and check trust bundles directly for the affected roots and intermediates.

How do I find exposed workloads?

Security teams should separate two questions:

QuestionEvidence needed
Could this workload accept a compromised chain?Runtime version, effective trust bundle, application configuration, and applicable certificate blocks
Has this workload encountered an affected chain?Certificate-chain telemetry associated with a process and connection

Start by mapping application dependencies and deployed binaries to running workloads. Include system certificate bundles, application-specific bundles, and embedded runtimes. Prioritize applications handling credentials, sensitive API traffic, package downloads, or software updates.

CI runners and build pipelines deserve to go first. A forged certificate presented to a package download or a container registry pull becomes a software supply-chain compromise, not a single intercepted session.

An outdated package is a useful investigation lead. Determining exposure requires understanding which trust configuration the application actually uses.

How do I fix and verify? 

  • Go: Upgrade to Go 1.27.3 or 1.26.10, or a later supported release, then rebuild and redeploy affected applications. Programs that embed golang.org/x/crypto/x509roots/fallback should also update that module.
  • Python: The published announcement recommends at least certifi 2026.10.19, pip 26.2.2, uv 0.13.4, and sigstore 4.5.1. Update affected environments and rebuild images. Upgrade pip and certifi inside every virtual environment, not only the system Python.
  • Operating system images: update ca-certificates and rebuild images. Where the distribution has not shipped a fix yet (Debian stable, Fedora and RHEL at the time of  writing), remove trust in the affected roots manually or block the affected intermediates.
  • Cloud trust configuration: remove the affected roots and intermediates from mTLS trust stores, Roles Anywhere trust anchors, workload identity providers, IoT CA registrations and VPN root certificates.
  • Other workloads: Follow runtime and distribution advisories, accounting for custom trust stores and application-specific certificate handling.
  • After deployment: Verify that the application’s effective TLS verifier rejects affected chains. To check from inside a workload, run curl https://dv-g3b-emudhra.we-have-a-problem.com; it should fail certificate validation. Also test https://dv-g3b-aaa-emudhra.we-have-a-problem.com, which serves the chain through the Sectigo cross-sign, so both trust paths are covered. Run the test with the application’s own runtime, not curl from the host: curl uses its own trust bundle, which may differ from the one the application loads.

Fixed versions, verified against distribution and package registries on October 21, 2026. Entries marked “No fix yet” change daily; recheck on the day of publication.

PlatformPackageFixed version
Ubuntu 22.04 / 24.04 / 26.04 / 26.10ca-certificates20260816ubuntu0.22.04.1 / 0.24.04.1 / 0.26.04.1 / 0.26.10.1
Alpine 3.20 to 3.23, edgeca-certificates20261020-r0
Debian 12 / 13ca-certificatesNo fix yet (unstable: 20260816+nmu1)
Fedora / RHELca-certificatesNo fix yet
Wolfi / Chainguardca-certificates20260909-r3
Arch Linuxca-certificates-mozilla3.131.1-1
Gentooapp-misc/ca-certificates20260816.3.125
Mozilla NSSnss3.131.1
Pythoncertifi / pip / uv / sigstore2026.10.19 / 26.2.2 / 0.13.4 / 4.5.1
Gotoolchain (rebuild required)1.26.10 / 1.27.3
Gogolang.org/x/crypto/x509roots/fallbackv0.0.0-20261020153306-9f2b28d4331a
Rustrustls-webpki / webpki-roots / webpki-root-certs0.103.16 / 1.0.10 / 1.0.10
Electronelectron42.11.16 / 43.8.1 / 44.9.1
PHPcomposer/ca-bundle1.4.16 / 1.6.0 (the 1.5.x line has no fix)
Elixircastore1.0.22
Node.js, Bunbuilt-in root storeNo fix yet
JavacacertsNo vendor statement found

The eMudhra incident makes certificate trust an immediate cloud security concern. Effective response requires connecting the affected trust material to the applications that use it, the workloads running those applications, the cloud services configured to trust it, and the network activity that determines their exposure.

Appendix

Indicators of Compromise 

The published indicators identify compromised CA certificates and keys. They are useful for hunting and exposure assessment, but a match alone does not establish that a workload was attacked.

The disclosure provides these reference datasets:

Certificate SHA-256 Fingerprints

The following fingerprints identify all 16 affected certificates: the eight originals listed in Mozilla’s incident record and their eight Sectigo cross-signs.The following fingerprints identify the eight original intermediate certificates listed in Mozilla’s incident record. This table does not include the additional cross-signed certificates. Use the linked inventory and dataset for that coverage.

Intermediate certificateSHA-256 certificate fingerprint
EM EV TLS CA – G3BE7568FE6E12331F4FD7DE61DA4C7559D0F8EB192A218D4741A3BA75184333838
EM OV TLS CA – G3B98B896625C0C230ADEEC3EB2CF6AAD5001ECF9156A68644E82374CE5833BC25B
EM DV TLS CA – G3B42C4ACCD12C4F59597925E1A08A7A90102608543809308D50EC427E118BA1493
EM EV TLS CA – G3C432EC25F0D28DE9006D97BF752F17BBB2CD41F669933FCB072D9A1148D0261F3
EM OV TLS CA – G3CCB6E15165AC802E9B3F993F16C25D41F4E81C21EBDE71AE1B012AC00BF9C7C3F
EM DV TLS CA – G3C0164D7CEAE5BB909C272AF151FF44B1177AE9B47D9424B94F1D9558C30934D19
EM OV CS CA – G3B9E39DE2881273ACC225A149C72BA3E0F51424963669AB633EE1DC7DF5DB067B4
EM OV CS CA – G3C4B2460A466F95FD40113BCDCCA2CEB29B3B093921DE45474DA7DF48874C630B1
EM EV TLS CA – G3B (Sectigo cross-sign)579480AEA166290BD3C643589E795FC0D0E54E86505D180F1DFF99EFD3199512
EM OV TLS CA – G3B (Sectigo cross-sign)5F1DED4DD590AF74631290CF073B122A2AAC6A1FA479778A0BD43579BD832699
EM DV TLS CA – G3B (Sectigo cross-sign)45A883F349AEDFD5F3A649B5498FFB121712BA8B448F3F2A91DBC5A766FCDDBE
EM EV TLS CA – G3C (Sectigo cross-sign)FD9D5C2DBBD4995AB69B8D50C439D9527B00529199C2FD01B2174EB58F07021F
EM OV TLS CA – G3C (Sectigo cross-sign)7485B51C0ED192878FA1D2F948FB529AE1842CC5086C4B67F7BE5B2039DE9489
EM DV TLS CA – G3C (Sectigo cross-sign)62B7F9868263F72F6911FC78CEAF72C1979158B7368BF648683BB2AA39B02E72
EM OV CS CA – G3B (Sectigo cross-sign)A496E23AC0CAB8155FC9B117B97EAE368EFCBB9041AEC8804D5A308D2D01C2D8
EM OV CS CA – G3C (Sectigo cross-sign)84112972B8E59D14560AE7E7119654474AAD119990CF3722BFC1E3B91615E1FD

How do I match on public keys? 

For runtime rules, match SHA-256 hashes of the DER-encoded SubjectPublicKeyInfo (SPKI) in certificate chains. Public-key matching can identify the same compromised key across different certificates, including cross-signed versions. Go uses this approach in its mitigation. 

Each original intermediate and its cross-sign share one key, so these eight values cover all 16 certificates. The Subject Key Identifier is also listed: any certificate whose Authority Key Identifier equals one of these values was issued by a compromised CA.

IntermediateSPKI SHA-256Subject Key Identifier
EM EV TLS CA – G3BE0254C7FCDC265E2F0F8A428DABB75AB4AE039B4872D62F5EE57F0877D5A8A413EDC20D9894698877B873FD88147B25C15D84706
EM OV TLS CA – G3B43BFFA19D6EF651451F6841E019931E96F6F2EAEFF28AB4B6F1CE4576DE2717B9BD86551AFE7E72C37AD08EE6919D9BF3784AE0A
EM DV TLS CA – G3BEBED6475C2C2D80FCB199F3FE8DD6E6B3CE60B77EB15D4E42C3DEC0C6F5B5105E21E2FE71C19390E554B62C120245735248A2514
EM EV TLS CA – G3C5C0660A2B164910D8FF589C18E14552E9E0EC237DCEFE2CB736D41A4811F81A0A6255E80A94DB7F3967C1BC791DF92BCEE4BEB5F
EM OV TLS CA – G3C63ECEFEE431D49523BC1136C4E72D0206A477086CAF606CD5CF025686C109CF834EAEA0CEBC90ADAF9D0C5E2ED9B78C9879E1B6C
EM DV TLS CA – G3C49DD353DC2B919A3770645117D0E60C16115E7D1BC259EEFE734B00EA434FE5FAE7E105C3C2996C1A847270559F1E03DD4E50AF3
EM OV CS CA – G3BEC4FFA1AD0AC88081314B7AAFFEF6A91F97CD57291BB5BA686C5415F5EB4F6B679FAE8ECCFDB0D758DA458D69FB6EDDC7C49DEE6
EM OV CS CA – G3C92C063D67E8F14DB71D288E11266FFDAF69CBF115F7BAB14F3BC2F68D25E0E30EE6F73298D6FBFA7B31BC39534F61556447866B7

Conceptually:

IF a peer certificate chain contains a compromised SPKI hash

THEN alert with workload, process, destination, and validation result

An accepted affected chain warrants urgent investigation. A rejected chain records an encounter that was blocked. Neither outcome alone establishes malicious activity; responders need destination, workload, and connection context.

This rule requires certificate-chain visibility from suitable TLS instrumentation or a TLS-aware proxy. Ordinary network-flow logs are insufficient. Passive network inspection cannot normally read the encrypted certificate portion of a TLS 1.3 handshake.

Root Certificates in the Trust Path

Finding one of these roots in a trust store is an exposure-assessment lead, not evidence of compromise. A store is exposed if it trusts one of these roots and does not separately block the affected intermediates.

RootOperator and root programsSHA-256 fingerprint
emSign Root TLS CA – G3eMudhra; trusted by Microsoft7DD78D5F4F13459A83DFF9ABBBA62EDBAF6F2D102BF257FD712F4D9F2746ED8D
emSign Root CS CA – G3eMudhra; trusted by MicrosoftF2EDAAFF3D9B701FB4D14C9F285F8C0BAD90FC3BCC1FA07D47F4718EDABA34A5
AAA Certificate ServicesSectigo; trusted by Apple, MicrosoftD7A7A0FB5D7E2731D771E9484EBCDEF71D5F0C3E0A2948782BC83EE0EA699EF4
emSign ECC Root CA – G3eMudhra; trusted by Apple, Chrome, Microsoft, Mozilla86A1ECBA089C4A8D3BBE2734C612BA341D813E043CF9E8A862CD5C57A36BBE6B
Contents
Add the Upwind RSS Feed to Slack
Connect the Upwind RSS Feed to your Slack.
Follow the how-to here.
Threat RSS
Add the Upwind RSS Feed to Slack
Connect the Upwind RSS Feed to your Slack.
Follow the how-to here.
Main RSS