GitHub Advisoryadvisory · npm

GHSA-737v-mqg7-c878 defu: Prototype pollution via `__proto__` key in defaults argument

HIGH Published 2026-04-04 Modified 2026-04-06 Official page ↗
Aliases
CVE-2026-35209
Ecosystem
npm
Packages
defu
Severity
High
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
Weaknesses
CWE-1321
Reviewed
2026-04-04

Affected packages

• npm defu: < 6.1.5 → fixed in 6.1.5

Description

Impact Applications that pass unsanitized user input (e.g. parsed JSON request bodies, database records, or config files from untrusted sources) as the first argument to `defu()` are vulnerable to prototype pollution. A crafted payload containing a `__proto__` key can override intended default values in the merged result: ```js import { defu } from 'defu' const userInput = JSON.parse('{"__proto__":{"isAdmin":true}}') const config = defu(userInput, { isAdmin: false }) config.isAdmin // true — attacker overrides the server default ``` Root Cause The internal `_defu` function used `Object.assign({}, defaults)` to copy the defaults object. `Object.assign` invokes the `__proto__` setter, which replaces the resulting object's `[[Prototype]]` with attacker-controlled values. Properties inherited from the polluted prototype then bypass the existing `__proto__` key guard in the `for...in` loop and land in the final result. Fix Replace `Object.assign({}, defaults)` with object spread (`{ ...defaults }`), which uses `[[DefineOwnProperty]]` and does not invoke the `__proto__` setter. Affected Versions <= 6.1.4 Credits Reported by @BlackHatExploitation

Related

Alias · CVE (1)

  • CVE-2026-35209 defu is software that allows uers to assign default properties recursively. vulnerability

Weakness · CWE (1)

  • CWE-1321 Improperly Controlled Modification of Object Prototype Attributes weakness

References