8000 Update node to 26.12.1 and node-lts to 24.22.1 (security; upstream eMudhra fix, drop carried patches) by bryan-minimal · Pull Request #968 · gominimal/pkgs · GitHub
[go: up one dir, main page]

Update node to 26.12.1 and node-lts to 24.22.1 (security; upstream eMudhra fix, drop carried patches) - #968

Merged
bryan-minimal merged 1 commit into
mainfrom
update-node-26.12.1-lts-24.22.1
Oct 22, 2026
Merged

bryan-minimal merged 1 commit into
mainfrom
update-node-26.12.1-lts-24.22.1

Conversation

@bryan-minimal
@bryan-minimal bryan-minimal commented Oct 21, 2026 •
Copy link
Copy Markdown
Member

Updates node 26.10.0 → 26.12.1 and node-lts 24.19.0 → 24.22.1, both upstream security releases (2026-10-20/21).

Security fixes picked up (from the upstream release notes)

Carried patches dropped (now upstream)

  • cve-2026-111943-tls-spki-blocklist.patch and cve-2026-111943-drop-emsign-roots.patch (both packages, from SECURITY: node, node-lts: backport CVE-2026-111943 eMudhra fixes (nodejs/node#66871, #66877) #946): upstream now contains both changes.
  • node's lief-1.x-macho-section-ctor.patch: 26.12.1 handles the LIEF 1.x API itself (#if LIEF_VERSION_MAJOR >= 1 … Section::create(...) in src/node_sea_bin.cc). I confirmed the old patch neither applies nor reverse-applies to 26.12.1, so upstream rewrote that code rather than taking the patch.
  • With no patches left, patch is dropped from both packages' build deps.

Kept: fail-closed guards and tests

  • build.sh in both packages now checks upstream's fix instead of applying it. The build fails if kBlockedSPKIs or InstallCertVerifyCallback(sc->ctx_.get()) is missing from src/crypto/crypto_context.cc, or if emSign ECC Root CA - G3 reappears in src/node_root_certs.h. Run against the real 26.12.1 and 24.22.1 sources: pass. Negative control (the root put back): fails, exit 1.
  • SECURITY: node, node-lts: backport CVE-2026-111943 eMudhra fixes (nodejs/node#66871, #66877) #946's standalone tests stay as they were: emsign_roots_removed, and spki_blocklist_rejects_emudhra_intermediate, which uses a local TLS server with the real compromised intermediate and expects CERT_REVOKED. They now exercise upstream's code.

Source change for node

node's source was a mirrored GitHub tag archive (gs://…/node-26.10.0.tar.gz, sha dadc307a…, which is not nodejs.org's node-v26.10.0.tar.gz, 093087c5…). It now uses nodejs.org's release tarball, the same as node-lts. Both shas were verified against nodejs.org's SHASUMS256.txt (node 717244a8…, node-lts 001773d9…). build.sh extracts node-v${version} accordingly.

Checks

  • nickel format --check clean, bash -n clean, MINIMAL_SCIENCE_MODE=1 mip dump --packages evaluates on amd64 and arm64.
  • Rebuild scope: node, node-lts and the npm ecosystem behind node-lts (~26 dependents).

Heads-up

  • pkgs#817 (llhttp wasm rebuild) also edits packages/node*/build.{ncl,sh}; whichever merges second needs a merge from main.
  • Closes gominimal/pkgmgr-rs#1016 (drop the eMudhra backport once upstream releases).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Updates

    • Updated Node.js to 26.12.1 and Node.js LTS to 24.22.1.
    • Builds now use official Node.js release archives.
  • Security

    • Included upstream protections against compromised emSign and eMudhra certificates.
    • TLS, DTLS, and QUIC certificate verification now blocks affected certificate keys and rejects compromised emSign root certificates.
    • Added build-time checks to ensure these protections remain present.

…d patches)

Both are upstream security releases and both carry the CVE-2026-111943
fixes (nodejs/node#66871 SPKI blocklist, #66877 NSS 3.131.1 roots), so the
backports from #946 are dropped; node 26.12.1 also handles the LIEF 1.x
Section API itself, so its LIEF patch goes too, and with it the `patch`
build dep. build.sh now fails closed if a future version regresses either
fix. node moves to nodejs.org's release tarball (same as node-lts), sha
verified against SHASUMS256.txt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@bryan-minimal
bryan-minimal requested a review from a team as a code owner October 21, 2026 23:36
@coderabbitai
coderabbitai Bot commented Oct 21, 2026 •
Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: gominimal/pkgs/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: 5594f426-9857-448a-b656-af1d0d807338
📥 Commits

Reviewing files that changed from the base of the PR and between a19e4dc and 28b8257.

📒 Files selected for processing: 9
  • packages/node-lts/build.ncl
  • packages/node-lts/build.sh
  • packages/node-lts/cve-2026-111943-drop-emsign-roots.patch
  • packages/node-lts/cve-2026-111943-tls-spki-blocklist.patch
  • packages/node/build.ncl
  • packages/node/build.sh
  • packages/node/cve-2026-111943-drop-emsign-roots.patch
  • packages/node/cve-2026-111943-tls-spki-blocklist.patch
  • packages/node/lief-1.x-macho-section-ctor.patch
💤 Files with no reviewable changes: 5

Included review availability: This review used your included allowance. 0 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 2 reviews per hour.

📝 Walkthrough

Node and Node LTS are updated to releases that include the upstream CVE fixes. The local CVE patches and the Node LIEF compatibility patch are removed. Build scripts check for the upstream protections and absence of the compromised emSign root.

Changes: Node release adoption

Layer / File(s) Summary
Select upstream Node releases
packages/node/build.ncl, packages/node-lts/build.ncl
Node updates to 26.12.1 and Node LTS to 24.22.1. Node now uses the official release archive. Both package declarations remove local patch dependencies.
Verify upstream fixes and remove local patches
packages/node/build.sh, packages/node-lts/build.sh, packages/node/*cve-2026-111943*.patch, packages/node-lts/*cve-2026-111943*.patch, packages/node/lief-1.x-macho-section-ctor.patch
Build scripts check for the SPKI blocklist and verification callback, and fail if the emSign root remains. The local CVE patches and Node LIEF patch are deleted.

Priority: ⬆️ High

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Other

Possibly related issues

  • pkgmgr-rs issue 1022 — The PR updates both Node packages, removes the carried CVE patches, and checks for the upstream fixes described by this tracker.

Suggested reviewers: mitodrummer, msample

Merge Risk: ⚪ Minimal · up to 28b82

The release sources and LIEF compatibility checks found no issue requiring a change before merge.

Pre-merge checks: Passed 5
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly identifies the Node.js version updates and the removal of carried security patches. It accurately summarizes the main changes.
Linked Issues check Passed Issue [#1016] requires Node 26.x and 24.x LTS releases that contain both CVE-2026-111943 fixes, deletion of both carried patches, and protection against double application. The PR sets versions to 26.…
Out of Scope Changes check Passed The changes stay within Issue [#1016]. The node source-tarball correction and LIEF patch removal support the required version bump and the new upstream source. The fail-closed build guards and standal…
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2…
Full details: Linked Issues check

Explanation

Issue [#1016] requires Node 26.x and 24.x LTS releases that contain both CVE-2026-111943 fixes, deletion of both carried patches, and protection against double application. The PR sets versions to 26.12.1 and 24.22.1, uses verified nodejs.org release checksums, deletes both patch files for each package, removes the patch dependencies, and removes patch application commands. Both build scripts fail when the upstream SPKI blocklist or certificate callback is absent. The package tests check removal of all three compromised emSign roots and reject a real blocked intermediate with CERT_REVOKED.

Full details: Out of Scope Changes check

Explanation

The changes stay within Issue [#1016]. The node source-tarball correction and LIEF patch removal support the required version bump and the new upstream source. The fail-closed build guards and standalone TLS/root tests verify that the carried fixes were replaced by upstream fixes. No unrelated implementation or test changes are shown.

Full details: Docstring Coverage

Explanation

No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2 files. (2 skipped: 2 unsupported.)

✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@norrietaylor norrietaylor left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

  • Both tarballs match nodejs.org's SHASUMS256.txt.
  • The dropped patches really are upstream: kBlockedSPKIs is byte-identical to our backport's table (#66871), the three emSign roots are gone (#66877), and the LIEF code was rewritten upstream.
  • The 15-minute build matches a real node rebuild.

On #817: let's land this first with nodejs.org as the source for both node and node-lts. #817 then needs to re-derive its pins, not just merge main: bundled undici moves to 8.12.2 (node) and 7.30.1 (node-lts), amaro to 1.1.11, and the sha-pinned undici.js blobs will change. #817 should also switch node-lts back to nodejs.org.

Nits:

  • The build.sh:16 guard only greps for G3. C1 and C3 are covered only by the test.
  • Stale comments at build.ncl:160,164 ("patched callback") and :125 (26.9.0), and the same in node-lts.
  • The PR body rates CVE-2026-106072 as High; the advisory says Medium. It also omits the two Low Permission Model CVEs. The OpenSSL note doesn't apply under --shared-openssl.

Generated by Claude Code

@bryan-minimal
Copy link
Copy Markdown
Member Author

tls-trust harness (#976) run against this PR's head 28b82577, per its per-PR flow: [upstream] pinned to this branch, then min task run for live, offline, live-alt and offline-alt on aarch64.

node 26.12.1 and node-lts 24.22.1: FIXED in every mode.

row live (head) offline (head)
node v26.12.1 FIXED, 12/12 refused FIXED
node-blocklist (26.12.1) FIXED, 12/12 refused with the emSign anchors trusted N/A (live-only)
node-sysca (26.12.1) FIXED FIXED
node v24.22.1 (node-lts) FIXED FIXED
node-blocklist (24.22.1) FIXED, anchors trusted N/A (live-only)
node-sysca (24.22.1) FIXED FIXED

node-blocklist is the row that matters for dropping the backport. The anchors are trusted there, so only node's own kBlockedSPKIs can refuse, and upstream's table does it on both lines.

SELFTEST read FIXED and NEGCONTROL VULNERABLE in every run, so the run is valid.

One VULNERABLE row, not caused by this PR: pip 26.2.1 accepts the emSign targets. This branch predates #950 (pip 26.2.2 in ensurepip), so it builds the older python. The PR changes only packages/node and packages/node-lts, and main already has #950. The same run at main befeac7d reads pip 26.2.2 FIXED, with every row FIXED and exit 0.

🤖 Generated with Claude Code

@bryan-minimal
bryan-minimal added this pull request to the merge queue Oct 22, 2026
Merged via the queue into main with commit c074ce7 Oct 22, 2026
11 checks passed
@bryan-minimal
bryan-minimal deleted the update-node-26.12.1-lts-24.22.1 branch October 22, 2026 22:41
bryan-minimal added a commit that referenced this pull request Oct 22, 2026
…24.22.1, #968)

#968 moved both node lines to nodejs.org release tarballs with no carried
patches (the CVE-2026-111943 fixes and LIEF 1.x are upstream). The two
build.ncl conflicts are resolved by taking main's recipe (nodejs.org Source,
no patch Locals, no `patch` dep) and re-applying this branch's additions:
the llvm / wasi-libc / llhttp-wasm-rebuild / amaro-wasm build deps, the
mirrored npm-undici Source, the type_strip test, and the bundled-version
lets, now forwarded through build_args (undici, undici_llhttp, npm_undici,
amaro) and re-derived from the 26.12.1 / 24.22.1 trees. node-lts goes back
to nodejs.org, as review asked. build.sh merged cleanly (main's guards kept).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants

0