You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:
import{defu}from'defu'constuserInput=JSON.parse('{"__proto__":{"isAdmin":true}}')constconfig=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.
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:
import{defu}from'defu'constuserInput=JSON.parse('{"__proto__":{"isAdmin":true}}')constconfig=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.
Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.
This PR includes no changesets
When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types
Next steps: Take a moment to review the security alert above. Review
the linked package source code to understand the potential risk. Ensure the
package is not malicious before proceeding. If you're unsure how to proceed,
reach out to your security team or ask the Socket team for help at
support@socket.dev.
Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.
Mark the package as acceptable risk. To ignore this alert only
in this pull request, reply with the comment
@SocketSecurity ignore npm/@emnapi/runtime@1.11.1. You can
also ignore all packages with @SocketSecurity ignore-all.
To ignore an alert for all future pull requests, use Socket's Dashboard to
change the triage state of this alert.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
6.1.4→6.1.5defu: Prototype pollution via
__proto__key in defaults argumentCVE-2026-35209 / GHSA-737v-mqg7-c878
More information
Details
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:Root Cause
The internal
_defufunction usedObject.assign({}, defaults)to copy the defaults object.Object.assigninvokes 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 thefor...inloop 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
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
defu: Prototype pollution via
__proto__key in defaults argumentCVE-2026-35209 / GHSA-737v-mqg7-c878
More information
Details
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:Root Cause
The internal
_defufunction usedObject.assign({}, defaults)to copy the defaults object.Object.assigninvokes 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 thefor...inloop 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
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Release Notes
unjs/defu (defu)
v6.1.5Compare Source
compare changes
🩹 Fixes
__proto__in defaults (#156)🏡 Chore
✅ Tests
🤖 CI
❤️ Contributors
Configuration
📅 Schedule: (in timezone Europe/Copenhagen)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.