CVE-2026-73088 CVE-2026-73089 browserslist: Prototype write via untrusted custom stats and unbounded cache growth (-> 4.28.9) - #1123
Merged
vharseko merged 1 commit intoSep 7, 2026
Conversation
Combines dependabot PRs OpenIdentityPlatform#1121 (openam-ui-ria, 4.25.4 -> 4.28.9) and OpenIdentityPlatform#1122 (openam-ui-js-sdk, 4.28.2 -> 4.28.9) into a single change, so both UI modules land on the same browserslist and transitive versions: baseline-browser-mapping 2.11.21, caniuse-lite 1.0.30001810, electron-to-chromium 1.5.422, node-releases 2.0.54, update-browserslist-db 1.3.2. Upstream fixes picked up in this range: prototype pollution (4.28.2), unbounded memory growth and a prototype write issue (4.28.7), plus query-parsing performance improvements. Supersedes OpenIdentityPlatform#1121, OpenIdentityPlatform#1122
utafrali
approved these changes
Sep 7, 2026
utafrali
left a comment
There was a problem hiding this comment.
Clean, well-scoped security update that consolidates two Dependabot bumps into one PR. The prototype pollution fix (4.28.2) and unbounded memory growth fix (4.28.7) are worth picking up promptly, and limiting changes to package-lock.json files keeps the blast radius to zero at runtime.
This was referenced Sep 7, 2026
maximthomas
approved these changes
Sep 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps
browserslistto 4.28.9 in both UI modules —openam-ui-ria(4.25.4 -> 4.28.9) andopenam-ui-js-sdk(4.28.2 -> 4.28.9) — replacing the two separate Dependabot pull requests #1121 and #1122 with a single change. Both modules sat below 4.28.7 and were therefore in the affected range of both advisories:CVE-2026-73088 — uncaught crash and prototype write in
normalizeStats()node.js'snormalizeStats()walks an untrustedstatsobject with a barefor...inand uses each key for plain-object bracket access. That object comes from abrowserslist-stats.jsonfile auto-discovered by walking up the directory tree from the project root — read on everybrowserslist()call, whatever the query — or fromopts.stats/ the CLI--stats=flag. Two bugs share the root cause:data[i]carries nohasOwnPropertyguard, so a key that happens to name an inheritedObject.prototypemember (toString,valueOf,constructor,__proto__, …) resolves to that inherited function, anddata[i].versions.lengththrows an uncaughtTypeError.normalized[i] = …withiexactly"__proto__"invokes the realObject.prototype.__proto__setter, rewriting the fresh object's[[Prototype]]instead of creating a plain property.A poisoned
browserslist-stats.jsoncommitted anywhere between the project root and the filesystem root therefore breaks every subsequent Browserslist call in that tree — including the calls Autoprefixer, Babelpreset-env, PostCSS and Stylelint make internally, for entirely unrelated queries.CVE-2026-73089 — unbounded cache growth
browserslist()'s result cache andparseQueries()'s AST cache are plain objects keyed byJSON.stringify([queries, context])with no size cap, TTL or eviction, andbrowserslist.clearCaches()does not reset either one.since <year>-<month>-<day>queries accept any digit combination —Date.UTC()normalizes out-of-range values rather than rejecting them — giving an effectively unbounded space of ~17-byte cache keys that each retain a result close to the full ~8.5 KB browser list. Upstream measured over 50 MB permanently retained from 20,000 such queries, growing linearly with no observed cap. 4.28.7 replaces both caches withMaps bounded to 500 entries and oldest-first eviction.Scope in OpenAM
browserslistis a dev-only transitive dependency in both modules, reached through@babel/helper-compilation-targets(^4.24.0) and, inopenam-ui-ria, alsocore-js-compat(^4.25.3). It is a build-time input to Babel target resolution and does not ship in the WAR.Neither module carries a
browserslist-stats.json, a.browserslistrc, or abrowserslistkey inpackage.json, and the build issues a fixed set of queries rather than externally influenced ones, so neither advisory was exploitable in this build as it stands — the bump keeps the toolchain off the affected range and closes the door on abrowserslist-stats.jsonarriving through a future dependency or PR.openam-ui/openam-ui-api/package-lock.jsondoes not resolvebrowserslistat all, so no sibling module is left on the vulnerable version.Verified
package.jsonedit needed — 4.28.9 satisfies^4.24.0,^4.25.3and the>= 4.21.0peer range ofupdate-browserslist-dbintegrityhashes matchnpm view <pkg> dist.integrity:browserslist@4.28.9,baseline-browser-mapping@2.11.21,caniuse-lite@1.0.30001810,electron-to-chromium@1.5.422,node-releases@2.0.54,update-browserslist-db@1.3.2openam-ui-riaadditionally picks up the separate prototype-pollution fix of 4.28.2 and the>/>=and Electron query fixes of 4.28.5/4.28.6, whichopenam-ui-js-sdkalready hadUpstream: 4.28.7 release · f9914ad (custom-stats fix) · f2931a3 (bounded caches) · 4.28.9 release · changelog
Closes #1121
Closes #1122