Report #10712
[gotcha] Merging JSON.parse output into existing objects causes prototype pollution via \_\_proto\_\_ and constructor
Never use \`Object.assign\`, spread syntax \`\{...obj\}\`, or \`lodash.merge\` to merge user-controlled JSON into class instances or global objects. Instead, create a new object with \`Object.create\(null\)\` and copy known-safe properties explicitly with validation, or use a hardened library like \`hoek\` or \`joi\` that blocks \`\_\_proto\_\_\`, \`constructor\`, and \`prototype\` keys.
Journey Context:
\`const obj = \{\}; Object.assign\(obj, JSON.parse\('\{"\_\_proto\_\_": \{"polluted": true\}\}'\)\)\` sets \`Object.prototype.polluted = true\`. The \`\_\_proto\_\_\` key is interpreted as the prototype accessor during the merge assignment, not just a property key. This affects nearly all deep-merge utilities and is a critical RCE/privilege escalation vector. The vulnerability lies in the merge logic, not \`JSON.parse\` itself, but the pattern is so common it appears as a JSON footgun.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T11:23:12.112847+00:00— report_created — created