Repository navigation
fix(transport): Reject leaked eMudhra intermediate certificates - #6336
Draft
runningcode wants to merge 2 commits into
Draft
runningcode wants to merge 2 commits into
runningcode wants to merge 2 commits into
Conversation
Contributor
🚨 Detected changes in high risk code 🚨High-risk code has higher potential to break the SDK and may be hard to test. To prevent severe bugs, apply the rollout process for releasing such changes and be extra careful when changing and reviewing these files:
|
1 similar comment
Contributor
🚨 Detected changes in high risk code 🚨High-risk code has higher potential to break the SDK and may be hard to test. To prevent severe bugs, apply the rollout process for releasing such changes and be extra careful when changing and reviewing these files:
|
📲 Install BuildsAndroid
|
The private keys of eight eMudhra intermediates can be recovered from their certificates (CVE-2026-111943). Their Sectigo cross-signs chain to AAA Certificate Services, which is trusted on every Android version, so platform trust store updates won't reach every device. The envelope transport and the distribution client now reject servers that present one of these keys, right after the TLS handshake and before any request is written. Fixes JAVA-783 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
runningcode
force-pushed
the
no/distrust-emudhra-intermediates
branch
from
October 21, 2026 08:56
9099fca to
c17d99a
Compare
Contributor
🚨 Detected changes in high risk code 🚨High-risk code has higher potential to break the SDK and may be hard to test. To prevent severe bugs, apply the rollout process for releasing such changes and be extra careful when changing and reviewing these files:
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📜 Description
Rejects TLS servers that present one of the eight leaked eMudhra intermediate certificates (CVE-2026-111943). The check covers the two places where the SDK opens its own HTTPS connections: the envelope transport (
HttpConnection) and the Android distribution update check (DistributionHttpClient).The new internal
DistrustedCertificates.verify(connection)runs right afterconnect(). It hashes the public key of every certificate the server presented. On a match, it disconnects and throwsSSLPeerUnverifiedException. At that point the TLS handshake is done, but no part of the request has been written yet, both on the JVM and on Android's built-inHttpsURLConnection. A blocked envelope fails with anIOException, so it stays in the offline cache and is retried later.💡 Motivation and Context
The private keys of eight eMudhra intermediates can be recovered from their certificates. Sectigo's AAA Certificate Services root also cross-signed each of these keys, and that root is trusted on every Android version. So removing the eMudhra root from trust stores isn't enough, and devices that don't get CA or Conscrypt updates keep trusting forged certificates. Browsers are protected by Certificate Transparency and their own revocation lists, but
HttpsURLConnectionhas neither.OkHttp (writeup) and Go 1.26.10 / 1.27.3 (commit) ship the same mitigation. OkHttp's workaround uses a
HostnameVerifier, but that doesn't work here: the JVM'sHttpsURLConnectiononly calls a custom verifier when its own hostname check fails. That's why this checks the server certificates afterconnect()instead.The eight SPKI hashes match the OkHttp and Go lists. They were also re-computed from the 16 certificates in the disclosure's impacted-intermediates.json. Background: Mozilla dev-security-policy thread.
Fixes JAVA-783
💚 How did you test it?
Unit tests in
DistrustedCertificatesTestandHttpConnectionTestuse the realEM DV TLS CA - G3Bcertificate cross-signed by AAA Certificate Services.DistributionHttpClientcreates its own connection with no way to inject a mock, so it relies on the tests of the shared check.📝 Checklist
sendDefaultPIIis enabled.🔮 Next steps
Out of scope:
SpotlightIntegrationonly talks to a local server, and the HTTP client integrations (sentry-okhttp, Apache, OpenFeign, Ktor, Spring) instrument the app's own clients, which the app has to update itself.🤖 Generated with Claude Code