Repository navigation
[EXPIN-51] chore(security): pin dev/CI Node to 22.23.4 (CVE-2026-111497) - #353
Open
Micah Heineck (micahheineckoptimizely) wants to merge 1 commit into
Open
Micah Heineck (micahheineckoptimizely) wants to merge 1 commit into
Micah Heineck (micahheineckoptimizely) wants to merge 1 commit into
Conversation
Pin the Node used for development, CI and publishing to the patched 22.23.4 release (CVE-2026-111497, Brotli decoder OOB write). Files: - .nvmrc: v18 -> v22.23.4 - .devcontainer/devcontainer.json: javascript-node:1-18-bullseye -> javascript-node:1-22-bullseye + node feature pinned to 22.23.4 - .github/workflows/react_release.yml: node-version 22 -> 22.23.4 - .github/workflows/ghr_backfill.yml: node-version 18 -> 22.23.4 - .github/workflows/react.yml: matrix leg '22' -> '22.23.4' (18/20/24 compatibility legs unchanged) package.json engines (>=18.0.0) intentionally unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This branch has not been deployed
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.
Ticket: EXPIN-51
Summary
Pins the Node.js version used for local development, CI and npm/GHR publishing to 22.23.4, the patched release for CVE-2026-111497 (out-of-bounds write in Node's bundled Brotli decoder, possible RCE). Node 16/18/20 are end-of-life and get no fix, so the
.nvmrc, devcontainer and GHR backfill job (all on 18) move up a major. The release job (already on 22) gets a patch bump to an exact pin.This is a customer-facing library. The change covers only the Node we build, test and publish with. It does not change the published support policy (
engines) or what customers run.Files changed (old → new)
.nvmrcv18v22.23.4.devcontainer/devcontainer.jsonjavascript-node:1-18-bullseyejavascript-node:1-22-bullseye+ghcr.io/devcontainers/features/node:1withversion: 22.23.4.github/workflows/react_release.yml(publish to npm + GHR)node-version: 22node-version: 22.23.4.github/workflows/ghr_backfill.yml(publish npm tarballs to GHR)node-version: 18node-version: 22.23.4.github/workflows/react.yml(unit test matrix)'22'leg'22.23.4'leg ('18','20','24'unchanged)No
package.json,package-lock.jsonor source changes.Why each one:
1-22-bullseyeships Node 22.16.0, which is still vulnerable. Thenodefeature installs exactly 22.23.4 through nvm and puts it first onPATH. I kept the base OS (bullseye) to keep the change small.npm viewandnpm packagainst npmjs, thenscripts/publish.shtonpm publishthe unmodified npm tarballs to GHR (--ignore-scripts, no rebuild). It only uses the npm CLI,curl,jqandtar, with no project build. Node 22 is fine for it, and the bump also matches it to the release job.Upgrade analysis
Local dev and CI move from 18 to 22.23.4. The release job was already on 22, so for publishing this is only a patch bump.
rollup.config.mjsusesimport … with { type: 'json' }, which Node 22 supports. The repo has no webpack or babel. TS is compiled bytsc, and the tests are transformed by vitest/esbuild.enginesof^20.0.0 || ^22.0.0 || >=24.0.0,^20.19.0 || >=22.12.0and>=20.0.0. They already exclude Node 18.npm cion 18 printsEBADENGINEwarnings for all three. So the old.nvmrcv18 dev setup was outside the test toolchain's declared support, and moving to 22 fixes that.tsc --noEmitplus eslint report 0 errors and the same 9 warnings as before.tsconfigdoesn't depend on it, so there is no change.md4/legacy hashes. The build doesn't need--openssl-legacy-provider.esbuild,@esbuild/*,@rollup/rollup-*,fsevents). They are chosen by OS/CPU, not by Node ABI.enginesexcluding 22: none. I checked all 474 lockfile entries against 22.23.4.npm ciunder 22.23.4 (npm 10.9.9) installs from the existing lockfile (v3) with no changes. No lockfile churn is committed.dist/built on Node 18.20.8 and on Node 22.23.4 is byte-identical:react-sdk.es.min.mjs,server.es.min.mjs, the sourcemaps and the.d.tsfiles have the same SHA-1. Thenpm packfile lists are identical too. The bundle is still ESM targeting browsers/React, so runtime support doesn't change.Verification
Run locally on macOS from a fresh clone of
masterwith this branch applied:Compatibility matrix and
engines(owners' call)react.yml, the${{ matrix.node }}matrix tests customer compatibility. Only the22leg is pinned, to22.23.4. The18and20legs are unchanged. They are EOL with no fix for this CVE, but they still test the publishedengines: >=18.0.0range. Keeping or dropping them is the owners' call. Note that the test toolchain (vitest 4/vite 7/happy-dom 20) already declares it doesn't support Node 18. The 18 leg passes today only because npm treatsEBADENGINEas a warning. The24leg is unchanged and floats to the latest 24.x (24.22.1+ includes the fix).Run Unit Tests (Node 22)toRun Unit Tests (Node 22.23.4). It is not a required status check (the master ruleset requires only Arnica), so merging isn't affected.package.jsonengines(>=18.0.0) is intentionally unchanged, because it is the published support policy.🤖 Generated with Claude Code