Repository navigation
fix(tls): distrust the roots behind the compromised eMudhra intermediates - #9248
Conversation
…ates The private keys of eight eMudhra intermediate CAs were reported compromised (https://emudhra.we-have-a-problem.com). Browsers block them through CRLSet/OneCRL, but Node, Bun, and the OS stores in our images still trusted chains through them via emSign ECC Root CA - G3 and the Sectigo AAA Certificate Services cross-sign. - @sim/security/tls-trust drops the four roots the disclosure lists from the process default CA set at startup (app and realtime bootstraps, Trigger.dev init). It replaces the set only when one of them is present, so it becomes a no-op once runtimes ship their own fix, and never throws. - The app and cron images distrust the same roots in the OS store, with a build-time check that fails if the edit stops removing them. - Electron 43.8.1 carries the upstream SPKI blocklist (electron/electron#55130). Bun's native fetch keeps its compiled-in store and ignores the process CA set, so the emSign path there closes with the Bun release carrying oven-sh/bun#46159.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
[High impact] The PR appears safe to merge within its stated coverage. SummaryThe PR removes compromised CA roots from supported TLS clients, updates the app and cron trust stores, and pins Electron to
Reviews (2) · Last reviewed commit: "fix(tls): log the fail-open trust state ..." · Reviewed by Greptile |
There was a problem hiding this comment.
All reported issues were addressed across 10 files
This PR changes authentication, authorization, or input validation. Ultrareviews find 2.4x more serious bugs than standard reviews. Comment @cubic-dev-ai ultrareview to run one.
Turn on auto-fix | Re-trigger cubic
…-age gate for electron The default production log level is ERROR, so a warn-level report of a runtime that cannot replace its CA set was invisible. The electron exclusion was unnecessary: the lockfile pins 43.8.1 and the age gate only applies when a version is resolved.
|
@greptile |
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
|
Thanks very much for sorting this out so promptly you beauties! |
Summary
The private keys of eight eMudhra intermediate CAs were reported compromised (disclosure). Browsers block them through CRLSet and OneCRL. Non-browser clients don't read those, so Node, Bun, curl and Python in our images still trusted any certificate issued under them. Each intermediate is reachable two ways: through
emSign ECC Root CA - G3, or through Sectigo'sAAA Certificate Servicescross-sign.@sim/security/tls-trustremoves the four roots that the disclosure'sroots.jsonlists from the process's default CA set. It runs first in the app and realtime bootstraps and in Trigger.devinit.systemandextraroots withdefault. Bun'snode:tlsverifies against all of them, but Bun reports only its built-in list asdefault, so rebuilding from that alone would drop the OS roots.bun install(frozen or not, cold cache) installs it without aminimumReleaseAgeExcludesentry and the 7-day gate stays intact.error, so the fail-open state shows at the default production log level.Verification
Run in Docker against all 12 disclosure test hosts (6 intermediates × 2 chains) plus 10 control endpoints: Google, GitHub, npm, OpenAI, Anthropic, Slack, Google OAuth, Microsoft login, Stripe, AWS STS.
fetch+node:https)node:https(pg, ioredis, AWS SDK, ws)fetch, app imageRemoving the
sedline from either Dockerfile fails its build at the guard.The trusted set loses only the compromised root: Bun 155 → 154 and Node 121 → 120, nothing added. A custom root passed with
NODE_EXTRA_CA_CERTS, as used behind a corporate TLS proxy, is kept in both runtimes.Not covered here
fetchuses its compiled-in root store and ignorestls.setDefaultCACertificates. TheemSign ECC Root CA - G3path stays open until a Bun release includes crypto: update root certificates oven-sh/bun#46159 (merged 2026-10-20, not released yet). Follow-up: bump Bun once that release is out.Test plan
Distrusted compromised CA rootsat startup; integrations, OAuth, and webhooks behave normally