Skip to content

fix(ci): pin Node releases with incident key rejection - #306

Merged
joshavant merged 2 commits into
mainfrom
security/emudhra-node-release
Oct 22, 2026
Merged

joshavant merged 2 commits into
mainfrom
security/emudhra-node-release

Conversation

@joshavant

@joshavant joshavant commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

What Problem This Solves

Managed CI, hydration and release jobs can select cached Node versions that trust the compromised eMudhra keys.

User Impact

Pin Node 26.12.1 within the existing release line. Installed products and the Actions runner require separate updates.

Why This Change Was Made

Exact fixed patches prevent old cache entries from satisfying setup-node, including its fallback after manifest-resolution failure.

Evidence

Changed workflows passed duplicate-key YAML validation. Unchanged application and Go suites were not rerun. Independent review and git diff --check passed. Official Linux arm64 release binaries rejected all 12 incident chains in eight trust modes, with ordinary HTTPS controls passing. Other platform executions remain hosted CI proof.

Also upgrade Alpine ca-certificates and ca-certificates-bundle to 20261020-r0 in both image stages before network or build commands. The Go base already contains the older main package, so plain apk add ca-certificates retains its vulnerable roots. The normal signed package upgrade and real post-install trigger were tested: all twelve incident chains fail with the resulting CA file, hashed CA directory, their union, and cert.pem; a GitHub control succeeds. Application checks from the preceding head remain applicable because application code and build commands are unchanged. Rebuilt image publication and custom CA overrides remain separate.

@joshavant
joshavant requested a review from a team as a code owner October 21, 2026 21:29
@clawsweeper

clawsweeper Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. P2 Normal priority bug or improvement with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. labels Oct 21, 2026
@clawsweeper

clawsweeper Bot commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

What this changes

This PR pins Node to 26.12.1 in documentation CI and GitHub Pages deployment.

Example: A runner has Node 26.12.0 cached.

  • Before: The broad 26 selector can reuse that cached release.
  • After: The 26.12.1 selector excludes that cache entry and selects the patched release.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The minimal patch is supported by upstream release and action source evidence; runtime proof remains a narrative report.
Proof confidence 🦐 gold shrimp (3/6) The supplied policy exempts this maintainer-authored PR from the ordinary proof gate; its body reports official Linux arm64 binary rejection tests, but supplies no inspectable output demonstrating workflow selection and rejection together.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Maintenance · Worth it: Yes · Fix scope: Complete
User problem: Documentation automation can reuse a Node release lacking incident-key rejection.
Reason: The supplied review policy establishes maintainer-approved direction, and the verified upstream release and cache-selection contract support this narrowly scoped update.

Merge readiness

✅ Ready for maintainer review

Keep open: main still permits older cached Node 26 releases, and this PR narrowly pins both documentation workflows to the verified security release without introducing a concrete defect.

Priority: P2
Reviewed head: 13cca66449b30effd69c71b574d2afb5d60a64df

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: The reported incident-chain run has no attached trace mapping setup-node selection to rejection, although the supplied maintainer exemption makes ordinary proof non-blocking.
Agent review details

How this fits together

GitHub Actions selects Node before running documentation tests and generating the static site; the Pages workflow then publishes that site.

flowchart TD
  A[Workflow trigger] --> B[Setup Node]
  B --> C[Matching cache or official download]
  C --> D[Documentation tests]
  D --> E[Static site build]
  E --> F[Pages deployment]
Loading

Technical review

Best possible solution:

Use the exact patched Node release in both existing workflow owners.

Do we have a high-confidence way to reproduce the issue?

The workflows and pinned setup-node source establish how an older cached 26.x release can satisfy main's selector; no target code was executed.

Is this the best way to solve the issue?

The two exact version substitutions are the smallest complete fix for these workflows and retain the intentionally selected Node major.

AGENTS.md: found but not applied because it conflicted with ClawSweeper's review contract.

Codex review notes: model internal, reasoning medium; reviewed against 6d670fc461f4.

Provenance checked

Testing

Proof path: none.

Security

None.

Evidence

What I checked:

Labels

Label changes:

  • add P2: A focused security dependency update prevents stale Node selection in documentation workflows; no current application outage is established.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Label justifications:

  • P2: A focused security dependency update prevents stale Node selection in documentation workflows; no current application outage is established.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Attach redacted terminal output showing the workflow-selected Node 26.12.1 rejecting an incident chain while an ordinary HTTPS control succeeds.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

Reviewed October 21, 2026, 5:42 PM ET / 21:42 UTC.

@joshavant
joshavant merged commit 0932353 into main Oct 22, 2026
18 of 19 checks passed
@joshavant
joshavant deleted the security/emudhra-node-release branch October 22, 2026 17:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant