fix(deps): raise brace-expansion override floors to the actual backport (1.1.17 / 2.1.3) - #1117
fix(deps): raise brace-expansion override floors to the actual backport (1.1.17 / 2.1.3)#1117groupthinking wants to merge 1 commit into
Conversation
The OOM remediation for GHSA-mh99-v99m-4gvg landed in 1.1.17 and 2.1.3, but the nested pins were ^1.1.16 / ^2.1.2 -- both floors are themselves OOM-vulnerable. Resolution already sits at 1.1.18 / 2.1.4, so this is a manifest-only change with zero lockfile movement; it removes the vulnerable versions from the permitted set. Closes #1115 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are limited based on label configuration. 🏷️ Required labels (at least one) (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository YAML (base), Repository UI (inherited), Organization UI (inherited) Review profile: ASSERTIVE Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Snapshot WarningsEnsure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice. Scanned FilesNone |
Agent Completion Truth Gate: BLOCKEDReasons: Machine-readable verdict{
"details": {
"collection_errors": [
"incomplete_linked_issue_contract",
"missing_intent_snapshot",
"missing_agent_run_id",
"missing_agent_login"
],
"invalid_fields": [
"policy.agent_login",
"policy.run_id"
]
},
"reasons": [
"invalid_payload"
],
"verdict": "blocked"
} |
There was a problem hiding this comment.
Pull request overview
Raises vulnerable brace-expansion override floors to the patched backport versions, resolving #1115.
Changes:
- Raises 1.x floor from
^1.1.16to^1.1.17. - Raises 2.x floor from
^2.1.2to^2.1.3. - Preserves existing safe lockfile resolutions.
groupthinking
left a comment
There was a problem hiding this comment.
Independent verification (red-team pass)
Reviewed the diff and the underlying claim. Verdict: correct, minimal, and strictly safe to merge.
Safety of the change is independent of the CVE details. Raising ^1.1.16 → ^1.1.17 and ^2.1.2 → ^2.1.3 only removes the floor version from the permitted set — it cannot alter or break resolution here, because the tree already resolves above both floors (1.1.18 / 2.1.4). The M package.json-only / zero-lockfile-movement result is consistent with that, and npm-audit + dependency-review are green on the head SHA.
Both backport versions are real. Confirmed against the npm registry:
brace-expansion@1.1.17— published (gitHead5c57cc2)brace-expansion@2.1.3— published (gitHead878df39)
So the new floors are satisfiable and the override block stays effective even if a future install would otherwise land on the floor itself — which is precisely the exposure this PR closes.
CI: all substantive checks green (test, build, guards, lint py/js, Security Scan py/js, npm-audit, bandit, python-safety, trivy, CodeQL, gitleaks, dependency-review, Vercel preview READY, Copilot reviewer). agent-completion/truth-gate = NOT_APPLICABLE (pass).
Remaining blockers are human-only, by design: the red PR Governance / Agent completion enforcement / Canonical issue and evidence gates are the repo's fail-closed provenance system, and merge targets protected main. No agent action clears those — this is ready for maintainer governance sign-off and merge. I'm deliberately not approving or merging, so as not to manufacture the authorization those gates withhold.
Note: CodeRabbit auto-review was skipped here because the PR carries no label matching its required-label filter; adding e.g. a dependencies/javascript label (or commenting @coderabbitai review) would enable its pass if you want a second automated opinion.
Generated by Claude Code
groupthinking
left a comment
There was a problem hiding this comment.
Review (automated, review-requested trigger): change is correct, minimal, and complete. LGTM on the code.
I verified the two things the per-pin evidence table doesn't directly cover — the diff in isolation, and the rest of the manifest:
1. The floors now sit above the vulnerable versions. ^1.1.17 permits 1.1.17 … <2.0.0; ^2.1.3 permits 2.1.3 … <3.0.0. Both exclude the vulnerable floors (1.1.16 / 2.1.2) while still allowing the resolutions already in the lockfile (1.1.18 / 2.1.4). Nested "minimatch@3.1.5": { "brace-expansion": … } override syntax is valid npm and unchanged in shape — only the version string moved.
2. Completeness — no other vulnerable brace-expansion floor remains. I read the whole overrides block plus devDependencies on the head SHA. There are exactly three brace-expansion references in the manifest:
minimatch@3.1.5→^1.1.17✅ (this PR)minimatch@9.0.9→^2.1.3✅ (this PR)- top-level
devDependencies.brace-expansion→^5.0.8✅ (already patched 5.x)
So after this PR the permitted set is patched everywhere it's expressed. Good.
CI status. The substantive checks are green: test, build, lint-frontend/lint-python, CodeQL, dependency-review ("No vulnerabilities or license issues"), npm-audit, bandit, python-safety, trivy, gitleaks, and the agent-completion/truth-gate (not_applicable: all rules passed). The PR's own note that npm audit's 12 highs are unchanged-and-expected (the advisory's single <= 5.0.7 range matches the 1.x/2.x copies regardless of the backport) is accurate — that's advisory-metadata noise, not something upgradable, and correctly scoped out here.
One note for the merger (not a code issue). mergeable_state is unstable because three repo-governance checks are red — Agent completion enforcement, PR Governance, Canonical issue and evidence — plus Generate and Upload Coverage was still in progress at review time. None of these relate to this two-character dependency change (they're red across the open-PR queue). If any are branch-protection-required, they'll need to pass or be waived before this can merge; that's a governance decision for a human, not a fix to this diff.
I did not merge — main is protected and this is an unattended run. No code changes requested.
Generated by Claude Code
|
Returned to draft at exact head The one-file manifest change has successful CI, Coverage, CodeQL, Security, Secret Scan, Dependency Review, and READY Vercel preview evidence; E2E is repository-skipped and there are zero review threads. CodeRabbit skipped review because the PR lacked a qualifying label, and no complete implementation execution receipt exists on #1115 or #1117. Added |
|
Heads-up: I landed the same floor bump in #1226 before spotting this PR — apologies for the overlap. The
This branch is 26 commits behind and would need a rebase regardless. Since #1226 carries the identical fix plus the guard that stops the floors silently regressing, I'd suggest closing this one in favour of it — but happy to do the reverse (close #1226, port the guard here) if you'd rather keep this branch. Your call. |
|
Heads-up: this PR and #1226 are mutually blocking each other on the governance gate. Both are open and both declare Comparison, for whoever decides:
#1226 was opened two minutes before this PR was last touched, is substantially larger, and was updated last — which reads like it supersedes this one, though I have not confirmed that. Unblocking it needs only one of:
Not touching either PR — both are yours and both are drafts. Flagging only because the mutual-block is not obvious from the PR page; it is only visible by reading the gate workflow. |
Closing in favour of #1226 — this branch is orphanedTwo things:
The work is genuinely outstanding — So #1226 should be landed, not just kept open. Tracked in #1378. Branch retained for archive-tagging. Generated by Claude Code |
Canonical issue
Closes #1115
Outcome
The nested
brace-expansionoverride floors now sit at or above the release that actually contains the OOM remediation. Previously both floors (^1.1.16,^2.1.2) were themselves vulnerable, so the tree was safe only by luck of caret resolution — any install that landed on the floor would have been exploitable. This makes the safe outcome guaranteed by the manifest rather than incidental.Scope
overridesblock —^1.1.16→^1.1.17,^2.1.2→^2.1.3.package-lock.json(unchanged — resolution already satisfies the new floors), thenpm auditadvisory noise (unfixable by upgrade, see below), and the broader override-floor sweep tracked in Raise npm transitive override floors to patched versions #1105.Risk
npm ciinstalls 1.1.18 / 2.1.4 / 5.0.8 with exit 0, andnpm install --package-lock-onlyproduces no lockfile diff — meaning no edge was constrained to the old floors.3e141b3ae). Nothing else references these pins and the lockfile never moved, so revert is a pure no-op on the installed tree.Verification
Run in a clean worktree off
main(abd93326b), verified on head3e141b3ae:npm citree: 1.1.18, 2.1.4, 5.0.8 all returnlen=100000(capped) under--max-old-space-size=512; none OOM.build,test,lint-frontend,npm-audit,dependency-review,CodeQL,trivy,gitleaks,guardson this head.git status --porcelain→M package.jsononly, zero lockfile movementnpm install --package-lock-only --legacy-peer-deps→ no lockfile diff (resolution already satisfies the new floors)npm ci --legacy-peer-deps→ exit 0, 719 packagesnpm run build:web→ exit 0apps/weblint → exit 0Production evidence
Vercel preview built and deployed successfully from this exact head (
3e141b3ae): https://vercel.com/garv1/v0-uvai/2M2jWgVT8SUDwShk9SydgoEbeAVo —Vercel,Vercel Agent Review, andVercel Preview Commentsall report SUCCESS.Because the lockfile does not move, the deployed artifact is byte-identical to what
mainproduces today. This change constrains what future installs are permitted to resolve; it does not alter the currently deployed tree. That is precisely the intent — it removes a latent path to a vulnerable version rather than fixing an active one.Problem
The root
overridesblock pins nestedbrace-expansionfor twominimatchversions:Both floors are themselves vulnerable to the OOM described in GHSA-mh99-v99m-4gvg. The 100000-entry expansion cap was backported in 1.1.17 and 2.1.3 — one patch above each pin. A clean install today happens to resolve 1.1.18 / 2.1.4, but nothing in the manifest requires that.
Why this wasn't obvious
GitHub's advisory record for GHSA-mh99 lists a single affected range (
<= 5.0.7, first patched5.0.8) and never enumerates the 1.x / 2.x lines — unlike sibling brace-expansion advisories, which carry per-major ranges. So the metadata gives no hint that a 1.x/2.x backport exists.Closed issue #1101 read that same metadata and concluded the 1.x/2.x pins were a "false positive — never affected." That conclusion (tree is safe) was right; the stated mechanism was wrong. They were affected, and they were patched.
Evidence — measured, not inferred
Each version installed standalone and run against two OOM vectors under
--max-old-space-size=512:{1..50000000}{a,b}×30Reproduce (
<v>= version under test):The change
Two characters.
^1.1.16→^1.1.17,^2.1.2→^2.1.3.npm auditstays noisy, and that is expectedAudit still reports the same 12 high advisories. Under semver
1.1.18 <= 5.0.7is true, so the advisory's single range keeps matching the 1.x/2.x copies regardless of the backport. That noise is not fixable by upgrading — no newer 1.x/2.x releases exist — and needs either an upstream advisory-metadata correction or a local waiver. Out of scope here. This PR fixes the permitted set, which is the part we control.Relationship to other work
package-lock.json, this one onlypackage.json. Disjoint files, no merge interaction in either order.brace-expansionpins specifically.CI note
Agent completion enforcementreportsmissing_trusted_publication. This is repo-wide and pre-existing: it requires a check run namedAgent Lock trusted publicationpublished by a trusted GitHub App that is not publishing. PRs #1108, #1103 and #1098 all show the same failure and were merged regardless. Nothing in this PR affects it.