eMudhra October 2026 · from first principles

The key
was 4.

How weak keys at one certificate authority could have let anyone pretend to be any website, and how the internet fixed it in 72 hours.

CA private key · P-384expected
4
One of eMudhra's real certificate-authority private keys.
The story in one picture

Every padlock in your browser rests on secret numbers.

A certificate authority's secret key should be a random number like this (116 digits):

27324745105062160777777349260269379510652796200558944916836847314423835404913747899415477564513305416868158069038732

In October 2026, someone found that one of eMudhra's secret keys was:

4

That is not a typo. Let's build up, from zero, why this one number put the whole web at risk.

The route

Five steps from "what is a key?" to "the key was 4"

1

Talking in public

Secret keys, public keys and signatures

2

Who are you, really?

Certificates and certificate authorities

3

The handshake

What happens in the first milliseconds of every HTTPS connection

4

The key was 4

What eMudhra got wrong, and what an attacker could do with it

5

The cleanup

How Chrome, Firefox, Apple, Microsoft and open-source software un-trusted the keys

1

Talking in public

Before certificates, we need three ideas: a shared secret, a key pair, and a signature.

1 Talking in public

Your message travels through many strangers' hands

Youlaptop / phone
Café Wi-Fihotspot
Fake Wi-Fi"Free_Airport_WiFi"
Your ISPinternet provider
Backbonecables, exchanges
Hosting networkdata centre
bank.comserver
PIN = 4821
can read
can copy
can change
can record

The internet is a chain of machines that pass your data along, like a bucket brigade.

Your message hops from machine to machine before it reaches the bank.

Every machine on the path can read it, copy it, or change it.

And any one of them could be an attacker. You cannot see which.

1 Talking in public

So a safe conversation needs three things

Secrecy

Nobody on the path can read the message.

Integrity

Nobody can change the message without being caught.

Identity

You are talking to the real bank, not someone pretending to be the bank.

Encryption gives the first two. Certificates give the third. eMudhra's mistake broke the third, for every website.

1 Talking in public

Idea 1: one shared key that locks and unlocks

You
bank.com
Malloryon the path
shared key
same key
HELLO
X7#qL·9!
I see only: X7#qL·9!
HELLO
key in transit
Mallory's copy

You and the bank both hold the same secret key.

The key scrambles your message into nonsense.

Mallory sees only nonsense on the wire.

The bank uses the same key to unscramble it. This is fast and strong.

But how did the bank get the key? It had to travel over this same wire…

…and Mallory copied it. To share a secret safely, you first need a secret. Chicken and egg.

1 Talking in public

Idea 2: a key pair. Give away padlocks, keep the key.

You
bank.com
Mallory
private key
never leaves
public key
open padlock
your copy
Mallory's copy
locked box
My padlock can close boxes. It cannot open them.
HELLO

The bank makes two linked keys: a private key it keeps, and a public key that works like an open padlock.

It hands copies of the padlock to anyone who asks. Even Mallory. That is fine.

You put your message in a box and snap the bank's padlock shut.

The box crosses the wire. Mallory's padlock copy cannot open it.

Only the private key opens it. Public key locks; private key unlocks.

1 Talking in public

The same key pair can also sign

Message
"Send ₹5,000 to account 12349999."
— from www.bank.com
The bank stamps the message with its private key. Only the private key can make this exact stamp.
✓You check the stamp with the bank's public key. It matches: the bank wrote this, and nobody changed it.
✗Mallory changes one number. The old stamp no longer matches the new text, so the check fails.
✗Mallory cannot make a new stamp, because she does not have the bank's private key.
Remember this. If Mallory ever gets the private key, she can sign anything, and every check will say ✓.

A signature proves who wrote something. The proof is only as safe as the private key.

1 Talking in public

Why is a key pair "easy one way, hard the other way"?

count
0

A toy clock with 30 spots

Real keys use points on an elliptic curve. This toy works the same way, just much smaller.

The rule

Count 1 is the white spot 3. Each jump: multiply by 3, then wrap around 31.
3 → 9 → 27 → 19 → 26 → …

Everyone knows the start spot and the rule. They are public.

Private key = the count

I secretly pick a count of 7.
After 7 counts I land on spot 17.

Private key: 7
Public key: 17

Forward is easy

Knowing 7, finding 17 is quick. Computers have shortcuts (double, double, add), so even a 116-digit count takes well under a millisecond.

Backward is hard

Someone sees only 17. What was the count? The spots look random, so the only way is to try:

1 → 35 → 262 → 96 → 163 → 277 → 17 ✓4 → 19

That is the whole trick

With 30 spots, trying them all takes a second.

A real P-384 curve has about 39,402,006,196,394,479,212,279,040,100,143,613,805,079,739,270,465,446,667,946,905,279,627,659,399,113,263,569,398,956,308,152,294,913,554,433,653,942,643 spots.

1 Talking in public

How big is "impossible to guess"?

Log scale · bar length = number of digits
Seconds since the Big Bang
4 × 1017
Grains of sand on Earth
≈ 1019
Atoms in your body
7 × 1027
Atoms in the observable universe
≈ 1080
Possible P-384 private keys
3.9 × 10115
eMudhra's 8 keys
fewer than 256 (2.4 digits)

If every atom in the universe were a computer guessing a billion keys a second since the Big Bang, together they would still not finish.

Unless the key is a small number. Then a laptop finishes before you blink.

2

Who are you, really?

Encryption hides the message. It does not tell you who is on the other end.

2 Who are you?

The problem: whose padlock is this?

You
Malloryin the middle
bank.com
Bank, please send me your padlock.
bank's padlock
"bank's" padlock
(really Mallory's)
locked with Mallory's
I can open it! PIN = 4821
re-locked with bank's
Message received. All normal.

You ask the bank for its public key (its padlock).

Mallory keeps the bank's padlock and sends you her own instead. They look the same.

You lock your message with Mallory's padlock, believing it is the bank's.

Mallory opens it with her own private key and reads everything.

She re-locks it with the real bank padlock and passes it on.

Nobody notices. Encryption to the wrong person is worthless. We need proof that a public key really belongs to the bank.

2 Who are you?

The real world solved this with passports

At the border
On the web
Passport office (the government)
→
Certificate Authority (CA)
Your passport
→
Certificate
Your name and photo inside it
→
Website name + its public key
Hologram and official seal, hard to fake
→
The CA's digital signature, made with the CA's private key
Officer who trusts the passport office
→
Your browser, which trusts a built-in list of CAs

The officer never met you, but trusts whoever made your passport. Your browser never met bank.com, but trusts whoever signed its certificate.

2 Who are you?

What is inside a certificate?

X.509 certificate
Namewww.bank.com
bank.com
Public keyEC P-256
04 6b17d1f2 e12c4247 f8bce6e5 63a440f2 …
Valid2026-09-01 → 2026-11-29
IssuerExample Issuing CA R3
SignatureECDSA-SHA384
30 65 02 31 00 c4 9a 71 …

A small file, about 1–2 KB

Every HTTPS website sends one to your browser. Let's open it.

Name: who is this for?

The website names the certificate covers. Your browser compares this with the address bar. bank.com ≠ bank-secure-login.com.

Public key: the padlock

The website's public key. The matching private key never leaves the bank's server. The server must prove it holds it.

Valid from / to

Certificates expire, often after a few months. A short life limits the damage if something goes wrong.

Issuer: who vouches?

The certificate authority that checked the website and signed this certificate.

Signature: the seal

The issuer signs all the fields above with its own private key. Change one letter of the name or key, and the signature no longer matches.

So how is a certificate tied to one website?

The CA's signature glues this name to this public key. Only the real website has the matching private key, so only it can use the certificate.

2 Who are you?

How does a website get a certificate?

bank.comweb server
Certificate Authority
private key
stays here
public key
CSR: "www.bank.com" + public key
CA: Prove you control bank.com. Put this text on your site:
http://bank.com/.well-known/acme-challenge/Qx7kT2… → "Qx7kT2….9fJm"
(or add a DNS TXT record)
control proven
Certificate, signed by the CA
DV · checks domain control onlyOV · also checks the organisationEV · deeper legal checks

1. The server makes its own key pair. The private key never leaves the server.

2. It writes a request (a CSR): "Please certify that this public key belongs to www.bank.com."

3. The request goes to a certificate authority.

4. The CA sets a test that only the real owner of bank.com can pass.

5. The server passes the test. The CA's machines check it from outside.

6. The CA signs the certificate with the CA's private key and sends it back.

7. The server installs it and shows it to every visitor. With ACME automation, all of this takes seconds.

2 Who are you?

The job of a certificate authority, in five verbs

1

Check

Confirm the requester really controls the domain (and, for OV/EV, really is that company).

2

Sign

Seal the certificate with the CA's private key, so browsers will accept it.

3

Guard the key

Create signing keys correctly and keep them locked in special hardware. Everything depends on this.

4

Cancel

Revoke bad certificates and publish lists of cancelled ones.

5

Publish

Log every certificate in public, and pass yearly audits to stay trusted.

CAs sell this as a business. Website owners pay (or use a free CA like Let's Encrypt). Browsers decide which CAs to trust.

eMudhra failed at job 3: the keys were not created correctly.

2 Who are you?

Why are there so many certificate authorities?

Let's EncryptDigiCertSectigo GlobalSignGoogle Trust ServicesAmazon MicrosoftCertumHARICA SSL.comActaliseMudhra (emSign) IdenTrustBuypass… and dozens more
Competition. Price, service, and support differ. No company is forced to use one seller.
Local needs. Some countries, governments and banks want a CA under their own laws and in their own language.
Different products. Website certificates, software signing, email, document signing.
No single owner. If one CA fails or goes out of business, the web keeps working.
2 Who are you?

Any trusted CA can vouch for any website

Google buys its certificate from one CA. But that is not a rule the browser checks…

…every trusted CA is technically able to sign a certificate for every website name.

So the whole web is only as strong as the weakest CA on the list. One broken CA key is a master key.

2 Who are you?

Who decides which CAs your device trusts?

Mozilla

Firefox. Its list is also copied by Linux and many apps and libraries.

Google Chrome

Chrome Root Store, used by Chrome on all platforms and by Android.

Apple

iPhone, iPad, Mac, Safari.

Microsoft

Windows, Edge and Windows apps.

Built-in trusted roots

Each device ships a list of trusted "root" certificates. To stay on it, a CA must follow shared rules (the CA/Browser Forum Baseline Requirements) and pass audits every year. eMudhra's emSign ECC Root CA - G3 was on these lists.

2 Who are you?

The chain of trust: root → intermediate → website

Root CA

offline, in a vault · lives 20–25 years
in your browser's trusted list

signs

Intermediate CA

online · signs certificates every day
lives a few years

signs

www.bank.com

the "leaf" certificate
lives a few months

Why the middle layer? A root key is too precious to use daily. It stays offline. If an intermediate goes bad, cancel it; the root survives.
eMudhra's weak keys were intermediates. Each one sat right under a trusted root, with full power to sign certificates for any website.
2 Who are you?

How the browser checks the chain

Root CA

public key R · built into browser

Intermediate CA

public key I · signed by Root

www.bank.com

public key B · signed by Intermediate

secure
✓bank.com's certificate: its signature checks out with the intermediate's public key I.
✓Intermediate's certificate: its signature checks out with the root's public key R.
✓The root is in my built-in trusted list.
✓Name matches the address bar, dates are valid, not cancelled. Show the padlock.

The browser checks maths, not honesty. Anyone holding the intermediate's private key can make these checks pass.

3

The handshake

What your browser and a website say to each other in the first 50 milliseconds of every HTTPS connection (TLS 1.3).

3 The handshake

The very first call: before any page loads

Browser
bank.com server
DNS: bank.com → 203.0.113.10
TCP SYN · "can we talk?"
TCP SYN-ACK · "yes"
TCP ACK · "pipe open"
TLS ClientHello

First the browser asks DNS, the internet's phone book, for bank.com's address.

Then TCP opens a reliable pipe with three tiny packets. Nothing is secret yet.

The very first TLS message is the ClientHello. Here the security conversation begins.

With HTTP/3, the pipe uses QUIC instead of TCP, but the same TLS 1.3 messages travel inside it.

3 The handshake

ClientHello, opened up

Browser → server · in the clearClientHello
versionsTLS 1.3, TLS 1.2
random9f1c04ae 7b3d52e0 c8a1… (32 bytes)
cipher_suitesTLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
server_namewww.bank.com
supported_groupsX25519MLKEM768, x25519, secp256r1, secp384r1
key_sharex25519: 3a9f52c1 e07d4b88 91f2… (32 bytes)
signature_algsecdsa_secp256r1_sha256, rsa_pss_rsae_sha256, ecdsa_secp384r1_sha384, …

"Hello, here is what I can do."

The browser's opening message. Let's read it line by line.

Versions

Which TLS versions I speak. Today, almost always TLS 1.3.

Random

32 fresh random bytes. They make every handshake unique, so old messages can't be replayed.

Cipher suites

The bulk-encryption methods I support, best first. The server will pick one.

Server name (SNI)

Which website I want. One server can host thousands of sites; this tells it which certificate to send.

Supported groups

The key-exchange maths I support. Newer browsers include a post-quantum mix (X25519MLKEM768).

Key share: my public key

The browser has already made a fresh key pair and sends its public half now. This saves a whole round trip.

Signature algorithms

Which signatures I can check. The server's certificate must use one of these.

No secrets yet

The ClientHello is not encrypted. Anyone on the path can read it. That is fine: it contains only public things.

3 The handshake

How the browser makes its own key pair, in a millisecond

secret
a = 5f1c9a07 31e8…
random, 256 bits
→
× G
"jump a times"
→
public
A = 3a9f52c1 e07d…
goes in key_share
→
ClientHello
Ephemeral = used once. The secret a lives only for this connection, then it is deleted. Even if someone steals the server's keys next year, today's recorded traffic stays locked. This is called forward secrecy.
The server does the same. It picks its own secret b, computes B = b × G, and sends B back. Now, how do two public keys become one shared secret?
3 The handshake

Making a shared secret in public, with paint

You
Mallory sees everything sent
bank.com
public paint
secret a
secret b
A = mix
B = mix
B + secret a
A + secret b
I have yellow, orange and green. I can't un-mix them, so I can't make the brown.

Start with a paint colour everyone knows. It is public.

Each side secretly picks its own colour. Secrets never leave home.

Each side mixes its secret into the public paint. Mixing is easy.

They swap the mixtures in public. Mallory sees both.

Each adds its own secret to what it received. Both get the same brown!

Un-mixing paint is hard. Mallory saw everything but cannot make the brown.

In real life: paint = point G · secrets = a, b · mixes = A = a×G, B = b×G · brown = a×b×G. This is Diffie–Hellman key exchange.

3 The handshake

ServerHello: the server answers

Server → browser · in the clearServerHello
versionTLS 1.3
random4be1d0c7 22aa9f13… (32 bytes)
cipher_suiteTLS_AES_128_GCM_SHA256
key_sharex25519: B = 9e04b7a2 51cd38f0… (32 bytes)
Next, encrypted
EncryptedExtensions · Certificate · CertificateVerify · Finished

"Hello. Here is what we will use."

The server picks from the browser's lists.

Version

We will speak TLS 1.3.

Random

The server's own 32 fresh random bytes.

Cipher suite

The one bulk-encryption method both sides will use: AES-128 in GCM mode.

Key share: B

The server's fresh public key, made from its secret b. Now both sides have what they need.

From here on, everything is encrypted

Both sides can already compute the shared secret. The rest of the handshake, including the certificate, travels encrypted.

3 The handshake

Both sides now compute the same secret

Browser

knows a, received B
a × B = a × b × G

Server

knows b, received A
b × A = b × a × G

same shared secret
a × b × G
shared secret
+ hash of ClientHello
  and ServerHello
→
HKDF
key "mixer"
→
handshake keys · encrypt the rest of the handshake session key · browser → server session key · server → browser

Same number on both sides, and it never crossed the wire.

A key-derivation function stirs the shared secret with a fingerprint of the conversation.

Out come the session keys: one for each direction.

Mallory has only A and B. To get the secret she must go backwards from A to a. With real-size numbers, she can't.

3 The handshake

The session key at work

GET /account HTTP/1.1
AES-GCMencrypt with session key
17 03 03 00 4a 9f 3c e1 … | tag 8e2b
17 03 03 00 4a 9f 3d e1 … | tag 8e2b
AES-GCMdecrypt + check tag
GET /account
tag fails · closed
Mallory flips one bit

Your browser wants to send a normal web request.

It encrypts the request with the browser → server session key.

On the wire it is noise, plus a short "tag", a tamper seal made with the key.

The server decrypts it and checks the tag. ✓

If anyone changes even one bit, the tag check fails and the connection is closed.

Secrecy ✓ Integrity ✓. Symmetric keys do the heavy lifting because they are very fast.

3 The handshake

But wait: who did we just make a secret with?

You
Mallory
bank.com
ClientHello (A)
ServerHello (M) "I'm bank.com"
secret 1 · you ⇄ Mallory
secret 2 · Mallory ⇄ bank
I decrypt with secret 1, read it, re-encrypt with secret 2. Both sides think all is fine.

Your ClientHello reaches Mallory instead of the bank.

She answers with her own key share M, as if she were bank.com.

You now share a perfect secret… with Mallory. She makes a second one with the bank.

Key exchange gives secrecy with whoever answered. It says nothing about who answered. This is where certificates come in.

3 The handshake

Certificate + CertificateVerify: proof of identity

Browser
bank.com
Leaf
Namewww.bank.com
KeyB-pub 04 6b17…
IssuerExample CA R3
Intermediate
NameExample CA R3
IssuerExample Root
CertificateVerify

A signature, made with bank.com's private key, over a fingerprint of everything said so far: both Hellos, A, B, and the certificates.

✓Chain leads to a root in my trusted list
✓Name on the certificate = www.bank.com
✓CertificateVerify checks out with the public key in the certificate
✓Finished messages match on both sides

The server sends its certificate chain. This is the first moment the CA's work enters the conversation.

Then it signs the whole conversation, including the key shares, with its private key.

The browser checks all three. So the key share B really came from whoever holds bank.com's private key.

Finally, each side sends "Finished": a checksum of the whole handshake. Then the padlock appears.

Mallory can't sign as bank.com… unless a trusted CA gives her a certificate for bank.com with a key she owns.

3 The handshake

The whole TLS 1.3 handshake, in one round trip

Browser
bank.com
ClientHello + key_share A
ServerHello + key_share B
{EncryptedExtensions}
{Certificate}
{CertificateVerify}
{Finished}
{Finished}
[ GET /account … ] ⇄ [ your data ]
identity rests here

{ } = encrypted with handshake keys · [ ] = encrypted with session keys · about 50 ms in total.

Everything secret was set up by the key exchange. Everything about who rests on two violet lines, and they rest on a CA.

3 The handshake

Where the CA's key sits in the chain of events

Trusted root list in your device
Intermediate CA's private key
Certificate for bank.com
CertificateVerify signature
Session keys
Your password, money, messages
Every layer trusts the layer below it.
The CA's private key is the block that decides who you are talking to.
Now make that key guessable…
…and everything above it falls. Not just for one website. For every website.
4

The key was 4

Now we have every piece. Here is what happened at eMudhra, and why it mattered for everyone.

4 The key was 4

Who is eMudhra?

Company

Indian digital-trust company, listed on Indian stock exchanges. Brand name: emSign.

Where

Certificate companies in India, the US and the Netherlands.

In India

Licensed CA for digital signature certificates and Aadhaar-based eSign, under India's Controller of Certifying Authorities.

60M+

digital certificates issued, by its own count.

≈ 1%

of revenue comes from website (TLS) certificates worldwide.

4 / 4

big root programs trusted its roots: Mozilla, Chrome, Apple, Microsoft.

A small part of their business. But inside your browser's trust list, a small CA has exactly the same power as the biggest one.

4 The key was 4

30 April 2025: the key ceremony

HSM: hardware security module
tamper-proof key vault · eMudhra used
Utimaco HSMs (FIPS 140-2 Level 3)
Key ceremony = a scripted, filmed, audited event where a CA creates new signing keys. Every step is written down in advance.
HSM = a locked hardware box. Keys are supposed to be born inside it from good randomness and never leave it in readable form.
30 April 2025: eMudhra creates a batch of 24 new intermediate CA keys under its emSign ECC Root CA - G3 hierarchy.
Mid-2025: the hierarchy is trusted by browsers. In May 2025 Sectigo cross-signs eight of the intermediates. Two yearly audits pass.
Eight of these keys were broken from the moment they were made.
4 The key was 4

What went wrong, by eMudhra's own account

EM DV TLS CA G3B
strong · random 384-bit
EM DV TLS CA G3B′
looks the same…
private key < 256
root signs a certificate for the weak key
Still open: how a certified HSM ended up with a key below 256, who approved the test step, and why nobody noticed. eMudhra says it will re-check every key ceremony it has run. Labels shown are illustrative.
1The HSM makes a proper, strong key pair.
2An "approved deviation": a test of key wrap / unwrap (exporting a key in encrypted form and loading it back).
3A flaw in that test code creates a second key pair on the HSM. It is weak.
4The labels look alike. Staff pick the weak key to make the certificate requests.
5The root signs certificates for the weak keys. Browsers trust them. The strong keys sit unused.
6"There were human errors in multiple steps of the process." — eMudhra
4 The key was 4

How weak is weak? Look at the bytes.

A good P-384 private key: 48 random bytes
Recovered keys 45666115155156230237

eMudhra's weak keys: 47 bytes of zero, then one small byte.

Values published by researchers. Every one is below 256: it fits in a single byte.

One byte = 256 possibilities. A combination lock with 256 settings, guarding certificates for the whole web.

4 The key was 4

Recovering the key: live, in this slide

Public key printed inside the certificate · x-coordinate
138251cd52ac9298c1c8aad977321deb97e709bd0b4ca0aca55dc8ad51dcfc9d1589a1597e3a5120e1efd631c63e1835

Anyone can download any certificate. Its public key is right there.

The attacker's plan: compute k × G for k = 1, 2, 3, … and compare with the public key. A match means k is the private key.

This page is doing real P-384 elliptic-curve maths with your device's CPU.

Trying private key k =
–
waiting…
Scott Helme, security researcher
"One of eMudhra's certificate authority private keys is the number 4."
Recovered all eight keys from public certificates, on a laptop, in under a second.

"The key was effectively public from the day the certificate existed."

4 The key was 4

The eight broken intermediates

emSign ECC Root CA - G3
Sectigo AAA Certificate Services
EM DV TLS CAG3BWEBSITES
EM DV TLS CAG3CWEBSITES
EM OV TLS CAG3BWEBSITES
EM OV TLS CAG3CWEBSITES
EM EV TLS CAG3BWEBSITES
EM EV TLS CAG3CWEBSITES
EM OV CS CAG3BCODE SIGNING
EM OV CS CAG3CCODE SIGNING
DV / OV / EV = the three website validation levels. CS = code signing, for software.
G3B = eMudhra BV (Netherlands). G3C = eMudhra Inc (US). Per eMudhra, one was live in production.
Same keys, two paths. Chrome and Firefox no longer trusted the Sectigo root for websites, but many other systems still did.

Each intermediate also had a twin certificate, cross-signed in May 2025 by Sectigo's older "AAA Certificate Services" root. Same key.

4 The key was 4

Why one small CA's key is a master key

google.com
sbi.co.in
hdfcbank.com
irctc.co.in
incometax.gov.in
github.com
amazon.in
outlook.com
your-bank.com
vpn.your-company
api.payments
app updates
k = 4

None of these sites ever used eMudhra.

It does not matter. These intermediates had no name limits, so one key could sign a certificate for any of them.

4 The key was 4

An attack, step by step

1 · Find the keyTry 255 numbers. Found: 4.
2 · Forge a certificateFor www.bank.com, with the attacker's own key, signed with "4".
3 · Get in the middleFake Wi-Fi, hacked router, DNS trick, or a bad network.
4 · Victim opens bank.comThe ClientHello reaches the attacker.
5 · Answer as "bank.com"Send the forged chain and sign CertificateVerify.
6 · Every check passesChain ✓ name ✓ signature ✓. Padlock shows.
7 · Relay and readPass traffic to the real bank. Read and change it on the way.
You
Attacker
real bank
k = 4 · 0.01 s
Forged
Namewww.bank.com
Keyattacker's
IssuerEM DV TLS CA - G3C
Signedwith key 4
"Free_Airport_WiFi"hacked home routerpoisoned DNS answer
ClientHello → "bank.com"
✓chain → trusted root✓name = www.bank.com✓CertificateVerify valid
"secure"
real TLS to bank
Got the password and the OTP. The victim saw their real account.
4 The key was 4

What could an attacker have done?

Steal logins

Passwords, OTPs and session cookies, behind a normal-looking padlock.

Change data in flight

Swap a bank account number in a payment, or edit a download.

Spy on machines

Server-to-server and app-to-API traffic, where no human ever sees a warning.

Sign fake software

The two code-signing keys could make malware look like it came from a real publisher.

Pose as mail or VPN

Any service that trusts these roots for TLS: email, VPNs, internal tools.

Haunt old devices

Phones, TVs, routers and IoT gear that never update keep trusting these keys for years.

4 The key was 4

The safety net: Certificate Transparency

Public CT log · append-only

The rule

Every new website certificate must be written into public logs. The log gives a receipt, which goes inside the certificate. Chrome, Safari, Edge and Firefox reject certificates without receipts.

Forged and logged?

Everyone can see it. Monitors would flag a bank.com certificate from an eMudhra CA within hours.

Forged, not logged?

The browser refuses it. The attack fails.
Logs show no certificates from these eight intermediates in the whole 18 months. Browsers were very likely never attacked.
But curl, Python, Java, Go programs, many phone apps and IoT devices do not check CT logs. For them, nobody can be sure.
4 The key was 4

Hidden in plain sight for 17½ months

May 2025AugNovFeb 2026MayAugOct
30 Apr 2025Weak keys created at the key ceremony
May 2025Sectigo cross-signs the eight. Revocation lists signed by these CAs start failing checks: the first public clue.
Mid-2025 →Trusted in browser root stores
2025 – 2026Two yearly audit cycles pass
17 Oct 2026Someone finally checks the keys

For about 17½ months, anyone who looked could have computed these keys.

4 The key was 4

17 October 2026: someone looked

A researcher, credited as "Wayne", was testing CA keys from the CCADB, the shared database root programs use to track every CA certificate.
At 16:27 UTC the elliptic-curve keys broke. To prove it without publishing the keys, he signed a message with each one.
Mozilla recovered the keys itself within two hours. Others did too. Per the Mozilla bug, AI agents managed it with a simple prompt.
Mozilla's Dennis Jackson later published the proof, test sites and a patch list at emudhra.we-have-a-problem.com.
Message
"We have a problem here - Wayne"
DV G3B
DV G3C
OV G3B
OV G3C
EV G3B
EV G3C
CS G3B
CS G3C

Anyone can check these 8 signatures with the public keys in the certificates. Only the private-key holder could have made them.

4 The key was 4 · times in UTC

Four days in October

Sat 17 Octdiscovery

16:27Researcher breaks the keys
18:05Report to Apple, Chrome, Microsoft, Mozilla, eMudhra
19:45Chrome blocks the 6 website intermediates (CRLSet)
21:28eMudhra replies; disables its one live intermediate
21:48Mozilla recovers the keys itself
22:59Firefox block complete (OneCRL)

Sun 18 Octrevocation

09:24–09:38eMudhra revokes all 8 intermediates as "CA compromise"
12:06Mozilla incident bug opened

Mon 19 Octquiet fixes

Appleblocks the certificates
≈ 22:00Android block via Google Play services
PrivateOther trust stores and Cloudflare warned

Tue 20 Octpublic

DisclosureMozilla goes public
Microsoftblocks via Windows updates
Firefox158.0.1 · NSS 3.131.1 drops the G3 root
Go1.27.3 / 1.26.10 · Linux distros update
eMudhrapublishes a statement

Wed 21 Octfallout

Node.jsfixes released
CERT-Inadvisory CIAD-2026-0050
MeitYforms an investigation team
MarketseMudhra shares fall ≈ 20%

27 Octexpected

ChromeRoot Store v43 removes emSign ECC Root CA - G3
4 The key was 4

The cost

8 + 8

intermediates revoked: eMudhra's own, plus Sectigo's cross-signed twins.

1 root

emSign ECC Root CA - G3 removed by Mozilla, with Chrome to follow.

≈ 30,000

customer certificates under that root must be replaced.

eMudhra estimate
≈ −20%

eMudhra share price on 21 Oct.

2

Indian government responses: a CERT-In advisory and a MeitY investigation team.

Under review

Google is also evaluating eMudhra's other root, emSign Root CA - G1.

eMudhra and India's IT ministry say Indian digital-signature and eSign services are separate and were not affected.

5

The cleanup

How do you un-trust a key that is already inside billions of devices?

5 The cleanup

Plan A: tell everyone "this certificate is cancelled"

Your app
Attacker
eMudhra CA
CRL: list of cancelled certificates
OCSP: "Is this one cancelled?"
OCSP: "Is this one cancelled?"
question blocked
No answer… I'll just trust it.

eMudhra revoked the eight intermediates and listed them in its cancelled list (CRL).

Software can also ask the CA live (OCSP): "is this certificate still good?"

But an attacker in the middle can simply block the question.

Most software "fails open": no answer means carry on. And many apps never ask at all.

So browser makers built their own block lists, pushed straight into the browser.

5 The cleanup

Plan B: browsers push their own block lists

Chrome

CRLSets

A small block list Google pushes to every Chrome in the background. Android got a block via Google Play services.

17 Oct 19:45 · 1 h 40 m after report

Firefox

OneCRL + CRLite

OneCRL blocks CA certificates. CRLite packs every revoked certificate into a tiny file.

17 Oct 22:59

Apple

trust update

Blocks for iPhone, iPad, Mac and Safari.

19 Oct

Microsoft

Disallowed list

Windows "untrusted" list, delivered through automatic trust-list updates.

20 Oct
Mozilla removes the root. NSS 3.131.1 and Firefox 158.0.1 drop emSign ECC Root CA - G3 (20 Oct).
Chrome follows. Chrome Root Store v43 removes the same root, expected 27 Oct. Websites under it must switch CAs first.

Browsers: protected within hours to days, mostly without users doing anything.

5 The cleanup

The long tail: everything that carries its own list

Mozilla's root list

Copied into Linux, programming languages, containers, apps and devices. Each copy must be updated separately.
Ubuntu, Debian, Fedora, Arch, Alpine…ca-certificates
NSS3.131.1
curl CA bundle2026-10-20
Python certifi2026.10.19
pip26.2.2
Go1.27.3 · 1.26.10
Node.js21 Oct release
Javaseveral versions
Rustup1.29.2
Deno2.9.8
Claude Code2.1.303
Cloudflare cloudflared2026.10.2
Electron, uv, Composer, Perl…patched
Bun, Erlang certifipending (at disclosure)
macOS built-in curl, git, Python/etc/ssl/cert.pem outdated
Old phones, TVs, IoTmay never update
Go's unusual fix: reject any chain containing one of the eight keys, hard-coded, with no opt-out. Its team argued Linux root lists are too poorly maintained for revocation to reach apps in time.

Browsers update themselves. Everything else waits for someone to ship, and someone else to install, an update.

5 The cleanup

Test your own tools

Test servers on the incident site serve a certificate from the broken chain:
dv-g3b-emudhra.we-have-a-problem.com
dv-g3b-aaa-emudhra.we-have-a-problem.com
Error = good. Your tool no longer trusts the broken keys.
Page loads = bad. Update it. A browser passing does not prove your servers, apps and scripts pass.
5 The cleanup

What should you do?

Everyone

  • Update your browser and restart it.
  • Install phone and computer system updates.
  • Treat any certificate warning as a real warning.

Developers

  • Update runtimes and CA bundles: certifi, Node.js, Go, Java, Rust crates.
  • Rebuild and redeploy container images.
  • Check indirect dependencies too.
  • Never "fix" new errors with verify=False, curl -k or InsecureSkipVerify.

Site and IT teams

  • Certificates under emSign ECC Root CA - G3? Replace them before 27 Oct.
  • Update trust stores in proxies, mutual-TLS setups and appliances.
  • Watch CT logs for certificates issued for your own domains.
Lessons

Five things to take home

1Trust on the web is shared.Any one trusted CA can vouch for any website, so the weakest CA sets the level for everyone.
2A key is only as strong as the way it was chosen.P-384 is excellent maths. A private key of 4 makes it worthless.
3Certified hardware and audits are not proof.The process around them failed, and two audit cycles did not catch it.
4Openness works.Public certificates and public logs let one outsider find the flaw, and showed browsers were very likely never attacked.
5Trust lists must update fast.Browsers fixed it in hours. Everything else is still catching up.
eMudhra October 2026

Every padlock rests on a secret number.
For 17½ months, one of them was 4.

Thank you. Questions?

Sources

Read more

The key was 4 · eMudhra, Oct 2026
→ or Space to advance · N notes · F full screen · ? help