Repository navigation
Conversation
|
Review: no blocking issues found.
|
Codex Code ReviewNo actionable security vulnerabilities, bugs, significant performance issues, or unnecessary complexity found in the PR diff. Verified the vendored bundle excludes both specified roots and its manifest loads successfully. Full builds were not run. |
The private keys of eight eMudhra intermediate CAs were compromised (https://emudhra.we-have-a-problem.com/, Mozilla bug 2083449). One path to a trusted root is the emSign Root TLS CA - G3 cross-sign by emSign ECC Root CA - G3. webpki-roots 1.0.4 still ships that root, and the aggregation mode services use it through reqwest's rustls backend. - webpki-roots 1.0.4 -> 1.0.10 (drops emSign ECC Root CA - G3) - rustls-webpki 0.103.8 -> 0.103.16 (rejects the compromised SPKIs). This needs aws-lc-rs ^1.18, so aws-lc-rs/aws-lc-sys are bumped too.
JuArce
force-pushed
the
fix/distrust-emudhra-ca
branch
from
October 22, 2026 18:33
f9e8839 to
472f0e0
Compare
HTTPoison goes through hackney, which always verifies against the roots bundled in Erlang certifi, not the OS trust store. certifi 2.12.0 still ships emSign ECC Root CA - G3 and AAA Certificate Services, and there is no fixed certifi release yet. So the CoinGecko price fetch (EthConverter) and OperatorVersionTracker accepted certificates from the compromised eMudhra intermediates even on hosts with patched ca-certificates. Move both to Finch (Explorer.Finch), which the rest of the explorer already uses. Mint verifies against :public_key.cacerts_get(), the OS store. Then drop httpoison, which also removes hackney and certifi from the release. Also bump castore 1.0.8 -> 1.0.22, Mint's fallback bundle, which drops the affected roots.
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.
Why
The private keys of eight eMudhra intermediate CAs were compromised (advisory, Mozilla bug 2083449). They chain to two roots:
emSign Root TLS CA - G3cross-signThe servers'
ca-certificatesupgrade fixes clients that use the OS trust store. It doesn't fix clients that ship their own root list.Explorer (exposed now)
EthConverter(the CoinGecko price) andOperatorVersionTrackeruse HTTPoison. HTTPoison goes through hackney, which always verifies against the roots bundled in Erlangcertifi, never the OS store.certifi2.12.0 has both roots, and there is no fixed release yet (2.17.0 is the latest). I tested against the advisory's no-CT test hosts with the patched Debian bookworm store (ca-certificates 20250419~deb12u2) loaded as the OS store:dv-g3b-noct-emudhra(emSign chain)unknown_cadv-g3b-aaa-noct-emudhra(AAA chain)unknown_caapi.coingecko.comwrong.host.badssl.com/expired.badssl.comAggregation mode (defense in depth)
alloy's
connect_httpbuildsreqwest::Client::new(). reqwest'sdefault-tlsfeature is enabled here, so that client uses OpenSSL and the OS store, and the RPC traffic was covered by the server upgrade. The bundledwebpki-roots1.0.4 still trusts the emSign chain for anything that selects rustls. I confirmed that with.use_rustls_tls()against the test hosts.How
EthConverterandOperatorVersionTrackermove from HTTPoison toExplorer.Finch, which the rest of the explorer already uses. Mint verifies against:public_key.cacerts_get(), the OS store.httpoisonis dropped, which also removeshackney,certifiand their exclusive deps from the lockfile.castore, Mint's fallback bundle, goes from 1.0.8 to 1.0.22, which has neither root.webpki-roots1.0.4 → 1.0.10 andrustls-webpki0.103.8 → 0.103.16. 0.103.16 requiresaws-lc-rs ^1.18, soaws-lc-rs1.18.2 /aws-lc-sys0.46.0 come along.After merge
1. Every host: check the OS trust store
This step doesn't depend on this PR, so it can run now.
If the second command prints anything, remove the roots by hand as
admin. This happens on Debian 11, which has no patched package.OpenSSL and OTP load the trust store into memory at startup. Restart any long-running process that started before the store changed:
2. Explorer
Repeat on each explorer host. The inventory lists
aligned-mainnet-explorerandaligned-hoodi-explorer.Don't rerun
infra/ansible/playbooks/explorer.yaml:2075-feat-hoodi-deploymentbranch.state: started, which doesn't restart a service that's already running.These steps repeat only its build task.
As
app:As
admin, re-grant the permission to bind port 443.mix release --overwritereplacesbeam.smp, which drops it:As
app, restart:Verify inside the running node, which uses the trust store it loaded at startup:
compromised chain: {:error, %Mint.TransportError{reason: {:tls_alert, {:unknown_ca, ...}}}}andeth price: {:ok, <number>}.{:ok, ...}: the host's OS store still trusts the roots. Go back to step 1.Then open the explorer and check that the operators page and the USD amounts load.
Rollback: run
git checkout $(cat ~/explorer.prev), then redo the build, thesetcapand the restart.3. Aggregation mode
This can wait for the next normal deploy, because RPC traffic already uses the OS store.
make agg_mode_install_clion the task sender host.Testing
mix compilein the explorer: no warnings. An end-to-end run of the real modules:EthConverter.get_eth_price_usd()returns{:ok, price}through Finch.OperatorVersionTracker, pointed at the compromised test host, logsunknown_caand returns%{}.SKIP_AGG_PROGRAMS_BUILD=1 cargo check --locked --workspaceinaggregation_mode.🤖 Generated with Claude Code