Key takeaways
- Java needed its own fix for the eMudhra key compromise. Browsers blocked the eight weak eMudhra intermediates on 17–20 October, but a Java app uses the JDK's
cacertsandblocked.certs, not the browser. Oracle published a Security Alert for CVE-2026-91403 (CVSS 9.1) on 21 October (Oracle alert, Cybersecurity News). - The regular October CPU builds are not enough. The 20 October Critical Patch Update (55 Java SE fixes, 49 remotely exploitable without login, per Tenable) shipped 21.0.13, 17.0.21 and so on. Those exact versions are listed as affected. The fixes are re-spun
.0.2builds, for example 21.0.13.0.2. - Vendor status differs. Oracle and Azul shipped fixed builds on 21 October. As of 23 October, Temurin, Corretto and Microsoft had no eMudhra statement, and Red Hat's fix comes through the OS
ca-certificatespackage (Safeguard vendor tracker, Red Hat RHSB-2026-012). - Don't trust the version number, check the file. A fixed build's
lib/security/blocked.certscontains the eMudhra hashes. One independent test saw the file grow from 39 to 87 lines (lilting.ch test). - No exploitation has been reported. The risk is a man-in-the-middle presenting a forged certificate to a Java client. Server-to-server API calls from Indian back-ends are exactly that kind of client.
1. Why Java is a separate problem
When we covered the eMudhra CA key compromise on 23 October, the urgent part was for browsers and website owners. Java works differently. A Spring Boot service calling a payment gateway, a Tomcat app hitting a GST or bank API, or a Jenkins agent pulling artifacts all decide trust from the JDK itself. Some JDKs bundle their own cacerts, while distro builds read the OS store.
The weak keys belong to eight eMudhra intermediates: six TLS and two code-signing. They chain to emSign ECC Root CA - G3, and Sectigo's AAA Certificate Services root cross-signed the same keys. Anyone who recovers a key can mint a certificate for any hostname that an unpatched Java client will accept. Red Hat tracks it as four CVEs: one each for Java, Go, Perl's Mozilla::CA and RHEL ca-certificates.
The test results are clear. On an unpatched OpenJDK 27.0.1, connections to test hosts signed by the compromised chain succeeded with HTTP 200. On the fixed 27.0.1.0.2 build they were rejected as untrusted (lilting.ch).
2. Fixed builds by vendor (status as of 23–25 October)
| Vendor | Fixed build(s) | Status | Source |
|---|---|---|---|
| Oracle JDK | 27.0.1.0.2, 25.0.5.0.2, 21.0.13.0.2, 17.0.21.0.2, 11.0.33.0.2; JDK 8 re-build 8u511 b32 (reported) | Released 21 Oct | Oracle alert |
| Azul Zulu | Out-of-cycle respins, e.g. Zulu 21.54.107, 17.70.111, 11.92.109, 8.98.0.107 (CA) | Released 21 Oct. The JDK version string stays the same, so check the Zulu version | Azul respin notes |
| Eclipse Temurin | None confirmed. jdk-21.0.13+9 / 25.0.5+8 are the regular October builds | No statement on 23 Oct | Adoptium news |
| Amazon Corretto | October quarterly: 21.0.13.0.10, 17.0.21.0.10, 11.0.33.0.9, 8u512 | Released 22 Oct; changelogs do not mention eMudhra | AWS What's New |
| Microsoft OpenJDK | No October release listed | No statement on 23 Oct | Release notes |
| RHEL OpenJDK RPMs | Trust comes from ca-certificates: RHSA-2026:88455 (RHEL 10), :88459 (9), :88550 (8) |
RHEL 7/6 errata pending | RHSB-2026-012 |
Treat the Temurin and Corretto rows as "unknown", not "safe". Those vendors may ship respins after this article, so check their pages. Whatever the version label says, the verification step in section 4 is what counts.
3. Three ways to fix it, compared
| Option | Effort | Downside | Use when |
|---|---|---|---|
Upgrade to a fixed build (Oracle .0.2, Zulu respin) |
Low to medium: new image or package, then restart | Needs a deploy window and regression tests | You already run that vendor, or can switch easily |
Patch blocked.certs in place (Oracle and Azul publish the file and instructions) |
Low: copy one file, restart the JVM | Manual. Easy to miss in a container image or a bundled JRE. Keep any custom lines you added | You can't change the JDK version this week |
Turn on revocation checking (-Dcom.sun.net.ssl.checkRevocation=true -Dcom.sun.security.enableCRLDP=true) |
Low: JVM flags | Adds a CRL fetch to TLS handshakes, which fails if the CRL host is unreachable | Short-term only, on hosts with reliable outbound HTTP |
OS ca-certificates update (RHEL, Debian, Ubuntu and other distro JDKs) |
Lowest: dnf/apt update |
Only helps JDKs that read the OS trust store | Distro-packaged OpenJDK |
For most teams the answer is: update ca-certificates on distro JDKs, and either upgrade or drop in the new blocked.certs on bundled JDKs. Red Hat's interim advice for RHEL is blunter: blocklist the two roots entirely. Do that only if nothing you call depends on them.
4. How to check a JVM in two minutes
On each host or image:
- Find the JDK actually in use. Run
java -XshowSettings:properties -version 2>&1 | grep -E 'java.home|java.vendor|java.runtime.version'. Apps often ship their own JRE, so check the app's start script as well asPATH. - Count the blocklist. Run
wc -l "$JAVA_HOME/lib/security/blocked.certs"(on JDK 8 the file isjre/lib/security/blacklisted.certs). Compare it with a known fixed build of the same vendor. A short, unchanged file means you are not patched. - See which roots you trust. Run
keytool -list -cacerts -storepass changeit | grep -i -E 'emsign|comodoaaa'. - Check signed JARs if you verify signatures. On JDK 17+,
jarsigner -verify -revcheck -strict app.jarturns on revocation checks for the two code-signing intermediates. - Rebuild containers. Base images like
eclipse-temurin,amazoncorrettoand UBI OpenJDK only pick up the fix when the image is rebuilt and redeployed. A running pod keeps the old trust store.
5. The India angle
Java runs much of India's enterprise back-office: bank core and middleware systems, insurance policy platforms, ERP add-ons, and the many Spring services that call bank, GST and payment-aggregator APIs. Many of these still run JDK 8 or 11 inside vendor-supplied application servers, where the bundled JRE gets missed. Ask your software vendor for their CVE-2026-91403 status in writing.
Two more points matter here. eMudhra is an Indian CA, so certificates from the affected hierarchy are more likely to show up in Indian deployments than elsewhere, even though eMudhra says none of the eight intermediates issued end-entity certificates. And CERT-In has already issued advisory CIAD-2026-0050 on the incident, so auditors will expect a dated record of when each system was checked.
On cost, the free OpenJDK builds (Temurin, Corretto, Microsoft, Zulu Community) cost ₹0 in licences. Paid support (Oracle Java SE subscription, Azul, Red Hat) buys faster respins, which this week was the real difference: Oracle and Azul had fixed builds within a day.
6. What to do this week
- Inventory every JVM: servers, containers, CI agents, desktop tools, and vendor appliances with embedded Java.
- Patch the trust store first: OS
ca-certificatesfor distro JDKs, and a fixed build or the newblocked.certseverywhere else. - Rebuild and redeploy images. Don't stop at changing the Dockerfile tag.
- Verify with the file check from section 4, and record the date per system for audit.
- Still apply the regular October CPU. It fixes 55 other Java SE issues unrelated to eMudhra.
- Watch Temurin and Corretto. If a respin lands, schedule it. If not, the
blocked.certsdrop-in stays your fix.
Need help inventorying and patching Java across servers and containers? That is part of our managed IT services. To check which CA issued your own site's certificate, use the free uptime & SSL checker.