GitHub Actions and the eMudhra CA compromise (CVE-2026-111943): which runners still trust it, and the fix for macOS runners
On October 17, 2026, the private keys of eight eMudhra intermediate CA certificates were shown to be compromised (the disclosure). Whoever holds one of those keys can issue a certificate for any host name. Browsers and the operating systems' own networking block them (Firefox and Chrome since October 17, Microsoft platforms since October 20, Apple products since October 22), but tools that check certificates against a CA bundle file, such as curl, git, Python, pip, Node.js and Java, keep trusting them until that file is updated. On a GitHub-hosted runner, those are the tools that fetch your dependencies and push your releases, so someone on the network path could pose as a package registry or a git remote.
Where each runner image stood on November 5, 2026
- Ubuntu 24.04 and 26.04: fixed. On images 20261026.354.1 and 20261026.180.1,
ca-certificatesis 20260816ubuntu0.24.04.1 and 20260816ubuntu0.26.04.1, and curl, Composer and the system Node.js reject the chains in a test reported on October 29 (runner-images #15018). For Ubuntu 22.04, Ubuntu's fixed package is 20260816ubuntu0.22.04.1; check the version on the image you get (below). - The runner's own Node.js 20 still trusts them. Actions have run on Node 24 since September, and GitHub plans to remove Node 20 from the runner in a release later in November (same issue).
- macOS:
/etc/ssl/cert.pem, the file that Apple's/usr/bin/curl,gitandpython3check against, was dated 2021 on every macOS image, and Apple has not updated it (#15186). On November 4, GitHub said it had pushed a patch for that file on the macOS 15 and macOS 26 Arm64 images,xcode-27,macos-26-intelandmacos-15-intel, and that the fix for Homebrew'sca-certificateson the Intel images was due at the end of November 5, US Eastern time (#15228). New image versions reach jobs over several days, and some jobs kept getting weeks-old images (#15208), so check rather than assume. - Windows rejects both chains with
CRYPT_E_REVOKED(#15018). One tester saw Git for Windows 2.56.0.windows.2 accept them in some runs; Git for Windows 2.56.0.3 has the fix.
Checking from a workflow
The disclosure runs test hosts whose certificates come from the compromised intermediates. A certificate error means the client does not trust them:
- name: Check the eMudhra chains
shell: bash
run: |
for h in dv-g3b-emudhra dv-g3b-aaa-emudhra; do
if curl -sS -o /dev/null "https://$h.we-have-a-problem.com/"; then
echo "$h: trusted"
else
echo "$h: rejected"
fi
done
"trusted" means that tool on that runner still accepts the compromised intermediates. Each tool can use a different bundle, so try the ones your jobs rely on the same way (git ls-remote, Python, Node.js). A network problem also looks like "rejected", so a "trusted" result is the one to act on.
On macOS, this step fails while /etc/ssl/cert.pem still has the affected roots (the check GitHub gives in #15228):
- if: runner.os == 'macOS'
run: |
openssl crl2pkcs7 -nocrl -certfile /etc/ssl/cert.pem | openssl pkcs7 -print_certs -noout \
| grep -E 'emSign ECC Root CA - G3|AAA Certificate Services' && exit 1 || echo "cert.pem is fixed"
On Ubuntu, dpkg-query -W ca-certificates prints the installed version.
Fixing it on macOS before the image does
- Remove the affected roots from
/etc/ssl/cert.pemin the first step of the job, beforeactions/checkout, because checkout uses git (GitHub's advice in #15228). curl's own CI does this with a small composite action, macos-fix-certs: it filters out the emSign ECC Root CA - G3, emSign ECC Root CA - C3, emSign Root CA - C1 and AAA Certificate Services entries and installs the result withsudo. Its author notes that an earlier version also removed a root it did not need to, so review the list before you reuse it. - Apple's
python3ignoresSSL_CERT_FILE, so setting that alone does not help. Thepipof Apple's Python has its own copy of the roots; point it at the fixed file withPIP_CERT=/etc/ssl/cert.pem(#15228). - Homebrew's curl and git check against Homebrew's
ca-certificates, which is fixed from 2026-09-25_1. The images turn off Homebrew's automatic updates, so an image can still carry an older one (#15191);brew updatefollowed bybrew upgrade ca-certificatesbrings the fixed one.
Tools that bring their own roots
Fixing the system file does not reach tools that ship their own list. Versions with the fix, from the disclosure's list:
- Node.js 26.12.1, 24.22.1 and 22.23.4 (for
actions/setup-node). - Python 3.15.2, 3.14.10, 3.13.18, 3.12.16 and 3.11.18 (for
actions/setup-python, which has the 3.11 to 3.13 fixes only for Linux: CVE-2026-115557 and setup-python), pip 26.2.2, uv 0.13.5 and the PyPI publish action 1.14.3. - Go 1.27.3 and 1.26.10. CVE-2026-111943 is the record of this fix, published on October 21: a list in
crypto/x509that refuses the intermediates even where the system store is old. That is why scanners report it against Go binaries built with an older Go, as "stdlib"; many trackers use the same number for the whole incident. Rebuild with one of these versions (where a workflow decides the Go version). - Java: Oracle JDK 27.0.1.0.3, 25.0.5.0.3, 21.0.13.0.3, 17.0.21.0.3, 11.0.33.0.3 and 8u511 b33; OpenJDK builds were still pending.
actions/setup-javainstalls the JDK you choose, so the fix comes from choosing a distribution and version that has it (setup-java #1305). - GitHub CLI 2.102.1 and Git for Windows 2.56.0.3.
actions/setup-python itself downloads Python with the runner's Node 24, which rejects the chains on the fixed Ubuntu images (setup-python #1382).
See failed jobs from IntelliJ IDEA
Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, so a check step that starts failing stands out, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).
Get it on JetBrains Marketplace
GitHub and GitHub Actions are trademarks of GitHub, Inc.; Apple and macOS are trademarks of Apple Inc.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc., Apple Inc., eMudhra or JetBrains.
More: xcode-27 and the iOS 27.1 simulator · macOS 14 retired · GitHub Actions plugins for IntelliJ IDEA compared · 日本語