Repository navigation
fix(security): move off EOL Node 25 to 24.22.1 for eMudhra CA compromise - #4
Merged
Merged
Conversation
INC-3583 / PSE-1636. Node bundles its own CA store; only the Node security releases fix it, and Node 25 is EOL with no fix. Default image node:24.22.1-alpine (digest-pinned); caged image platformatic/node-caged:26.12.1-alpine because node-caged publishes no 24.x line. engines.node covers both, since pnpm fails on a root engines mismatch and setup-node reads it via node-version-file. Co-authored-by: Cursor <cursoragent@cursor.com>
Security Policy Alert: Runner Label Policy ViolationThis workflow run has been blocked by StepSecurity's runner label policy because it uses runner labels that are not allowed by your organization's policy. Disallowed Runner Labels:
To fix this issue, please modify the For more information, see StepSecurity's Runner Label Policy documentation. |
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
INC-3583: the eMudhra (emSign) intermediate CA private key was compromised. Node.js bundles its own CA store, so only the Node security releases fix Node processes: v22.23.4 / v24.22.1 / v26.12.1 include nodejs/node#66871 (reject chains containing blocked public keys) and NSS 3.131.1. Tracking: Linear PSE-1636. Node 25 is EOL and gets no fix.
What changed
Dockerfile:ARG BASE_IMAGE=node:25-alpine->node:24.22.1-alpine@sha256:6a1c190e…. This is the Node 25 (EOL) -> 24.22.1 (Active LTS) move for the default image..github/workflows/ci-cd.ymlandrelease.ymlcaged builds:platformatic/node-caged:25-alpine->platformatic/node-caged:26.12.1-alpine@sha256:fe8ec905…. node-caged publishes no 24.x tags (24-alpineand24.22.1-alpineboth 404); only 25.x and 26.x exist. 26.12.1 is the patched option that keeps the caged variant. I confirmedv26.12.1from the binary in the amd64 image, since the image sets noNODE_VERSION..github/workflows/release.yml:setup-nodelts/*->'24.22.1'.package.jsonengines.node:"25"->"24.22.1 || 26.12.1". pnpm fails the install when the root project'sengines.nodedoesn't match, so it has to cover both base images. CI'sfalcondev-it/.github/actions/pnpm-installalso reads it throughnode-version-file: package.json, so lint, type-check and unit tests run on one of these two patched versions. Upstream movedenginesfrom 24 to 25 only when it added the caged variant (f77794b), and nothing in the code uses a Node 25-only API.node:24.22.1-alpineis the Docker Hub multi-arch index digest; I verifiedNODE_VERSION=24.22.1on amd64, arm64 and s390x.Why exact versions
Floating tags resolve to older cached patches on our runners, and a digest pin stays on whatever Node it was built with.
Validation
enginesrange with semver: 24.22.1 and 26.12.1 pass; 24.21.0, 25.9.0 and 22.23.4 fail.package.jsonparses. No local build; CI on this PR runs lint, type-check and unit tests.dev:ci-cd.ymlpublishesghcr.io/trmlabs/github-actions-cache-server:devand:dev-caged. Nothing deploys those images.Deploy impact: this PR does not patch the running cache server
The
github-runnerscluster runs upstream's image.trm-infragithub-runners/terraform/gcp-us-central1/trm-github-runners/10-arc/main.tf(helm_release.actions_cache_server) installsoci://ghcr.io/falcondev-oss/charts/github-actions-cache-server1.0.2 withimage.tag = "9.4.7". The repository is the chart default,ghcr.io/falcondev-oss/github-actions-cache-server, and that image runs Node 25.9.0. This fork's change only helps once we build our own image and pointimage.repositoryandimage.tagthere. Caveats:9.4.7and9.8.0run Node 25.9.0, and upstreamdevruns 26.10.0. Upstream standardized on Node 26 in build: standardize on Node 26 falcondev-oss/github-actions-cache-server#272 (2026-10-01), but no release includes it.devis at v9.4.2, behind the deployed 9.4.7. An image built from it would drop the 9.4.4 stale-entry fix and the 9.4.7 scope-fallback fix (fix: fall back to next scope when no restore keys falcondev-oss/github-actions-cache-server#229) thatmain.tfpins for. Sync the fork with upstream before switching the cluster to it.Not in this PR
helm_release.actions_cache_serverto a patched image. Upstream is moving to Node 26; aligning this fork's default image on 26.12.1 instead of 24.22.1 would reduce drift if we sync.