Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit crafted JSON path to exposed endpoint
-
DeliveryApplication passes untrusted path into traverse set()
-
ExploitPath crosses primitive, resolving next segment on built-in prototype
-
ExecutionPollute String/Number/Boolean.prototype with attacker data
-
ImpactCorrupt application logic or cause denial of service
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V3 - Web Frontend Security Prototype pollution prevention
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The application must call traverse's set() with an attacker-controlled path array where the path crosses (or ends on) a primitive value - for example a path derived from an untrusted JSON body. Polluting String.prototype, Number.prototype, or Boolean.prototype requires only plain JSON data (e.g., ['name','__proto__','polluted']). Polluting the far higher-impact Object.prototype is NOT achievable with pure JSON and requires a non-data path segment, such as an object whose toString returns a different value on each call or a Proxy that accepts an assignment without storing it. LIMITING FACTORS: exploitation is gated entirely on the specific anti-pattern of feeding untrusted input directly as the set() path; typical usage with hardcoded or sanitized paths is unaffected, and affected versions are limited to 0.3.6-0.3.9, 0.4.0-0.4.6, 0.5.0-0.5.2, and 0.6.0-0.6.11. |
| Impact | The vendor CVSS 4.0 score of 6.9 (Medium) with AV:N/AC:L/PR:N/UI:N suggests broad, low-friction exposure, but the impact metrics temper this sharply: VC:N (no confidentiality impact) and only VI:L/VA:L (low integrity and availability). No EPSS score was provided, the CVE is not listed in CISA KEV, and no POC flag is set, so there is no public exploit identified at time of analysis (the advisory does contain a demonstration payload, which is distinct from active exploitation). The most important nuance is a conflict between the headline network/unauthenticated vector and the real-world precondition: exploitation only matters if an application passes an attacker-controlled path directly into traverse's set(), which is an application-specific anti-pattern, not a default behavior of the library. Furthermore, the description is explicit that Object.prototype - the classic high-impact prototype-pollution target that typically enables RCE/auth-bypass gadgets - is NOT reachable with plain JSON data and requires an exotic non-data path segment (an object with a mutating toString, or a Proxy). Pure JSON input can only pollute String.prototype, Number.prototype, or Boolean.prototype, which materially limits practical blast radius. Net assessment: a real but moderate-priority issue - patch promptly where set() consumes untrusted paths, but this is not a drop-everything, wormable flaw, and the Medium CVSS reflects that reality rather than overstating it. |
| Exploit ScenarioDerived | An application exposes functionality that derives a traverse().set() path from untrusted input (e.g., a JSON body or query parameter) and the path crosses a primitive value, such as traverse({ name: 'bob' }).set(['name', '__proto__', 'polluted'], 'yes'). An attacker submits a crafted path that resolves the next segment on a primitive's built-in prototype, adding attacker-chosen properties to String.prototype, Number.prototype, or Boolean.prototype using plain JSON. No public exploit is identified at time of analysis, though the vendor advisory includes a demonstration payload; given AV:N/AC:L, exploitation is low-complexity wherever the vulnerable code path is exposed. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 07, 2026
Prototype pollution in the npm package traverse (versions 0.3.6-0.3.9, 0.4.0-0.4.6, 0.5.0-0.5.2, and 0.6.0-0.6.11) lets unauthenticated remote attackers add or overwrite properties on String.prototype, Number.prototype, or Boolean.prototype when an application passes an attacker-controlled path array to set(), as when a path is built directly from an untrusted JSON body. Exploitation is gated entirely on that anti-pattern: the path must cross or end on a primitive value, and plain JSON data is not sufficient to reach the far higher-impact Object.prototype, which requires a non-data path segment such as an object whose toString returns a different value on each call or a Proxy that accepts an assignment without storing it. Impact is limited to low integrity and low availability with no confidentiality effect (vendor CVSS 4.0 score 6.9 Medium; independently assessed CVSS 3.1 vector AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L), with no public exploit identified at time of analysis and confirmed fixes available from the vendor in 0.3.10, 0.4.7, 0.5.3, and 0.6.12.
RemediationAI
Apply the vendor-released patches: upgrade to traverse 0.3.10, 0.4.7, 0.5.3, or 0.6.12 (whichever matches your current major line), as documented in https://github.com/ljharb/js-traverse/security/advisories/GHSA-rj28-8w7x-jmqc; the fixes are carried by commits 81ccab43e379cf42eb2a5f689630f7f79b3d71b8 and 37a9ebd103d2a259c824c29cdcc3f0dfe1acffce. Since traverse is frequently pulled in transitively, run npm ls traverse or scan lockfiles, and use npm overrides / yarn resolutions where an upstream package pins a vulnerable range. Where patching cannot happen immediately, the highest-value control is to stop feeding untrusted data into the path argument of set(): validate path segments against a strict allowlist of expected keys and reject segments named __proto__, prototype, or constructor before calling set(), which is effective because this issue is only exploitable through that specific anti-pattern and normal hardcoded or sanitized paths are unaffected. A second compensating control is to coerce every path segment to a string before use, which prevents the non-data-object and Proxy segments needed to reach Object.prototype - the trade-off being that callers relying on non-string keys (numbers, symbols) must be adjusted. Defensively freezing built-in prototypes with Object.freeze(Object.prototype) (or Node's --frozen-intrinsics flag) blocks successful writes, but it can break libraries that legitimately extend prototypes and is difficult to roll back in-process, so treat it as a temporary hardening measure rather than a fix. Finally, note that prototype pollution can be chained into downstream gadget-based code execution in some applications, so pair the upgrade with input validation on any JSON body that is ultimately mapped into a path array.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
traverse is a long-lived Node.js utility by ljharb for recursively walking and mutating object graphs, exposing a fluent API where traverse(obj).set(pathArray, value) writes a value at a nested path and creates missing intermediate nodes along the way. The root cause is CWE-1321 (Improperly Controlled Modification of Object Prototype Attributes, i.e. prototype pollution): inside set(), each intermediate segment is materialized with an assignment such as node[key] = {}, and the final segment with node[key] = value. When the walk crosses a string, number, or boolean primitive, JavaScript does not throw on the property access or sloppy-mode assignment; instead the next segment is resolved against the primitive's built-in wrapper prototype, so an untrusted path such as ['name', '__proto__', 'polluted'] causes the write to land on String.prototype (likewise Number.prototype or Boolean.prototype), tainting every object of that type in the process. Because 'name' is an ordinary data value, a plain JSON payload is enough for this class of pollution, whereas reaching Object.prototype requires an exotic path segment whose property-key coercion is non-deterministic or whose assignment is silently discarded (for example an object with a stateful toString, or a Proxy). The upstream fix (commit 81ccab43e379cf42eb2a5f689630f7f79b3d71b8, plus 37a9ebd103d2a259c824c29cdcc3f0dfe1acffce) introduces an es-abstract ToPropertyKey helper to normalize each segment exactly once, an explicit check that rejects a magic '__proto__' segment in engines where accessing it always reaches the [[Prototype]] rather than an own property, and a setOwnProperty guard that throws a TypeError whenever Object(object) !== object, i.e. whenever a write would target a primitive. It also hardens the intermediate-node creation path to use the same validated key, so only own properties are followed or created.
Know when Traverse gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N
Untrusted JSON path reaches set() over the network (AV:N/AC:L/PR:N/UI:N); only primitive prototypes are pollutable with data, giving limited integrity/availability impact and no confidentiality (I:L/A:L/C:N).
Primary rating from Vendor (harborist).
CVSS VectorVendor: harborist
DescriptionCVE.org
traverse (npm) versions 0.3.6 through 0.3.9, 0.4.0 through 0.4.6, 0.5.0 through 0.5.2, and 0.6.0 through 0.6.11 allow prototype pollution through set(). When the path passed to set() crosses a primitive value, the next path segment is resolved on that primitive's built-in prototype, so an application that passes an untrusted path to set() lets an attacker add or overwrite properties of String.prototype, Number.prototype, or Boolean.prototype using plain JSON data, for example traverse({ name: 'bob' }).set(['name', '__proto__', 'polluted'], 'yes'). Object.prototype was reachable only with a non-data path segment, such as an object whose toString returns a different value on each call, or through a Proxy that accepts an assignment without storing it. This is fixed in 0.3.10, 0.4.7, 0.5.3, and 0.6.12.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
EUVD-2026-94579
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB