Skip to content

fix(security): update transitive nanoid for CVE-2026-67213 #75

Description

@seonghobae

Problem

Protected main still resolves nanoid@3.3.16, affected by GHSA-2v37-7h3g-55p8 / CVE-2026-67213 (<3.3.17). The vulnerable package is transitive through postcss@8.5.25, whose declared range accepts the patched 3.3.17. Until the protected branch integrates the bounded remediation, direct-main PRs that inherit main continue to fail npm audit --audit-level=high even when their own tests are green.

Do not weaken npm audit, lower severity, add an ignore/VEX waiver, or duplicate the lockfile fix across unrelated branches.

Active root remediation

PR #76 is the canonical remediation line.

Fresh source identity:

  • protected/base main: 9adb784902cae19a150146a8fadd6a0491f67814;
  • PR fix(security): update transitive nanoid for CVE-2026-67213 #76 exact head: e0106ce16b7b8b493f46bf075ec5baf58762bd95;
  • package-lock delta: existing node_modules/nanoid object only, 3.3.16 -> 3.3.17 plus the corresponding registry URL and integrity value;
  • PostCSS declaration remains unchanged.

The branch also binds its own CI/reviewer checkout to the immutable PR head and fixed Node/npm execution identity rather than treating a moving runtime as dependency evidence.

Current exact-head proof for #76

All three PR-associated workflows for unchanged exact head e0106ce16b7b8b493f46bf075ec5baf58762bd95 are terminal success:

  • application ci run 31252585269: exact-head checkout/assertion, Node 24.19.0, npm 11.17.0, frozen install, 62 test files / 646 tests, configured 100% statements/branches/functions/lines, and npm audit --audit-level=high with 0 vulnerabilities;
  • reviewer-ci run 31252585267: terminal success under its own exact-head verification and reviewer quality gates;
  • central Security Scan run 31252585268: terminal success, with OSV explicitly comparing base 9adb784... to exact head e0106c...; its Trivy synthetic-merge result remains integration evidence rather than being mislabeled exact-head evidence.

Current CodeRabbit findings on #76 are resolved/outdated after revalidation. Formal review evidence remains COMMENTED only; no qualifying non-author APPROVED review is present.

Fresh collaborator probes still show opencode-agent has repository permission none; cwl-noema-review has no usable collaborator permission. Those previously rejected routes are not retried until eligibility changes.

Repository-wide impact still visible

PR #69 exact head 0689fa6933dfc8db89abd053427a78a45455c86c passed 82 test files / 873 tests with configured 100% statements/branches/functions/lines, then failed only when release:verify reached npm audit --audit-level=high and found nanoid <3.3.17 inherited from protected main.

The same inherited boundary affects direct-main #65/#71/#72/#85/#86/#88 until #76 integrates. Stacked #87/#89/#80 deliberately inherit #76 and can prove their unique work without copying the lockfile remediation.

Post-#76 integration fan-out / overlap RCA

A fresh changed-file and three-way-ancestry audit shows that simply merging #76 is not enough: dependent branches must be refreshed in an order that preserves later control-plane and documentation changes. Old checks/reviews do not transfer.

First protected-lineage controls after #76

PRs that must refresh after #89 or reconcile its controls

Other dependent lines

Current convergence sketch:

#76
├─ #87 ─┐
├─ #89 ─┼─> #80
│       ├─> #69
│       └─> #88
├─ #71 -> #83 -> #86
├─ #65 -> #67
├─ #72
└─ #85

This is a current dependency/overlap plan, not timeless architecture. Recompute exact ancestry and changed-file overlap after every protected merge or branch movement.

Acceptance criteria

Repository-owned remediation

  • Keep the remediation minimal and deterministic: nanoid@3.3.17 without unrelated lock metadata churn.
  • Preserve PostCSS's existing compatible dependency declaration.
  • Keep frozen install and npm audit --audit-level=high unchanged.
  • Record exact toolchain/source/evidence semantics in authoritative doctoring and ## Unreleased CHANGELOG.
  • Verify unchanged fix(security): update transitive nanoid for CVE-2026-67213 #76 exact head with application CI, reviewer CI and Security Scan.
  • Resolve/revalidate all current source-review findings without waiver or protection bypass.

Merge / protected-main acceptance

  • Prove the live main ruleset/governance required by issue chore(governance): protect main and enforce release checks #27 is enforceable, including required current evidence and direct-push/break-glass controls.
  • Satisfy the qualifying independent non-author formal-review requirement under live Noema/CWL governance; issue chore(operations): provision and activate hourly maintainer App #29 owns Reviewer/Maintainer App provisioning where selected.
  • Merge the unchanged approved fix(security): update transitive nanoid for CVE-2026-67213 #76 exact head without weakening gates.
  • Refetch protected main and verify integrated nanoid@3.3.17 plus clean npm audit --audit-level=high.
  • Refresh dependent branches from the integrated protected lineage using the current overlap graph, preserving all unique files/contracts and reacquiring exact-head/security/review evidence.
  • Recompute the graph after every protected integration; never assume the above historical heads remain current.

Safety boundary

Do not create/reuse .github/workflows/repair-*, self-modifying Actions, PR-branch patch workflows, write-capable one-shot finalizers, audit waivers, severity reductions, synthetic approval, destructive rebase/force push, or no-op churn merely to retrigger checks/reviews.

Related: #27, #29, #65, #67, #69, #71, #72, #76, #77, #79, #80, #83, #85, #86, #87, #88, #89

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions