Skip to content

fix(security): bump scripts undici to 7.28.0 (GHSA-vmh5-mc38-953g)#4350

Merged
koala73 merged 1 commit into
mainfrom
security/undici-ghsa-vmh5-7280
Jun 19, 2026
Merged

fix(security): bump scripts undici to 7.28.0 (GHSA-vmh5-mc38-953g)#4350
koala73 merged 1 commit into
mainfrom
security/undici-ghsa-vmh5-7280

Conversation

@koala73

@koala73 koala73 commented Jun 19, 2026

Copy link
Copy Markdown
Owner

Summary

Clears the repo-wide audit-lockfile (scripts) / security-audit failure that started blocking every PR (and main) when GHSA-vmh5-mc38-953g was published.

  • undici < 7.28.0 is vulnerable to a TLS certificate validation bypass via a dropped requestTls in the SOCKS5 ProxyAgent (high severity). The advisory landed in the live npm advisory DB after main's last green audit, so npm audit --omit=dev now flags it on any fresh run — the gate audits the lockfiles, not the diff, so it fails regardless of PR content.
  • scripts/package.json pins undici: "^7.0.0", which had resolved to 7.24.5 (inside the vulnerable >=7.23.0 <7.28.0 range).

Change

  • Bump the direct dep to undici: "^7.28.0" (first patched 7.x).
  • Add "undici": "$undici" to scripts overrides, forcing any future transitive copy to the direct, patched version — mirrors the existing "ws": "$ws" pin (fix(security): bump ws→8.21.0 and form-data→4.0.6 (unblock audit gate) #4322).
  • Lockfile regenerated with npm install --package-lock-only; only undici's version/integrity changed (4 lines).

Test plan

  • node .github/scripts/audit-production-dependencies.mjs --workspace scripts --package-json scripts/package.json --lockfile scripts/package-lock.json"0 high+ advisories", exit 0
  • Lockfile diff is undici-only (undici 7.24.5 → 7.28.0); no other packages touched
  • Minor bump within the already-declared ^7 range — no API break for the relay scripts

Unblocks the security-audit gate for the whole PR queue.

The production dependency audit (audit-lockfile / security-audit) went red
repo-wide when GHSA-vmh5-mc38-953g was published: undici < 7.28.0 is
vulnerable to a TLS certificate validation bypass via a dropped requestTls
in the SOCKS5 ProxyAgent (high). scripts/ pins undici ^7.0.0 and resolved to
7.24.5, which is in the vulnerable >=7.23.0 <7.28.0 range.

Bump the direct dep to ^7.28.0 (first patched 7.x) and add the matching
`"undici": "$undici"` override so any future transitive copy is forced to the
direct, patched version — same pattern as the existing `"ws": "$ws"` pin.
Lockfile regenerated with `npm install --package-lock-only`; only undici's
version/integrity changed.

Verified: `node .github/scripts/audit-production-dependencies.mjs --workspace
scripts ...` now reports "0 high+ advisories". Unblocks the security-audit
gate for every open PR.
@vercel

vercel Bot commented Jun 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
worldmonitor Ready Ready Preview, Comment Jun 19, 2026 5:19am

Request Review

@greptile-apps

greptile-apps Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR bumps undici in the scripts workspace from 7.24.5 (resolved from ^7.0.0) to 7.28.0 to address GHSA-vmh5-mc38-953g, a TLS certificate validation bypass in the SOCKS5 ProxyAgent. The other workspaces in this repo (blog-site, consumer-prices-core, pro-test, root) only carry undici-types as a transitive dep, so no other lockfiles need updating.

  • Bumps undici minimum from ^7.0.0 to ^7.28.0 in scripts/package.json, and regenerates the lockfile with version 7.28.0.
  • Adds "undici": "$undici" to overrides, mirroring the existing "ws": "$ws" pattern to pin any future transitive copy to the patched direct dependency.

Confidence Score: 5/5

Safe to merge — the lockfile diff is limited to undici's version, resolved URL, and integrity hash; no other packages are touched.

The change is a minimal, targeted dependency bump. The override pattern mirrors the established ws pin and correctly forces any transitive copy to the patched version. No other workspaces in the repo carry the full undici package, so the scope of the change is exactly right.

No files require special attention.

Important Files Changed

Filename Overview
scripts/package.json Bumps undici from ^7.0.0 to ^7.28.0 and adds override pin — correctly addresses GHSA-vmh5-mc38-953g.
scripts/package-lock.json Lockfile updated from undici 7.24.5 to 7.28.0; only undici version, resolved URL, and integrity hash changed.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["scripts/package.json\nundici: '^7.28.0'"] -->|"direct dep"| B["node_modules/undici\nv7.28.0 ✅"]
    A -->|"overrides: undici: '$undici'"| C["Any transitive\ncopy of undici"]
    C -->|"forced to"| B
    B -->|"fixes"| D["GHSA-vmh5-mc38-953g\nTLS cert validation bypass\nin SOCKS5 ProxyAgent"]
    E["Old: undici ^7.0.0\nresolved → 7.24.5 ❌"] -->|"vulnerable range\n>=7.23.0 <7.28.0"| D
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["scripts/package.json\nundici: '^7.28.0'"] -->|"direct dep"| B["node_modules/undici\nv7.28.0 ✅"]
    A -->|"overrides: undici: '$undici'"| C["Any transitive\ncopy of undici"]
    C -->|"forced to"| B
    B -->|"fixes"| D["GHSA-vmh5-mc38-953g\nTLS cert validation bypass\nin SOCKS5 ProxyAgent"]
    E["Old: undici ^7.0.0\nresolved → 7.24.5 ❌"] -->|"vulnerable range\n>=7.23.0 <7.28.0"| D
Loading

Reviews (1): Last reviewed commit: "fix(security): bump scripts undici to 7...." | Re-trigger Greptile

@koala73
koala73 merged commit f88345c into main Jun 19, 2026
25 checks passed
@koala73
koala73 deleted the security/undici-ghsa-vmh5-7280 branch June 19, 2026 05:22
koala73 added a commit that referenced this pull request Jun 22, 2026
PR #4350 bumped scripts undici to ^7.28.0 AND added an `overrides.undici:
"$undici"` self-reference on main after this branch was cut. This branch had
the version bump but not the override, leaving scripts/package.json diverged
from main while the lockfile matched — which trips the pre-push lockfile-sync
gate. Add the missing override so scripts/package.json matches main exactly;
the lockfile is unchanged (already resolves undici 7.28.0).

Claude-Session: https://claude.ai/code/session_01KfKU1FUhPKvLQhU8tiUSfy
koala73 added a commit that referenced this pull request Jun 22, 2026
* fix(dashboard): gate live media on intent

* fix(live-media): harden lifecycle/race edges from PR review

Apply confirmed code-review findings on top of the intent-gating change:
- enforceExclusiveLiveMediaPlayback now deterministic (prefer live-news from
  both panels) so the surviving stream on always-on-off is not insertion-order
  dependent; cancel pending lazy-init when leaving always-on
- clear stuck .loading spinner on interrupted switchChannel early-returns
- restore deferredInit=true in triggerInit (re-entry guard)
- LiveWebcamsPanel.destroy() disconnects the IntersectionObserver first to
  avoid a teardown-time re-render/iframe leak
- drop the double stopLiveMediaForClose() on panel close (applyPanelSettings
  already fires it for disabled panels)
- guard stop callbacks: skip renderPlaceholder on a detached panel; skip
  webcam render() while document.hidden
- pauseForIdle arms idle-resume deterministically from isPlaying
- safe guards: clear eco idle timer in stopLiveMediaForClose; resumeFromIdle
  short-circuits when already owning media; isPanelVisible false on detached
  element; webcam settings-change won't start media while hidden
- add unit tests for the deterministic exclusive-survivor (preferred + fallback)

Claude-Session: https://claude.ai/code/session_01KfKU1FUhPKvLQhU8tiUSfy

* chore(scripts): align undici override with main (#4350)

PR #4350 bumped scripts undici to ^7.28.0 AND added an `overrides.undici:
"$undici"` self-reference on main after this branch was cut. This branch had
the version bump but not the override, leaving scripts/package.json diverged
from main while the lockfile matched — which trips the pre-push lockfile-sync
gate. Add the missing override so scripts/package.json matches main exactly;
the lockfile is unchanged (already resolves undici 7.28.0).

Claude-Session: https://claude.ai/code/session_01KfKU1FUhPKvLQhU8tiUSfy
koala73 added a commit that referenced this pull request Jun 22, 2026
…up tests

Code-review follow-ups for #4345:
- scripts/package.json: re-add overrides.undici "$undici" to match main
  (post-#4350). scripts/ is now byte-identical to main, clearing the husky
  pre-push lockfile-sync gate and re-pinning transitive undici. Lockfile is
  unchanged (already dedupes to 7.28.0).
- analytics.ts: fix the loadUmamiScript existing-script branch (flush only
  when window.umami is set, else attach the load listener; set
  umamiLoadStarted to close the re-entry gap); make initAnalytics synchronous
  (no await, sole caller voids it); add resetAnalyticsForTesting; move the
  #4183 data-domains note next to UMAMI_DOMAINS as the single source of truth.
- index.html: trim the Umami comment to a pointer at the new source of truth.
- tests: add coverage for scheduleAfterFirstPaint load-listener + rIC-absent
  fallback branches, Umami retry-exhaustion, 50-cap queue overflow,
  throw-then-queue-then-flush, and the existing-script branch.
- e2e: replace the flaky 250ms wait with the deterministic
  wmEventHandlersReady readiness gate.

Claude-Session: https://claude.ai/code/session_015dspobi7rUanvd9zSamz8a
koala73 added a commit that referenced this pull request Jun 22, 2026
* perf(dashboard): defer secondary startup payloads

* fix(security): bump scripts undici

* test(dashboard): assert deferred analytics startup

* fix(analytics): queue umami events on throw + restore happy Nunito italic

- sendUmamiCall: return false in the catch so a throwing window.umami
  defers to the bounded queue/flush path instead of silently dropping the
  event (callers only queue when sendUmamiCall returns false).
- buildDashboardFontStylesheetHref: restore the Nunito italic axis
  (ital,wght@0,400;0,600;0,700;1,400) the narrowed request dropped;
  happy-theme.css uses font-style:italic on Nunito-bodied elements, so the
  weight-only request regressed those to synthesized oblique. Weight
  narrowing (no 300) preserved.
- Update the two font-href assertions that had locked in the regression.

Addresses ce-code-review findings on PR #4345.

Claude-Session: https://claude.ai/code/session_0187W7sB8cdp8sYK7J7qDNLn

* fix(analytics): align scripts undici override + harden deferred-startup tests

Code-review follow-ups for #4345:
- scripts/package.json: re-add overrides.undici "$undici" to match main
  (post-#4350). scripts/ is now byte-identical to main, clearing the husky
  pre-push lockfile-sync gate and re-pinning transitive undici. Lockfile is
  unchanged (already dedupes to 7.28.0).
- analytics.ts: fix the loadUmamiScript existing-script branch (flush only
  when window.umami is set, else attach the load listener; set
  umamiLoadStarted to close the re-entry gap); make initAnalytics synchronous
  (no await, sole caller voids it); add resetAnalyticsForTesting; move the
  #4183 data-domains note next to UMAMI_DOMAINS as the single source of truth.
- index.html: trim the Umami comment to a pointer at the new source of truth.
- tests: add coverage for scheduleAfterFirstPaint load-listener + rIC-absent
  fallback branches, Umami retry-exhaustion, 50-cap queue overflow,
  throw-then-queue-then-flush, and the existing-script branch.
- e2e: replace the flaky 250ms wait with the deterministic
  wmEventHandlersReady readiness gate.

Claude-Session: https://claude.ai/code/session_015dspobi7rUanvd9zSamz8a
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.

1 participant