Skip to main content

traverse (npm) EUVDEUVD-2026-94579

| CVE-2026-107353 MEDIUM
Improperly Controlled Modification of Object Prototype Attributes (Prototype Pollution) (CWE-1321)
2026-10-07 harborist
6.9
CVSS 4.0 · Vendor: harborist
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit crafted JSON path to exposed endpoint
  2. Delivery
    Application passes untrusted path into traverse set()
  3. Exploit
    Path crosses primitive, resolving next segment on built-in prototype
  4. Execution
    Pollute String/Number/Boolean.prototype with attacker data
  5. Impact
    Corrupt 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

traverse 0.3.6 <0.3.10
traverse 0.6.0 <0.6.12
traverse 0.5.0 <0.5.3
traverse 0.4.0 <0.4.7

Affected Packages

euvd traverse fix: 0.3.10, 0.4.7, 0.5.3, 0.6.12

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

Vendor (harborist) PRIMARY 6.9 MEDIUM
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
vuln.today AI 6.5 MEDIUM

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).

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N

Primary rating from Vendor (harborist).

CVSS VectorVendor: harborist

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
Low
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

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

EPSS Score
0.3%
Top 81% exploitable
Prevalence
Medium
popular npm utility library, but vulnerable set() usage pattern is narrower
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy