Repository navigation
[no-ci] CI: add runner certificate trust store probe workflow - #3251
Conversation
Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
…tion" This reverts commit a7b5c91. Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
…de script Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
…tion" This reverts commit 1070160. Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
|
/ok to test 711671b |
📝 Summary
Priority: Change: Other Merge Risk:
|
There was a problem hiding this comment.
Actionable comments posted: 2

Review info
-
Run configuration-
- Source mode: Auto
- Repository: NVIDIA/cuda-python
- Branch: main
- File: .coderabbit.yaml
- Commit: f9212dd
- Layers: Repository YAML
- Review profile: CHILL
- Plan: Enterprise
- Run ID:
f74d6f6c-9bdf-4723-84f2-11497eac233f
Files selected for processing: 6-
.github/workflows/runner-trust-probe.ymlci/tools/compute_ci_plan.pyci/tools/runner_trust_probe.ps1ci/tools/runner_trust_probe.shci/tools/runner_trust_probe_node.jsci/tools/tests/test_compute_ci_plan.py
Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 11 remain after this review.
-
Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
|
/ok to test 2d119d7 |
leofang
left a comment
There was a problem hiding this comment.
It's unclear to me how we're supposed to maintain this as a library team... I'll let others chime in
| [ | ||
| "ubuntu-latest", | ||
| "linux-amd64-cpu8", | ||
| "linux-arm64-cpu8", | ||
| "linux-amd64-cpu4", | ||
| "windows-latest", | ||
| "windows-2022", | ||
| "windows-11-arm" | ||
| ] + [ |
There was a problem hiding this comment.
This kinda makes me sad...
- This can go out of sync easily
- It seems overly defensive (that we are responsible for testing infra owned and operated by someone else)
Is this check really necessary?
rwgk
left a comment
There was a problem hiding this comment.
codex GPT-6.1-Sol ultra found:
- [P2] HTTP errors can hide successful TLS validation — runner_trust_probe.ps1:51.
Invoke-WebRequestthrows for HTTP 4xx/5xx, which the catch classifies asINCONCLUSIVE. This can leave the job green despite trusting the certificate when the separate LocalMachine check passes, such as with CurrentUser trust. Add-SkipHttpErrorCheckso HTTP error responses also reach the trust-failure branch. A mocked HTTP 503 reproducedINCONCLUSIVEwith exit code 0.
… on Windows Signed-off-by: Ralf Juengling <rjuengling@nvidia.com>
@leofang Thanks for the review! The new workflow is meant to be temporary. It helps us to track and verify the runner fixes (it goes green when the runner's trust stores are cleaned up). We will want to see it stay green for some time--a month or two, say--and then remove it. |
|
/ok to test ca21deb |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

Minor · important: Keep the bundled Node probe report-only. · runner-trust-probe.yml:127-133
.github/workflows/runner-trust-probe.yml:127-133
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick winimportant: Keep the bundled Node probe report-only.
The workflow runs on schedule and manual dispatch, but this step enables the helper’s default gating. A runner with Node
v24.21.0therefore callscore.setFailed(...)and fails its job. Setgating: falseandcontinue-on-error: true, as the Node 20 informational probe does.Suggested fix
- name: Probe bundled Node runtime and trust store if: ${{ always() }} + continue-on-error: true uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const probe = require(`${process.env.GITHUB_WORKSPACE}/ci/tools/runner_trust_probe_node.js`); - await probe({ core }); + await probe({ core, gating: false });

Review info
-
Run configuration-
- Source mode: Auto
- Repository: NVIDIA/cuda-python
- Branch: main
- File: .coderabbit.yaml
- Commit: f9212dd
- Layers: Repository YAML
- Review profile: CHILL
- Plan: Enterprise
- Run ID:
49f5dbb6-b04b-418b-b006-a5f3a42ce248
Files selected for processing: 2-
.github/workflows/runner-trust-probe.ymlci/tools/runner_trust_probe.ps1
Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 9 remain after this review.
-
CI: add temporary runner certificate trust store probe (#3251) Add a report-only workflow (weekly schedule + workflow_dispatch with an optional label-filter regex) that checks whether each hosted and self-hosted runner label still trusts the compromised eMudhra "emSign ECC Root CA - G3" anchor. For each label it probes: - the OS trust store: emSign G3 absent from the CA bundle or Windows Root store, and curl / Invoke-WebRequest reject the test endpoint; - the runner agent's bundled Node.js: Node 24 >= v24.22.1, and https.get rejects the test endpoint (plus an informational node20 check). Linux GPU labels are probed in the ubuntu:24.04 container used by test jobs; ubuntu-latest is probed before and after upgrading ca-certificates. Probe files are added to IGNORED_PATHS so probe-only changes skip the wheel builds. Delete the workflow and ci/tools/runner_trust_probe* once all labels pass and the rollout is complete. Refs #3195
This question made me look at stats, first with Yes. Your installed cloc . --exclude-ext=pyi \
--exclude-content='CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE'I reproduced your original totals exactly. That command reduces 355,665 → 135,462 code lines, removing 61.9%. It leaves 1,115 counted files, 38,468 blank lines, and 43,448 comment lines. All 51 tracked After also excluding documentation prose and vendored code:
The library implementation consists of 24,800 lines in core, 2,900 in pathfinder, and 4,588 in the two bindings packages’ authored glue. So infrastructure narrowly construed is about 17k lines, including documentation tooling. Grouping all tests, examples, benchmarks, and tooling as supporting code gives 86k supporting versus 32k library, about 2.7:1. These use |
I created a tracking issue: #3257 |
Description
Refs #3195
Note
Temporary incident tracker (not a permanent CI fixture): This workflow and its helper scripts exist solely to track and verify the runner-fleet remediation for the eMudhra/emSign CA compromise. It is report-only (never gates PRs or merges), requires no ongoing maintenance from the library team, and will be deleted once all hosted and self-hosted runner labels pass both checks (or the public test endpoint is retired).
Background
Following the eMudhra/emSign CA key compromise, hash-pinning individual downloads only protects those specific artifacts; general TLS traffic in CI (such as
actions/checkout,gh, the Actions cache/artifact services, and unpinned package downloads) still relies on the certificate stores present on the runner. Every runner has two independent trust stores: the operating system store (used bygit,curl,wget,gh, and Docker) and the root bundle compiled into the Node.js runtime shipped with the GitHub Actions runner agent (used by JavaScript actions likeactions/cacheandactions/upload-artifact). Because updating those stores depends on upstream GitHub-hosted image rollouts and self-hosted runner maintenance outside this repository, this probe gives us and the runner operators direct visibility into which runner labels still trust the compromisedemSign ECC Root CA - G3anchor until the rollout completes.What turns a probe job green (and how to test fixes)
The goal is to get every runner label's probe job to green, at which point this workflow can be removed. A label's job turns green when both stores on that runner are remediated:
emSign ECC Root CA - G3is absent from/etc/ssl/certs/ca-certificates.crt(on Ubuntu 22.04/24.04/26.04, viaca-certificates>= 20260816ubuntu0.{22,24,26}.04.1; onubuntu-latest, baked into the base runner image itself rather than only afterapt-get upgrade), andcurldoes not trusthttps://dv-g3b-emudhra.we-have-a-problem.com/.emSign ECC Root CA - G3is absent fromCert:\LocalMachine\Root(or present inCert:\LocalMachine\Disallowed), andInvoke-WebRequestdoes not trust the test endpoint.>= v24.22.1(first shipped inactions/runnerv2.338.1), and Node'shttps.getrejects the test endpoint's certificate chain. The probe checks the Node version directly, because a runner image can carry a different Node than its runner version implies (see the takeaways under Verification).Self-service verification (
workflow_dispatch): Beyond the weekly schedule, the workflow supports manualworkflow_dispatchtriggers with an optionallabel-filterregex input (for example,^linux-amd64-cpu8$or^windows-amd64-gpu-l4-latest-1$). The runner team can use this at any time to re-probe specific runner labels on demand and verify image or runner-agent updates without waiting for the scheduled run or probing scarce multi-GPU runners.Changes
.github/workflows/runner-trust-probe.yml(schedule+workflow_dispatchwith an optionallabel-filterregex). GPU runner labels are derived fromci/test-matrix.yml; hosted and self-hosted CPU labels are listed explicitly.ubuntu:24.04container for Linux GPU labels, host for Linux CPU and Windows labels, and both before and afterapt-get install --only-upgrade -y ca-certificatesonubuntu-latest). The post-upgrade probe verifies that this stopgap works; the pre-upgrade probe gates the job as described above.ci/tools/runner_trust_probe.shandci/tools/runner_trust_probe.ps1to check thatemSign ECC Root CA - G3(86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B) is absent/untrusted, report the installedca-certificatespackage version, verify OS TLS clients (curl/Invoke-WebRequest) reject the test endpoint, and write summary tables to$GITHUB_STEP_SUMMARY.ci/tools/runner_trust_probe_node.jsto check the runner agent's bundled Node runtime (require Node 24>= v24.22.1and TLS certificate chain rejection of the test endpoint) plus an informationalnode20action runtime check.IGNORED_PATHSinci/tools/compute_ci_plan.pyso probe-only changes do not trigger full wheel builds.Verification
1070160643). That run predates the final simplification commit, so its step summaries differ slightly from current runs: itsca-certificatesrows carryINFO (STALE)/INFO (OK)markers, which current runs replace with the plain installed version, and its Node 20 step prints a single line instead of the full probe table. A full-fleetworkflow_dispatchrun covering the self-hosted CPU, Linux GPU (container), WSL, and Windows GPU labels is planned right after merge.ubuntu-latestnow maps to Ubuntu 26.04 withca-certificates20260601~26.04.1pre-installed; upgradingca-certificatesto20260816ubuntu0.26.04.1removesemSign ECC Root CA - G3and causescurlto reject the test endpoint.2.338.0, butubuntu-latestbundles Nodev24.22.1(fixed) whereas the three hosted Windows images cache Nodev24.21.0(unfixed).node20actions run onnode24: Hosted runners already forcenode20actions onto theirnode24runtime.Checklist
ci/tools/tests/test_compute_ci_plan.pycovers thecompute_ci_plan.pychange; the probe itself is temporary and report-only.