CVE-2026-73088: Browserslist DoS crash via untrusted stats file in normalizeStats

CVE-2026-73088 · Severity: high · CVSS 7.5 · Published 2026-08-11

Browserslist is a library used by web build tools (Babel, PostCSS, Stylelint, Autoprefixer) to determine which browser versions a project should target. An attacker can place a malicious browserslist-stats.json file in a project's directory tree, or supply crafted stats data, causing the library to crash with an uncaught error on any browserslist() call. Since stats files are auto-discovered and processed on every call regardless of query, a single poisoned file breaks all downstream build and CI pipelines that invoke the library, even indirectly through other tools.

Technologies: browserslist (npm). Vendors: npm.

Quick answers

Is CVE-2026-73088 exploited in the wild?
No. Junglewise Threat Intelligence has no report of CVE-2026-73088 being exploited in the wild.
How severe is CVE-2026-73088?
High severity, with a CVSS score of 7.5, published 11 August 2026.
Which products and versions are affected?
browserslist (npm) <= 4.28.6, SEMVER:introduced=0,fixed=4.28.7.
Is there a fix for CVE-2026-73088?
Yes. browserslist (npm): upgrade to 4.28.7 or later. Junglewise finds every place you run it, drafts the upgrade and applies it once you approve.
How is CVE-2026-73088 attacked?
It is attacked over the network or with local access, in a software library.
Am I affected by CVE-2026-73088?
Check whether you run browserslist (npm) at an affected version. Junglewise does that check for you around the clock: connect your code, cloud and domains, and it matches new vulnerabilities like this one against what you actually run and tells you when one reaches you.

How to fix

  • browserslist (npm): upgrade to 4.28.7 or later
    npm install browserslist@4.28.7

Technical details

The vulnerability exists in the normalizeStats() function in node.js (line ~214), which processes untrusted stats data loaded from browserslist-stats.json files (auto-discovered by directory traversal on every browserslist() call) or from opts.stats passed programmatically/via CLI. The function iterates over stats keys using an unguarded for...in loop and performs bracket access/assignment without hasOwnProperty checks. Two independent bugs result: (1) Crash—when a stats key matches an inherited Object.prototype member name like "__proto__", "toString", or "valueOf", the check data[i] resolves to the inherited function instead of undefined, then accessing data[i].versions.length on a non-object (function) throws an uncaught TypeError; (2) Prototype pollution—assignment to normalized[i] when i === "__proto__" invokes the __proto__ setter, mutating the object's [[Prototype]]. The fix uses Object.create(null) for normalized objects and adds an explicit hasOwnProperty guard for data lookups. Patched in version 4.28.7.

Affected products

  • browserslist browserslist <= 4.28.6

Identifiers

  • CVE-2026-73088
  • GHSA-73wf-gq98-2v4g

Timeline

  • 2026-09-01: disclosed: GHSA advisory published
  • 2026-09-01: patched: Fix released in browserslist 4.28.7
  • 2026-08-11: kev added: CVE-2026-73088 published in NVD

References

This page as Markdown. Free to reuse under CC BY 4.0 with a link back.