CVE-2026-54335
lowpriority · track · 0EPSS 0.004 · 33 %ileEUUSEPSS · scored 2026-10-28
Feathersjs is a framework for creating web APIs and real-time applications with TypeScript or JavaScript. In 5.0.44 and earlier, the _.merge(target, source) utility exported by @feathersjs/commons recursively merges source into target by iterating Object.keys(source). When source was produced by JSON.parse and contains a __proto__, constructor, or prototype key, that key is returned as an own-enumerable property; the recursive merge then resolves target['__proto__'] to Object.prototype and writes attacker-supplied properties onto it, polluting the prototype for all plain objects in the process for the lifetime of the Node process. This issue is fixed in version 5.0.45.
cvss
Technical severity, 0–10. One row per scoring source.
base score 0–10 · higher = more severe · hover a vector to decode
ssvc
A stakeholder decision — act, attend, or track — from exploitation and impact.
weaknesses
The CWE weakness classes this flaw belongs to.
affected products (2)
Products and version ranges known to be affected.
advisories (1)
Vendor and ecosystem advisories describing this.
- GHSA-28xv-ph75-77whPrototype pollution in @feathersjs/commons _.merge via JSON-parsed __proto__2026-07-14ghsa · osvUS
### Impact The `_.merge(target, source)` utility exported by `@feathersjs/commons` recursively merges `source` into `target` by iterating `Object.keys(source)`. When `source` was produced by `JSON.parse` and contains a `__proto__` (or `constructor` / `prototype`) key, that key is returned as an own-enumerable property. The recursive merge then resolves `target['__proto__']` to `Object.prototype` and writes the attacker-supplied properties onto it, polluting the prototype for all plain objects in the process for the lifetime of the Node process. **Scope of real-world risk is limited.** No first-party Feathers package routes input — trusted or untrusted — through `commons._.merge`. The `@feathersjs/authentication` package, which does merge request-influenced data, uses `lodash/merge` (prototype-pollution-safe since 4.17.12), not this utility. Exploitation therefore requires a downstream plugin or application to pass JSON-parsed, attacker-controlled input directly through the exported `_.merge`. ### Patches Fixed in `@feathersjs/commons@5.0.45`. The fix skips `__proto__`, `constructor`, and `prototype` keys during iteration — the standard remediation used by lodash and others. ### Workarounds Avoid passing JSON-parsed untrusted input through `commons._.merge`. Freezing `Object.prototype` or validating/sanitizing keys upstream also mitigates. ### Credit Reported responsibly by Andrew Ridings (@ridingsa).
also known as (3)
Other names and identifiers for this entity.
sources
Which sources assert this record, and when.
references (13)
External citations — patches, advisories, analysis.
- https://github.com/feathersjs/feathers/commit/28b3c03c63bdbff53115fdaa46c56980e7942acccnnvd
- https://github.com/feathersjs/feathers/pull/3690cnnvd
- https://github.com/feathersjs/feathers/releasesPatchcnnvd
- https://github.com/feathersjs/feathers/releases/tag/v5.0.45cnnvd
- https://github.com/feathersjs/feathers/security/advisories/GHSA-28xv-ph75-77whcnnvd
- https://github.com/feathersjs/feathers/commit/28b3c03c63bdbff53115fdaa46c56980e7942accenisa_euvd
- https://github.com/feathersjs/feathers/pull/3690enisa_euvd
- https://github.com/feathersjs/feathers/releases/tag/v5.0.45enisa_euvd
Attackers weaponise vulnerabilities like this against internet-exposed services. See what is exposed on your perimeter with a free passive scan.
Free scan