Skip to content

Update browserslist to clear a high severity advisory - #10

Merged
zerotrustdavid merged 1 commit into
mainfrom
main-s6rx8d
Sep 5, 2026
Merged

Update browserslist to clear a high severity advisory#10
zerotrustdavid merged 1 commit into
mainfrom
main-s6rx8d

Conversation

@zerotrustdavid

Copy link
Copy Markdown
Owner

npm audit --audit-level=high began failing on an advisory published after the last release, with nothing in this repository having changed. That step runs in the verify job, and verify is a required status check on main with an empty bypass list — so this blocked every pull request from merging, including this one until it lands.

The advisory

browserslist <= 4.28.6 carries two:

Neither is reachable here

browserslist is a development-only transitive dependency, five levels down the lint toolchain:

payreckon@3.0.0
`-- eslint-config-next@16.3.2
  `-- eslint-plugin-react-hooks@7.1.1
    `-- @babel/core@7.29.7
      `-- @babel/helper-compilation-targets@7.29.7
        `-- browserslist@4.28.6

It never reaches the shipped bundle. Both advisories need attacker-controlled input — a caller issuing many distinct queries, or an untrusted stats file — and neither path exists in this project. Babel invokes it during lint, against the repository's own configuration.

This is a CI unblock rather than a response to exploitable risk, and it is worth being clear about which of the two it is.

What changed

Lockfile only. The advisory range is satisfied by a version the existing constraints already admit, so there is no package.json change and no constraint to relax.

Six version updates, all within the browserslist chain and its data packages:

Package From To
browserslist 4.28.6 4.28.9
baseline-browser-mapping 2.10.43 2.11.21
caniuse-lite 1.0.30001805 1.0.30001810
electron-to-chromium 1.5.391 1.5.422
node-releases 2.0.51 2.0.54
update-browserslist-db 1.2.3 1.3.2

Six additions, all optional: true and dev: true, nested under @tailwindcss/oxide-wasm32-wasi — the @emnapi and @napi-rs WASM runtime fallbacks for Tailwind's native engine. These are platform variants npm filled in while re-resolving. They are not installed on this platform and do not reach production.

Nothing removed.

The additions are the part worth checking rather than waving through, since new packages are exactly where an install script would arrive unnoticed. npm run check:install-scripts still reports the same two allowlisted dev-only entries, fsevents and unrs-resolver, and nothing else.

Verification

On a clean npm ci --ignore-scripts install from the new lockfile:

Check Result
npm audit --audit-level=high exit 0
npm run lint exit 0
npm test 11 files, 155 passed
npm run palette All checks passed
npm run build 19/19 routes generated

🤖 Generated with Claude Code

https://claude.ai/code/session_01V7eMcH6kHFssQ2Pxt7MnQx


Generated by Claude Code

`npm audit --audit-level=high` began failing on a advisory published after
the last release, with nothing in this repository having changed. That step
runs in the `verify` job, and `verify` is a required status check on `main`
with an empty bypass list, so this blocked every pull request from merging.

browserslist <= 4.28.6 carries two advisories:

- GHSA-c83g-rgw3-j3cx, unbounded memory growth with no cache eviction,
  leading to eventual OOM
- GHSA-73wf-gq98-2v4g, crash or prototype write via an untrusted
  browserslist-stats.json

Neither is reachable here. browserslist is a development-only transitive
dependency five levels down the lint toolchain, by way of
eslint-config-next -> eslint-plugin-react-hooks -> @babel/core ->
@babel/helper-compilation-targets. It never reaches the shipped bundle.
Both advisories need attacker controlled input, either a caller issuing many
distinct queries or an untrusted stats file, and neither path exists in this
project: Babel invokes it during lint against the repository's own
configuration.

So this is a CI unblock rather than a response to exploitable risk, and it
is worth being clear about which of the two it is.

Lockfile only. The advisory range is satisfied by a version the existing
constraints already admit, so no package.json change and no constraint to
relax.

The change resolves to six version updates, all within the browserslist
chain and its data packages: browserslist itself, plus
baseline-browser-mapping, caniuse-lite, electron-to-chromium, node-releases
and update-browserslist-db.

It also adds six packages, all of them optional and development only,
nested under @tailwindcss/oxide-wasm32-wasi: the @emnapi and @napi-rs WASM
runtime fallbacks for Tailwind's native engine. These are platform variants
npm filled in while re-resolving. They are not installed on this platform
and do not reach production. Confirmed they introduce no install scripts:
`npm run check:install-scripts` still reports the same two allowlisted
dev-only entries, fsevents and unrs-resolver, and nothing else.

Verified on a clean `npm ci --ignore-scripts` install from the new lockfile:
`npm audit --audit-level=high` exits 0, lint clean, 155 tests pass, palette
checks pass, production build succeeds with all 19 routes generated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V7eMcH6kHFssQ2Pxt7MnQx
@vercel

vercel Bot commented Sep 5, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
payreckon Ready Ready Preview Sep 5, 2026 1:43am UTC

@zerotrustdavid
zerotrustdavid merged commit 2897c3d into main Sep 5, 2026
7 checks passed
@zerotrustdavid
zerotrustdavid deleted the main-s6rx8d branch September 5, 2026 07:36
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