Skip to content

fix(security): move off EOL Node 25 to 24.22.1 for eMudhra CA compromise - #4

Merged
carjessu-trm merged 1 commit into
devfrom
security/node-emudhra-patch
Oct 21, 2026
Merged

carjessu-trm merged 1 commit into
devfrom
security/node-emudhra-patch

Conversation

@carjessu-trm

@carjessu-trm carjessu-trm commented Oct 21, 2026 •

Copy link
Copy Markdown

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.yml and release.yml caged builds: platformatic/node-caged:25-alpine -> platformatic/node-caged:26.12.1-alpine@sha256:fe8ec905…. node-caged publishes no 24.x tags (24-alpine and 24.22.1-alpine both 404); only 25.x and 26.x exist. 26.12.1 is the patched option that keeps the caged variant. I confirmed v26.12.1 from the binary in the amd64 image, since the image sets no NODE_VERSION.
  • .github/workflows/release.yml: setup-node lts/* -> '24.22.1'.
  • package.json engines.node: "25" -> "24.22.1 || 26.12.1". pnpm fails the install when the root project's engines.node doesn't match, so it has to cover both base images. CI's falcondev-it/.github/actions/pnpm-install also reads it through node-version-file: package.json, so lint, type-check and unit tests run on one of these two patched versions. Upstream moved engines from 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-alpine is the Docker Hub multi-arch index digest; I verified NODE_VERSION=24.22.1 on 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

  • Checked the engines range with semver: 24.22.1 and 26.12.1 pass; 24.21.0, 25.9.0 and 22.23.4 fail. package.json parses. No local build; CI on this PR runs lint, type-check and unit tests.
  • After merge to dev: ci-cd.yml publishes ghcr.io/trmlabs/github-actions-cache-server:dev and :dev-caged. Nothing deploys those images.

Deploy impact: this PR does not patch the running cache server

The github-runners cluster runs upstream's image. trm-infra github-runners/terraform/gcp-us-central1/trm-github-runners/10-arc/main.tf (helm_release.actions_cache_server) installs oci://ghcr.io/falcondev-oss/charts/github-actions-cache-server 1.0.2 with image.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 point image.repository and image.tag there. Caveats:

Not in this PR

  • Syncing the fork with upstream, and the trm-infra change to switch helm_release.actions_cache_server to 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.

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>
@stepsecurity-app

Copy link
Copy Markdown

Security Policy Alert: Runner Label Policy Violation

This 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:

  • ubuntu-latest

To fix this issue, please modify the runs-on field in your workflow to use only allowed runner labels. Contact your organization administrator if you need further assistance.

For more information, see StepSecurity's Runner Label Policy documentation.

@carjessu-trm
carjessu-trm merged commit a421bc0 into dev Oct 21, 2026
1 of 23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant