🔒 Dependency Dashboard #2

Open
opened 2026-08-27 23:05:00 +00:00 by Headscracher · 0 comments
Owner

🔒 Dependency Dashboard (20)

17 unknown · 2 high · 1 moderate

Severity Package Installed Fixed in Advisory
Unknown atk 0.18.2 none yet RUSTSEC-2024-0413
Unknown atk-sys 0.18.2 none yet RUSTSEC-2024-0416
Unknown gdk 0.18.2 none yet RUSTSEC-2024-0412
Unknown gdk-sys 0.18.2 none yet RUSTSEC-2024-0418
Unknown gdkwayland-sys 0.18.2 none yet RUSTSEC-2024-0411
Unknown gdkx11 0.18.2 none yet RUSTSEC-2024-0417
Unknown gdkx11-sys 0.18.2 none yet RUSTSEC-2024-0414
Unknown glib 0.18.5 0.20.0 RUSTSEC-2024-0429
Unknown gtk 0.18.2 none yet RUSTSEC-2024-0415
Unknown gtk-sys 0.18.2 none yet RUSTSEC-2024-0420
Unknown gtk3-macros 0.18.2 none yet RUSTSEC-2024-0419
Unknown proc-macro-error 1.0.4 none yet RUSTSEC-2024-0370
Unknown unic-char-property 0.9.0 none yet RUSTSEC-2025-0081
Unknown unic-char-range 0.9.0 none yet RUSTSEC-2025-0075
Unknown unic-common 0.9.0 none yet RUSTSEC-2025-0080
Unknown unic-ucd-ident 0.9.0 none yet RUSTSEC-2025-0100
Unknown unic-ucd-version 0.9.0 none yet RUSTSEC-2025-0098
🟠 High 7.5 browserslist (dev) 4.28.1 4.28.7 GHSA-73wf-gq98-2v4g · CVE-2026-73088
🟠 High 7.5 browserslist (dev) 4.28.1 4.28.7 GHSA-c83g-rgw3-j3cx · CVE-2026-73089
🟡 Moderate 6.9 glib 0.18.5 0.20.0 GHSA-wrw7-89jp-8q8g
atk 0.18.2 — gtk-rs GTK3 bindings - no longer maintained

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at gtk4-rs instead.


affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock`

<https://crates.io/crates/atk> · <https://rustsec.org/advisories/RUSTSEC-2024-0413.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6>

</details>

<details><summary>atk-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary>

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/atk-sys · https://rustsec.org/advisories/RUSTSEC-2024-0416.html · https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6

gdk 0.18.2 — gtk-rs GTK3 bindings - no longer maintained

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at gtk4-rs instead.


affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock`

<https://crates.io/crates/gdk> · <https://rustsec.org/advisories/RUSTSEC-2024-0412.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6>

</details>

<details><summary>gdk-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary>

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/gdk-sys · https://rustsec.org/advisories/RUSTSEC-2024-0418.html · https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6

gdkwayland-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at gtk4-rs instead.


affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock`

<https://crates.io/crates/gdkwayland-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0411.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6>

</details>

<details><summary>gdkx11 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary>

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/gdkx11 · https://rustsec.org/advisories/RUSTSEC-2024-0417.html · https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6

gdkx11-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at gtk4-rs instead.


affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock`

<https://crates.io/crates/gdkx11-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0414.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6>

</details>

<details><summary>glib 0.18.5 — Unsoundness in `Iterator` and `DoubleEndedIterator` impls for `glib::VariantStrIter`</summary>

The `VariantStrIter::impl_get` function (called internally by implementations of the `Iterator` and `DoubleEndedIterator` traits for this type) was unsound, resulting in undefined behaviour.

An immutable reference `&p` to a `*mut libc::c_char` pointer initialized to `NULL` was passed as an argument to a C function that that mutates the pointer behind `&p` in-place (i.e. as an out-argument), which was unsound. After changes in recent versions of the Rust compiler, these unsound writes through `&p` now seem to be completely disregarded when building the `glib` crate with optimizations.

This subsequently caused all calls of `VariantStrIter::impl_get` to violate the safety requirements of the `std::ffi::CStr::from_ptr` function - which requires its argument to be a valid pointer to a C-style string - resulting in crashes due to `NULL` pointer dereferences.

This was fixed by passing the out-argument pointer explitly as `&mut p` instead of `&p`.

This issue has been present since this code was initially added in `glib` v0.15.0. The mismatch in mutability was likely missed (and not raised as an error by the compiler) because the C function wrapped by `VariantStrIter::impl_get` is variadic (`glib_sys::g_variant_get_child`), and the pointer in question is one of the variadic arguments.

affected `>=0.15.0 <0.20.0` · found in `src-tauri/Cargo.lock`

<https://crates.io/crates/glib> · <https://rustsec.org/advisories/RUSTSEC-2024-0429.html> · <https://github.com/gtk-rs/gtk-rs-core/pull/1343>

</details>

<details><summary>gtk 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary>

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/gtk · https://rustsec.org/advisories/RUSTSEC-2024-0415.html · https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6

gtk-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at gtk4-rs instead.


affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock`

<https://crates.io/crates/gtk-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0420.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6>

</details>

<details><summary>gtk3-macros 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary>

The gtk-rs GTK3 bindings are no longer maintained.

The maintainers have archived the repository, and added a note to the crate
description and its README.md that the crates are no longer maintained.

Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/gtk3-macros · https://rustsec.org/advisories/RUSTSEC-2024-0419.html · https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6

proc-macro-error 1.0.4 — proc-macro-error is unmaintained

proc-macro-error's maintainer seems to be unreachable, with no commits for 2 years, no releases pushed for 4 years, and no activity on the GitLab repo or response to email.

proc-macro-error also depends on syn 1.x, which may be bringing duplicate dependencies into dependant build trees.

Possible Alternative(s)

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/proc-macro-error · https://rustsec.org/advisories/RUSTSEC-2024-0370.html · https://gitlab.com/CreepySkeleton/proc-macro-error/-/issues/20

unic-char-property 0.9.0 — `unic-char-property` is unmaintained

All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/unic-char-property · https://rustsec.org/advisories/RUSTSEC-2025-0081.html · https://github.com/rustsec/advisory-db/issues/2414

unic-char-range 0.9.0 — `unic-char-range` is unmaintained

All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained.

  • Since version 1.45.0 Rust supports using char with ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo} to iterate over a range of codepoints.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/unic-char-range · https://rustsec.org/advisories/RUSTSEC-2025-0075.html · https://github.com/rustsec/advisory-db/issues/2414

unic-common 0.9.0 — `unic-common` is unmaintained

All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/unic-common · https://rustsec.org/advisories/RUSTSEC-2025-0080.html · https://github.com/rustsec/advisory-db/issues/2414

unic-ucd-ident 0.9.0 — `unic-ucd-ident` is unmaintained

All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/unic-ucd-ident · https://rustsec.org/advisories/RUSTSEC-2025-0100.html · https://github.com/rustsec/advisory-db/issues/2414

unic-ucd-version 0.9.0 — `unic-ucd-version` is unmaintained

All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained.

affected >=0.0.0-0 · found in src-tauri/Cargo.lock

https://crates.io/crates/unic-ucd-version · https://rustsec.org/advisories/RUSTSEC-2025-0098.html · https://github.com/rustsec/advisory-db/issues/2414

browserslist 4.28.1 — Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.json custom stats (normalizeStats)

Vulnerability Details

File: node.js
Function: normalizeStats() (line ~214), reached from getStat() (called
unconditionally on every browserslist() call) and loadStat()

Root Cause

function normalizeStats(data, stats) {
  if (!data) { data = {} }
  if (stats && 'dataByBrowser' in stats) { stats = stats.dataByBrowser }
  if (typeof stats !== 'object') return undefined

  var normalized = {}
  for (var i in stats) {
    var versions = Object.keys(stats[i])
    if (versions.length === 1 && data[i] && data[i].versions.length === 1) {
      var normal = data[i].versions[0]
      normalized[i] = {}
      normalized[i][normal] = stats[i][versions[0]]
    } else {
      normalized[i] = stats[i]
    }
  }
  return normalized
}

stats is untrusted: it comes from JSON.parse()-ing a
browserslist-stats.json file — auto-discovered by walking up the directory
tree from the project root on every browserslist() call, regardless of
the query
(env.getStat(opts, browserslist.data) runs unconditionally
inside browserslist()) — or from opts.stats passed programmatically /
via the CLI's --stats= flag. data is browserslist.data, a plain object
populated only with real browser names.

Two independent bugs from the same root cause (unguarded for...in over
untrusted keys used with plain-object bracket access/assignment):

  1. Crash: data[i] has no hasOwnProperty guard. If stats contains a
    key that also happens to be an inherited Object.prototype member name —
    "__proto__", "toString", "valueOf", "constructor",
    "hasOwnProperty", "isPrototypeOf", etc. — data[i] resolves to that
    inherited function/object (always truthy), and the code then does
    data[i].versions.lengthundefined.lengthuncaught TypeError,
    for any such key whose JSON value has exactly one sub-key, e.g.:
    { "toString": { "onekey": 5 }, "chrome": { "100": 50 } }
    
  2. Prototype write: normalized[i] = ... on the fresh
    normalized = {} — if i is exactly "__proto__" (and normalized has
    no own property by that name yet), this computed assignment invokes the
    real Object.prototype.__proto__ setter, changing normalized's actual
    [[Prototype]] instead of creating a plain property.

Because this runs on every browserslist() call regardless of the
query, simply committing a poisoned browserslist-stats.json anywhere in a
project's directory tree breaks every subsequent Browserslist call in that
project — including calls made by Autoprefixer, Babel preset-env,
Stylelint, or PostCSS internally, for completely unrelated queries.

Attack Scenario

  1. Attacker submits a PR (or a compromised dependency) adding a
    browserslist-stats.json file anywhere between the project root and
    filesystem root, containing e.g.
    {"toString": {"onekey": 5}, "chrome": {"100": 50}}.
  2. The victim's build/CI pipeline runs any tool that calls browserslist()
    internally, for any query.
  3. The auto-discovered poisoned file crashes the process with an uncaught
    TypeError on the very first call.

Measured Impact

Confirmed crash (real browserslist() call, v4.28.6) with stats keys:
__proto__, toString, valueOf, hasOwnProperty, constructor,
isPrototypeOf — each paired with a one-key JSON object — for any query,
including browserslist('defaults') which never mentions stats.

var normalized = Object.create(null)
for (var i in stats) {
  var versions = Object.keys(stats[i])
  var known = Object.prototype.hasOwnProperty.call(data, i) && data[i]
  if (versions.length === 1 && known && known.versions.length === 1) {
    var normal = known.versions[0]
    normalized[i] = Object.create(null)
    normalized[i][normal] = stats[i][versions[0]]
  } else {
    normalized[i] = stats[i]
  }
}
return normalized

normalized uses Object.create(null) so a write to "__proto__" is an
ordinary property set, never a [[Prototype]] change; data[i] is replaced
with an explicit hasOwnProperty check so it never resolves to an inherited
Object.prototype member.

Verification:

  • NODE_ENV=test npx uvu test .test.js → 301/301 pass unmodified
    (test/custom.test.js, test/shareable-stats.test.js, test/cover.test.js
    exercise the stats-handling paths).
  • All 6 previously crash-inducing keys, tested individually, now resolve
    without error.
  • The realistic file-based auto-discovery scenario (poisoned
    browserslist-stats.json + an unrelated browserslist('defaults') call)
    now returns a normal result instead of crashing.

Impact

  • Who is affected: Any project whose build/CI invokes Browserslist
    (directly or via Autoprefixer/Babel/Stylelint/PostCSS) in a directory tree
    an attacker can place a file into (external PR, compromised dependency),
    or any app that passes user-influenced data into opts.stats.
  • What an attacker achieves: Immediate DoS — crashes the invoking
    process on the first Browserslist call after the file is present, for any
    query, no special syntax needed.
  • Conditions required: No authentication — only the ability to add a
    file to the project's directory tree, or influence opts.stats.

Verification Environment

browserslist @ HEAD (== v4.28.6, current latest stable release) under local
Node.js v20.19.5. Pure JS library — executed directly, no server needed.

Note

Found via a systematic review of prototype-pollution-adjacent patterns in
this codebase after confirming two unrelated algorithmic-complexity issues
(reported separately as GHSA-rrmg-cfrq-23vv and GHSA-g6p8-hj8g-x889) in the
same research pass. A similar for...in + bracket-write pattern in
index.js's copyObject() (used by normalizeAndroidData) was already
guarded against __proto__/constructor/prototype keys by a prior,
unrelated commit — that guard was never applied to this function.

CWE-1321, CWE-248 · affected >=0 <4.28.7 · found in package-lock.json

https://github.com/browserslist/browserslist/security/advisories/GHSA-73wf-gq98-2v4g · https://nvd.nist.gov/vuln/detail/CVE-2026-73088 · https://github.com/browserslist/browserslist/commit/f9914ad9effc865ccc27d816255625890b31ca51 · https://github.com/browserslist/browserslist · https://github.com/browserslist/browserslist/releases/tag/4.28.7

browserslist 4.28.1 — Browserslist: Unbounded memory growth (no cache eviction) via distinct query results, leading to eventual OOM

Vulnerability Details

File: index.js
Location: cache (browserslist()'s result cache, line ~402) and
parseCache (parseQueries()'s AST cache)

Root Cause

var cache = {}
var parseCache = {}

function browserslist(queries, opts) {
  ...
  var cacheKey = JSON.stringify([queries, context])
  if (cache[cacheKey]) return cache[cacheKey]
  ...
  if (!env.env.BROWSERSLIST_DISABLE_CACHE) { cache[cacheKey] = result }
  return result
}

function parseQueries(queries) {
  var cacheKey = JSON.stringify(queries)
  if (cacheKey in parseCache) return parseCache[cacheKey]
  var result = parseWithoutCache(QUERIES, queries)
  if (!env.env.BROWSERSLIST_DISABLE_CACHE) { parseCache[cacheKey] = result }
  ...
}

Every distinct (queries, context) pair is cached forever — no size cap,
TTL, or eviction. browserslist.clearCaches() never resets either object
(it only resets node.js's own filesystem caches); the only opt-out is the
BROWSERSLIST_DISABLE_CACHE env var, controlled by the calling
application
, not an attacker.

Some short, valid queries amplify this badly. The since <year>-<month>-<day>
query type (/^since (\d+)-(\d+)-(\d+)$/i) accepts any digit
combination — Date.UTC() normalizes rather than rejects out-of-range
values — giving an effectively unbounded space of ~17-byte distinct cache
keys, each of which resolves to (and caches) a result close to the full
~8.5 KB browser list for any sufficiently old year.

Measured Impact

20,000 distinct since <year>-<month>-<day> queries (~330 KB total input,
--expose-gc before/after measurement to rule out uncollected garbage)
retained over 50 MB of heap permanently — roughly 150x
amplification, growing linearly with no cap observed up to 40,000 queries
(52.3 MB).

Attack Scenario

Any long-running process (server, daemon, warm CI worker) that calls
browserslist() with a query value that varies across requests/items and is
influenced, even partially, by external input accumulates one cache entry
per distinct value ever seen. An attacker who can influence that value
across many requests (this is a volumetric attack, unlike the
single-request DoS findings from this same research pass) sends a stream of
cheap, distinct queries (e.g. since 1900-01-01, since 1900-01-02, ...)
until the process runs out of memory and crashes.

Replace both plain-object caches with Maps bounded to a fixed maximum
entry count, evicting the oldest entry once the cap is reached (Map
preserves insertion order, so .keys().next().value is always oldest):

var CACHE_MAX_ENTRIES = 500

function boundedCacheSet(map, key, value) {
  if (map.size >= CACHE_MAX_ENTRIES) {
    map.delete(map.keys().next().value)
  }
  map.set(key, value)
}

var cache = new Map()
var parseCache = new Map()

(read sites changed to .has()/.get(), write sites to boundedCacheSet())

Verification:

  • NODE_ENV=test npx uvu test .test.js → 301/301 pass unmodified
    (test/cache.test.js exercises clearCaches()/BROWSERSLIST_DISABLE_CACHE
    against node.js's separate filesystem caches, unaffected here); confirmed
    a repeated identical call still returns the cached reference.
  • Re-ran the memory PoC post-fix: heap stayed flat at ~4.9 MB after 5,000,
    10,000, 20,000, and 40,000 distinct since-date queries (was
    10.5 → 16.5 → 28.4 → 52.3 MB pre-fix).

Impact

  • Who is affected: Long-running processes calling browserslist() with
    query values that vary across requests/items and are influenced by
    external input.
  • What an attacker achieves: DoS via eventual out-of-memory crash, given
    sustained traffic over time (not a single small payload).
  • Conditions required: No authentication; requires volume rather than a
    single request, hence Medium rather than High severity.

Verification Environment

browserslist @ HEAD (== v4.28.6, current latest stable release) under local
Node.js v20.19.5, run with --expose-gc for accurate heap measurement.

Note

Found during a broader review of this codebase in the same research pass
that produced GHSA-rrmg-cfrq-23vv (parse.js algorithmic complexity),
GHSA-g6p8-hj8g-x889 (baseline regexp ReDoS), GHSA-73wf-gq98-2v4g
(normalizeStats crash/prototype write), and GHSA-h633-868p-5rfw
(SCOPED_CONFIG__PATTERN ReDoS) — all single-request DoS vectors. This one is
different in character (volumetric, not single-request) and is reported
separately/scored lower accordingly.

CWE-770 · affected >=0 <4.28.7 · found in package-lock.json

https://github.com/browserslist/browserslist/security/advisories/GHSA-c83g-rgw3-j3cx · https://nvd.nist.gov/vuln/detail/CVE-2026-73089 · https://github.com/browserslist/browserslist/commit/f2931a3ff2a3a31abf84ef01a7400b270aad6405 · https://github.com/browserslist/browserslist · https://github.com/browserslist/browserslist/releases/tag/4.28.7

glib 0.18.5 — Unsoundness in `Iterator` and `DoubleEndedIterator` impls for `glib::VariantStrIter`

The VariantStrIter::impl_get function (called internally by implementations of the Iterator and DoubleEndedIterator traits for this type) was unsound, resulting in undefined behaviour.

An immutable reference &p to a *mut libc::c_char pointer initialized to NULL was passed as an argument to a C function that that mutates the pointer behind &p in-place (i.e. as an out-argument), which was unsound. After changes in recent versions of the Rust compiler, these unsound writes through &p now seem to be completely disregarded when building the glib crate with optimizations.

This subsequently caused all calls of VariantStrIter::impl_get to violate the safety requirements of the std::ffi::CStr::from_ptr function - which requires its argument to be a valid pointer to a C-style string - resulting in crashes due to NULL pointer dereferences.

This was fixed by passing the out-argument pointer explitly as &mut p instead of &p.

This issue has been present since this code was initially added in glib v0.15.0. The mismatch in mutability was likely missed (and not raised as an error by the compiler) because the C function wrapped by VariantStrIter::impl_get is variadic (glib_sys::g_variant_get_child), and the pointer in question is one of the variadic arguments.

affected >=0.15.0 <0.20.0 · found in src-tauri/Cargo.lock

https://github.com/gtk-rs/gtk-rs-core/pull/1343 · https://github.com/gtk-rs/gtk-rs-core · https://rustsec.org/advisories/RUSTSEC-2024-0429.html


Scanned 2 lockfile(s) · 2026-09-01 17:00 UTC · dependabork

<!-- dependabork:v1 --> <!-- hash:a4087c28b23f2edd --> # 🔒 Dependency Dashboard (20) **17 unknown · 2 high · 1 moderate** | Severity | Package | Installed | Fixed in | Advisory | |---|---|---|---|---| | ⚫ Unknown | atk | 0.18.2 | **none yet** | [RUSTSEC-2024-0413](https://osv.dev/vulnerability/RUSTSEC-2024-0413) | | ⚫ Unknown | atk-sys | 0.18.2 | **none yet** | [RUSTSEC-2024-0416](https://osv.dev/vulnerability/RUSTSEC-2024-0416) | | ⚫ Unknown | gdk | 0.18.2 | **none yet** | [RUSTSEC-2024-0412](https://osv.dev/vulnerability/RUSTSEC-2024-0412) | | ⚫ Unknown | gdk-sys | 0.18.2 | **none yet** | [RUSTSEC-2024-0418](https://osv.dev/vulnerability/RUSTSEC-2024-0418) | | ⚫ Unknown | gdkwayland-sys | 0.18.2 | **none yet** | [RUSTSEC-2024-0411](https://osv.dev/vulnerability/RUSTSEC-2024-0411) | | ⚫ Unknown | gdkx11 | 0.18.2 | **none yet** | [RUSTSEC-2024-0417](https://osv.dev/vulnerability/RUSTSEC-2024-0417) | | ⚫ Unknown | gdkx11-sys | 0.18.2 | **none yet** | [RUSTSEC-2024-0414](https://osv.dev/vulnerability/RUSTSEC-2024-0414) | | ⚫ Unknown | glib | 0.18.5 | 0.20.0 | [RUSTSEC-2024-0429](https://osv.dev/vulnerability/RUSTSEC-2024-0429) | | ⚫ Unknown | gtk | 0.18.2 | **none yet** | [RUSTSEC-2024-0415](https://osv.dev/vulnerability/RUSTSEC-2024-0415) | | ⚫ Unknown | gtk-sys | 0.18.2 | **none yet** | [RUSTSEC-2024-0420](https://osv.dev/vulnerability/RUSTSEC-2024-0420) | | ⚫ Unknown | gtk3-macros | 0.18.2 | **none yet** | [RUSTSEC-2024-0419](https://osv.dev/vulnerability/RUSTSEC-2024-0419) | | ⚫ Unknown | proc-macro-error | 1.0.4 | **none yet** | [RUSTSEC-2024-0370](https://osv.dev/vulnerability/RUSTSEC-2024-0370) | | ⚫ Unknown | unic-char-property | 0.9.0 | **none yet** | [RUSTSEC-2025-0081](https://osv.dev/vulnerability/RUSTSEC-2025-0081) | | ⚫ Unknown | unic-char-range | 0.9.0 | **none yet** | [RUSTSEC-2025-0075](https://osv.dev/vulnerability/RUSTSEC-2025-0075) | | ⚫ Unknown | unic-common | 0.9.0 | **none yet** | [RUSTSEC-2025-0080](https://osv.dev/vulnerability/RUSTSEC-2025-0080) | | ⚫ Unknown | unic-ucd-ident | 0.9.0 | **none yet** | [RUSTSEC-2025-0100](https://osv.dev/vulnerability/RUSTSEC-2025-0100) | | ⚫ Unknown | unic-ucd-version | 0.9.0 | **none yet** | [RUSTSEC-2025-0098](https://osv.dev/vulnerability/RUSTSEC-2025-0098) | | 🟠 High 7.5 | browserslist (dev) | 4.28.1 | 4.28.7 | [GHSA-73wf-gq98-2v4g](https://osv.dev/vulnerability/GHSA-73wf-gq98-2v4g) · CVE-2026-73088 | | 🟠 High 7.5 | browserslist (dev) | 4.28.1 | 4.28.7 | [GHSA-c83g-rgw3-j3cx](https://osv.dev/vulnerability/GHSA-c83g-rgw3-j3cx) · CVE-2026-73089 | | 🟡 Moderate 6.9 | glib | 0.18.5 | 0.20.0 | [GHSA-wrw7-89jp-8q8g](https://osv.dev/vulnerability/GHSA-wrw7-89jp-8q8g) | <details><summary>atk 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/atk> · <https://rustsec.org/advisories/RUSTSEC-2024-0413.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>atk-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/atk-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0416.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gdk 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gdk> · <https://rustsec.org/advisories/RUSTSEC-2024-0412.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gdk-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gdk-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0418.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gdkwayland-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gdkwayland-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0411.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gdkx11 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gdkx11> · <https://rustsec.org/advisories/RUSTSEC-2024-0417.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gdkx11-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gdkx11-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0414.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>glib 0.18.5 — Unsoundness in `Iterator` and `DoubleEndedIterator` impls for `glib::VariantStrIter`</summary> The `VariantStrIter::impl_get` function (called internally by implementations of the `Iterator` and `DoubleEndedIterator` traits for this type) was unsound, resulting in undefined behaviour. An immutable reference `&p` to a `*mut libc::c_char` pointer initialized to `NULL` was passed as an argument to a C function that that mutates the pointer behind `&p` in-place (i.e. as an out-argument), which was unsound. After changes in recent versions of the Rust compiler, these unsound writes through `&p` now seem to be completely disregarded when building the `glib` crate with optimizations. This subsequently caused all calls of `VariantStrIter::impl_get` to violate the safety requirements of the `std::ffi::CStr::from_ptr` function - which requires its argument to be a valid pointer to a C-style string - resulting in crashes due to `NULL` pointer dereferences. This was fixed by passing the out-argument pointer explitly as `&mut p` instead of `&p`. This issue has been present since this code was initially added in `glib` v0.15.0. The mismatch in mutability was likely missed (and not raised as an error by the compiler) because the C function wrapped by `VariantStrIter::impl_get` is variadic (`glib_sys::g_variant_get_child`), and the pointer in question is one of the variadic arguments. affected `>=0.15.0 <0.20.0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/glib> · <https://rustsec.org/advisories/RUSTSEC-2024-0429.html> · <https://github.com/gtk-rs/gtk-rs-core/pull/1343> </details> <details><summary>gtk 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gtk> · <https://rustsec.org/advisories/RUSTSEC-2024-0415.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gtk-sys 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gtk-sys> · <https://rustsec.org/advisories/RUSTSEC-2024-0420.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>gtk3-macros 0.18.2 — gtk-rs GTK3 bindings - no longer maintained</summary> The gtk-rs GTK3 bindings are no longer maintained. The maintainers have archived the repository, and added a note to the crate description and its README.md that the crates are no longer maintained. Please take a look at [gtk4-rs](https://github.com/gtk-rs/gtk4-rs) instead. ``` affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/gtk3-macros> · <https://rustsec.org/advisories/RUSTSEC-2024-0419.html> · <https://github.com/gtk-rs/gtk3-rs/commit/508a69b63a3c5bf73790e0e59101a955847f30d6> </details> <details><summary>proc-macro-error 1.0.4 — proc-macro-error is unmaintained</summary> proc-macro-error's maintainer seems to be unreachable, with no commits for 2 years, no releases pushed for 4 years, and no activity on the GitLab repo or response to email. proc-macro-error also depends on `syn 1.x`, which may be bringing duplicate dependencies into dependant build trees. ## Possible Alternative(s) - [manyhow](https://crates.io/crates/manyhow) - [proc-macro2-diagnostics](https://github.com/SergioBenitez/proc-macro2-diagnostics) affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/proc-macro-error> · <https://rustsec.org/advisories/RUSTSEC-2024-0370.html> · <https://gitlab.com/CreepySkeleton/proc-macro-error/-/issues/20> </details> <details><summary>unic-char-property 0.9.0 — `unic-char-property` is unmaintained</summary> All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained. ## Recommended alternatives - [`icu_properties`](https://crates.io/crates/icu_properties) affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/unic-char-property> · <https://rustsec.org/advisories/RUSTSEC-2025-0081.html> · <https://github.com/rustsec/advisory-db/issues/2414> </details> <details><summary>unic-char-range 0.9.0 — `unic-char-range` is unmaintained</summary> All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained. ## Recommended alternatives - Since version [1.45.0](https://releases.rs/docs/1.45.0/#libraries) Rust [supports](https://github.com/rust-lang/rust/pull/72413/) using `char` with `ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}` to iterate over a range of codepoints. affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/unic-char-range> · <https://rustsec.org/advisories/RUSTSEC-2025-0075.html> · <https://github.com/rustsec/advisory-db/issues/2414> </details> <details><summary>unic-common 0.9.0 — `unic-common` is unmaintained</summary> All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained. affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/unic-common> · <https://rustsec.org/advisories/RUSTSEC-2025-0080.html> · <https://github.com/rustsec/advisory-db/issues/2414> </details> <details><summary>unic-ucd-ident 0.9.0 — `unic-ucd-ident` is unmaintained</summary> All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained. ## Recommended alternatives - [`icu_properties`](https://crates.io/crates/icu_properties) - [`unicode-ident`](https://crates.io/crates/unicode-ident) affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/unic-ucd-ident> · <https://rustsec.org/advisories/RUSTSEC-2025-0100.html> · <https://github.com/rustsec/advisory-db/issues/2414> </details> <details><summary>unic-ucd-version 0.9.0 — `unic-ucd-version` is unmaintained</summary> All Unicode crates that are part of https://github.com/open-i18n/rust-unic are unmaintained. affected `>=0.0.0-0` · found in `src-tauri/Cargo.lock` <https://crates.io/crates/unic-ucd-version> · <https://rustsec.org/advisories/RUSTSEC-2025-0098.html> · <https://github.com/rustsec/advisory-db/issues/2414> </details> <details><summary>browserslist 4.28.1 — Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.json custom stats (normalizeStats)</summary> ## Vulnerability Details **File**: `node.js` **Function**: `normalizeStats()` (line ~214), reached from `getStat()` (called **unconditionally** on every `browserslist()` call) and `loadStat()` ### Root Cause ```js function normalizeStats(data, stats) { if (!data) { data = {} } if (stats && 'dataByBrowser' in stats) { stats = stats.dataByBrowser } if (typeof stats !== 'object') return undefined var normalized = {} for (var i in stats) { var versions = Object.keys(stats[i]) if (versions.length === 1 && data[i] && data[i].versions.length === 1) { var normal = data[i].versions[0] normalized[i] = {} normalized[i][normal] = stats[i][versions[0]] } else { normalized[i] = stats[i] } } return normalized } ``` `stats` is untrusted: it comes from `JSON.parse()`-ing a `browserslist-stats.json` file — auto-discovered by walking up the directory tree from the project root **on every `browserslist()` call, regardless of the query** (`env.getStat(opts, browserslist.data)` runs unconditionally inside `browserslist()`) — or from `opts.stats` passed programmatically / via the CLI's `--stats=` flag. `data` is `browserslist.data`, a plain object populated only with real browser names. Two independent bugs from the same root cause (unguarded `for...in` over untrusted keys used with plain-object bracket access/assignment): 1. **Crash**: `data[i]` has no `hasOwnProperty` guard. If `stats` contains a key that also happens to be an inherited `Object.prototype` member name — `"__proto__"`, `"toString"`, `"valueOf"`, `"constructor"`, `"hasOwnProperty"`, `"isPrototypeOf"`, etc. — `data[i]` resolves to that inherited function/object (always truthy), and the code then does `data[i].versions.length` → `undefined.length` → **uncaught `TypeError`**, for any such key whose JSON value has exactly one sub-key, e.g.: ```json { "toString": { "onekey": 5 }, "chrome": { "100": 50 } } ``` 2. **Prototype write**: `normalized[i] = ...` on the fresh `normalized = {}` — if `i` is exactly `"__proto__"` (and `normalized` has no own property by that name yet), this computed assignment invokes the real `Object.prototype.__proto__` setter, changing `normalized`'s actual `[[Prototype]]` instead of creating a plain property. Because this runs on **every** `browserslist()` call regardless of the query, simply committing a poisoned `browserslist-stats.json` anywhere in a project's directory tree breaks every subsequent Browserslist call in that project — including calls made by Autoprefixer, Babel `preset-env`, Stylelint, or PostCSS internally, for completely unrelated queries. ### Attack Scenario 1. Attacker submits a PR (or a compromised dependency) adding a `browserslist-stats.json` file anywhere between the project root and filesystem root, containing e.g. `{"toString": {"onekey": 5}, "chrome": {"100": 50}}`. 2. The victim's build/CI pipeline runs any tool that calls `browserslist()` internally, for **any** query. 3. The auto-discovered poisoned file crashes the process with an uncaught `TypeError` on the very first call. ### Measured Impact Confirmed crash (real `browserslist()` call, v4.28.6) with `stats` keys: `__proto__`, `toString`, `valueOf`, `hasOwnProperty`, `constructor`, `isPrototypeOf` — each paired with a one-key JSON object — for any query, including `browserslist('defaults')` which never mentions stats. ### Recommended Fix (implemented and verified) ```js var normalized = Object.create(null) for (var i in stats) { var versions = Object.keys(stats[i]) var known = Object.prototype.hasOwnProperty.call(data, i) && data[i] if (versions.length === 1 && known && known.versions.length === 1) { var normal = known.versions[0] normalized[i] = Object.create(null) normalized[i][normal] = stats[i][versions[0]] } else { normalized[i] = stats[i] } } return normalized ``` `normalized` uses `Object.create(null)` so a write to `"__proto__"` is an ordinary property set, never a `[[Prototype]]` change; `data[i]` is replaced with an explicit `hasOwnProperty` check so it never resolves to an inherited `Object.prototype` member. **Verification**: - `NODE_ENV=test npx uvu test .test.js` → 301/301 pass unmodified (`test/custom.test.js`, `test/shareable-stats.test.js`, `test/cover.test.js` exercise the stats-handling paths). - All 6 previously crash-inducing keys, tested individually, now resolve without error. - The realistic file-based auto-discovery scenario (poisoned `browserslist-stats.json` + an unrelated `browserslist('defaults')` call) now returns a normal result instead of crashing. ### Impact - **Who is affected**: Any project whose build/CI invokes Browserslist (directly or via Autoprefixer/Babel/Stylelint/PostCSS) in a directory tree an attacker can place a file into (external PR, compromised dependency), or any app that passes user-influenced data into `opts.stats`. - **What an attacker achieves**: Immediate DoS — crashes the invoking process on the first Browserslist call after the file is present, for any query, no special syntax needed. - **Conditions required**: No authentication — only the ability to add a file to the project's directory tree, or influence `opts.stats`. ### Verification Environment browserslist @ HEAD (== v4.28.6, current latest stable release) under local Node.js v20.19.5. Pure JS library — executed directly, no server needed. ### Note Found via a systematic review of prototype-pollution-adjacent patterns in this codebase after confirming two unrelated algorithmic-complexity issues (reported separately as GHSA-rrmg-cfrq-23vv and GHSA-g6p8-hj8g-x889) in the same research pass. A similar `for...in` + bracket-write pattern in `index.js`'s `copyObject()` (used by `normalizeAndroidData`) was already guarded against `__proto__`/`constructor`/`prototype` keys by a prior, unrelated commit — that guard was never applied to this function. **CWE-1321, CWE-248** · affected `>=0 <4.28.7` · found in `package-lock.json` <https://github.com/browserslist/browserslist/security/advisories/GHSA-73wf-gq98-2v4g> · <https://nvd.nist.gov/vuln/detail/CVE-2026-73088> · <https://github.com/browserslist/browserslist/commit/f9914ad9effc865ccc27d816255625890b31ca51> · <https://github.com/browserslist/browserslist> · <https://github.com/browserslist/browserslist/releases/tag/4.28.7> </details> <details><summary>browserslist 4.28.1 — Browserslist: Unbounded memory growth (no cache eviction) via distinct query results, leading to eventual OOM</summary> ## Vulnerability Details **File**: `index.js` **Location**: `cache` (browserslist()'s result cache, line ~402) and `parseCache` (parseQueries()'s AST cache) ### Root Cause ```js var cache = {} var parseCache = {} function browserslist(queries, opts) { ... var cacheKey = JSON.stringify([queries, context]) if (cache[cacheKey]) return cache[cacheKey] ... if (!env.env.BROWSERSLIST_DISABLE_CACHE) { cache[cacheKey] = result } return result } function parseQueries(queries) { var cacheKey = JSON.stringify(queries) if (cacheKey in parseCache) return parseCache[cacheKey] var result = parseWithoutCache(QUERIES, queries) if (!env.env.BROWSERSLIST_DISABLE_CACHE) { parseCache[cacheKey] = result } ... } ``` Every distinct `(queries, context)` pair is cached forever — no size cap, TTL, or eviction. `browserslist.clearCaches()` never resets either object (it only resets `node.js`'s own filesystem caches); the only opt-out is the `BROWSERSLIST_DISABLE_CACHE` env var, controlled by the *calling application*, not an attacker. Some short, valid queries amplify this badly. The `since <year>-<month>-<day>` query type (`/^since (\d+)-(\d+)-(\d+)$/i`) accepts **any** digit combination — `Date.UTC()` normalizes rather than rejects out-of-range values — giving an effectively unbounded space of ~17-byte distinct cache keys, each of which resolves to (and caches) a result close to the full ~8.5 KB browser list for any sufficiently old year. ### Measured Impact 20,000 distinct `since <year>-<month>-<day>` queries (~330 KB total input, `--expose-gc` before/after measurement to rule out uncollected garbage) retained **over 50 MB** of heap permanently — roughly **150x** amplification, growing linearly with no cap observed up to 40,000 queries (52.3 MB). ### Attack Scenario Any long-running process (server, daemon, warm CI worker) that calls `browserslist()` with a query value that varies across requests/items and is influenced, even partially, by external input accumulates one cache entry per distinct value ever seen. An attacker who can influence that value across *many* requests (this is a volumetric attack, unlike the single-request DoS findings from this same research pass) sends a stream of cheap, distinct queries (e.g. `since 1900-01-01`, `since 1900-01-02`, ...) until the process runs out of memory and crashes. ### Recommended Fix (implemented and verified) Replace both plain-object caches with `Map`s bounded to a fixed maximum entry count, evicting the oldest entry once the cap is reached (`Map` preserves insertion order, so `.keys().next().value` is always oldest): ```js var CACHE_MAX_ENTRIES = 500 function boundedCacheSet(map, key, value) { if (map.size >= CACHE_MAX_ENTRIES) { map.delete(map.keys().next().value) } map.set(key, value) } var cache = new Map() var parseCache = new Map() ``` (read sites changed to `.has()`/`.get()`, write sites to `boundedCacheSet()`) **Verification**: - `NODE_ENV=test npx uvu test .test.js` → 301/301 pass unmodified (`test/cache.test.js` exercises `clearCaches()`/`BROWSERSLIST_DISABLE_CACHE` against `node.js`'s separate filesystem caches, unaffected here); confirmed a repeated identical call still returns the cached reference. - Re-ran the memory PoC post-fix: heap stayed flat at ~4.9 MB after 5,000, 10,000, 20,000, and 40,000 distinct `since`-date queries (was 10.5 → 16.5 → 28.4 → 52.3 MB pre-fix). ### Impact - **Who is affected**: Long-running processes calling `browserslist()` with query values that vary across requests/items and are influenced by external input. - **What an attacker achieves**: DoS via eventual out-of-memory crash, given sustained traffic over time (not a single small payload). - **Conditions required**: No authentication; requires volume rather than a single request, hence Medium rather than High severity. ### Verification Environment browserslist @ HEAD (== v4.28.6, current latest stable release) under local Node.js v20.19.5, run with `--expose-gc` for accurate heap measurement. ### Note Found during a broader review of this codebase in the same research pass that produced GHSA-rrmg-cfrq-23vv (parse.js algorithmic complexity), GHSA-g6p8-hj8g-x889 (baseline regexp ReDoS), GHSA-73wf-gq98-2v4g (normalizeStats crash/prototype write), and GHSA-h633-868p-5rfw (SCOPED_CONFIG__PATTERN ReDoS) — all single-request DoS vectors. This one is different in character (volumetric, not single-request) and is reported separately/scored lower accordingly. **CWE-770** · affected `>=0 <4.28.7` · found in `package-lock.json` <https://github.com/browserslist/browserslist/security/advisories/GHSA-c83g-rgw3-j3cx> · <https://nvd.nist.gov/vuln/detail/CVE-2026-73089> · <https://github.com/browserslist/browserslist/commit/f2931a3ff2a3a31abf84ef01a7400b270aad6405> · <https://github.com/browserslist/browserslist> · <https://github.com/browserslist/browserslist/releases/tag/4.28.7> </details> <details><summary>glib 0.18.5 — Unsoundness in `Iterator` and `DoubleEndedIterator` impls for `glib::VariantStrIter`</summary> The `VariantStrIter::impl_get` function (called internally by implementations of the `Iterator` and `DoubleEndedIterator` traits for this type) was unsound, resulting in undefined behaviour. An immutable reference `&p` to a `*mut libc::c_char` pointer initialized to `NULL` was passed as an argument to a C function that that mutates the pointer behind `&p` in-place (i.e. as an out-argument), which was unsound. After changes in recent versions of the Rust compiler, these unsound writes through `&p` now seem to be completely disregarded when building the `glib` crate with optimizations. This subsequently caused all calls of `VariantStrIter::impl_get` to violate the safety requirements of the `std::ffi::CStr::from_ptr` function - which requires its argument to be a valid pointer to a C-style string - resulting in crashes due to `NULL` pointer dereferences. This was fixed by passing the out-argument pointer explitly as `&mut p` instead of `&p`. This issue has been present since this code was initially added in `glib` v0.15.0. The mismatch in mutability was likely missed (and not raised as an error by the compiler) because the C function wrapped by `VariantStrIter::impl_get` is variadic (`glib_sys::g_variant_get_child`), and the pointer in question is one of the variadic arguments. affected `>=0.15.0 <0.20.0` · found in `src-tauri/Cargo.lock` <https://github.com/gtk-rs/gtk-rs-core/pull/1343> · <https://github.com/gtk-rs/gtk-rs-core> · <https://rustsec.org/advisories/RUSTSEC-2024-0429.html> </details> --- _Scanned 2 lockfile(s) · 2026-09-01 17:00 UTC · dependabork_
Sign in to join this conversation.
No labels
dependabork
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Headscracher/review-gate#2
No description provided.