CVE-2026-29063
Critical · 9.8CVSS
9.8
EPSS
1.6%
Published
Mar 6, 2026
CISA due date
—
Cloudanix analysis
Some applications using this JavaScript library may let maliciously crafted input change how the application behaves, potentially exposing data or bypassing controls.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Exposure
- Component
- Library
- Class
- Improper Input Validation
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Immutable.js versions before 3.8.3, 4.3.7, and 5.1.5 can allow prototype pollution when attacker-controlled object keys are processed through APIs such as mergeDeep(), mergeDeepWith(), merge(), Map.toJS(), and Map.toObject(). If malicious keys such as __proto__, constructor, or prototype are merged or converted without proper filtering, properties can be written onto shared JavaScript object prototypes rather than only the intended Immutable data structure or plain object. The practical effect depends on the consuming application: polluted prototype properties can alter authorization checks, feature flags, validation logic, object serialization, template rendering behavior, or other security-sensitive application logic. In vulnerable code paths, this may lead to confidentiality impact, application state manipulation, denial of service, or in rare cases remote code execution if the polluted property reaches a dangerous gadget in the application stack.
Why it matters to the business
Applications that use vulnerable Immutable.js versions to process untrusted JSON, API input, configuration, metadata, or user-supplied nested objects may be exposed to remote, unauthenticated compromise of application behavior. Because Immutable.js is a widely used JavaScript dependency that is often pulled in transitively by front-end and Node.js packages, exposure may exist even when teams do not directly import it. The CVSS score is critical, but EPSS is currently low and there is no known CISA KEV listing or ransomware association, so remediation should be prioritized based on whether the dependency is reachable from untrusted input, internet-facing services, authentication or authorization flows, or server-side JavaScript execution.
How an attack unfolds
An attacker first identifies an application endpoint, API, webhook, import function, or client-side workflow that accepts nested object data and passes it into Immutable.js merge or conversion APIs. The attacker then submits a crafted object containing prototype-targeting keys such as __proto__, constructor, or prototype. In vulnerable versions, the library may merge or materialize those keys in a way that modifies a shared JavaScript prototype. After pollution occurs, later application code may read attacker-influenced inherited properties as though they were legitimate object properties. The attacker then triggers the affected business logic, such as authorization decisions, configuration checks, validation routines, rendering paths, or data access operations, to obtain unauthorized data, bypass controls, corrupt application behavior, or cause service instability. Exploitation is highly application-dependent: the vulnerable library primitive enables prototype pollution, while the final security impact depends on the presence of exploitable application-level gadgets.
How to fix it
Upgrade Immutable.js to a patched version on the branch in use: 3.8.3 or later for the 3.x line, 4.3.7 or later for the 4.x line, and 5.1.5 or later for the 5.x line. Regenerate lockfiles and redeploy all applications, containers, serverless bundles, and front-end builds that include the vulnerable package. Because the package may be present transitively, inspect package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, bundled assets, and software composition analysis results for vulnerable immutable versions. If immediate upgrade is not possible, reject or sanitize untrusted keys named __proto__, prototype, and constructor before data reaches Immutable.js merge or conversion APIs; avoid passing untrusted objects directly into mergeDeep(), mergeDeepWith(), merge(), Map.toJS(), or Map.toObject(); and prefer schema validation that denies unknown nested properties. Treat sanitization as a temporary mitigation, not a substitute for upgrading.
How to confirm the fix worked
Confirm that every deployed artifact resolves immutable to version 3.8.3, 4.3.7, 5.1.5, or a later patched version. Validate with package-manager tooling such as npm ls immutable, yarn why immutable, pnpm why immutable, dependency scanning, and direct inspection of lockfiles and built container images. Test representative application paths that accept nested JSON to ensure prototype-pollution keys are rejected or safely ignored. A safe validation approach is to submit non-destructive payloads containing __proto__, constructor, and prototype keys in a controlled test environment and verify that no unexpected inherited properties appear on newly created JavaScript objects after the request is handled. Also confirm that CI/CD dependency policies fail builds when vulnerable immutable versions are introduced.
Typical attack path
- Find an application feature that accepts attacker-controlled JSON, form data, webhook payloads, imported documents, or configuration-like nested objects.
- Determine or infer that the data is processed through Immutable.js mergeDeep(), mergeDeepWith(), merge(), Map.toJS(), or Map.toObject().
- Submit a crafted nested object containing prototype-pollution keys such as __proto__, constructor, or prototype.
- Cause the vulnerable Immutable.js code path to merge or convert the malicious data into a JavaScript object context.
- Trigger downstream application logic that reads inherited properties and treats them as trusted values.
- Abuse the polluted property to bypass validation, alter authorization or configuration behavior, expose data, disrupt service, or reach another application-specific exploit gadget.
How to detect it
There is no universal post-exploitation artifact because prototype pollution affects application runtime behavior and the final impact depends on the consuming code. To look for prior exploitation, review HTTP access logs, API gateway logs, WAF logs, application logs, webhook ingestion logs, import-processing logs, and error telemetry for requests containing prototype-pollution keys such as __proto__, constructor, prototype, constructor.prototype, or nested JSON structures combining constructor and prototype. Pay special attention to endpoints that accept JSON bodies, bulk import files, user preferences, metadata, filters, search parameters, workflow definitions, integration payloads, or configuration-like input. Correlate suspicious payloads with unexpected authorization successes, privilege changes, access to unusual records, spikes in 4xx/5xx errors, Node.js process crashes, memory growth, abnormal response fields, or application logs showing unexpected inherited property values. For server-side JavaScript services, examine APM traces and exception logs around vulnerable merge or conversion calls, especially mergeDeep(), mergeDeepWith(), merge(), Map.toJS(), and Map.toObject(). For client-side-only exposure, review telemetry, CSP reports, and application error reporting for malicious input propagation, while recognizing that client-side logs may be incomplete. If payloads are found, reproduce the request in an isolated patched and unpatched test environment to determine whether the specific application code path was exploitable.
- __proto__
- "__proto__"
- %5F%5Fproto%5F%5F
- constructor.prototype
- "constructor":{"prototype"
- "constructor"\s*:\s*\{\s*"prototype"
- "prototype"\s*:
- mergeDeep(
- mergeDeepWith(
- Map.toJS(
- Map.toObject(
- Cannot set property '__proto__'
- prototype pollution
- polluted prototype
What your security team should do
- Inventory all applications and packages that include immutable-js/immutable, including transitive dependencies and bundled front-end assets.
- Prioritize patching internet-facing, API-driven, server-side JavaScript, authentication, authorization, data-processing, webhook, and import workflows that process untrusted nested objects.
- Upgrade Immutable.js to 3.8.3, 4.3.7, 5.1.5, or later, then rebuild and redeploy affected artifacts from clean dependency lockfiles.
- Add dependency-scanning rules to block immutable versions earlier than 3.8.3, 4.3.7, and 5.1.5.
- Add request validation or WAF/API-gateway detections for prototype-pollution keys in JSON and form payloads, especially __proto__, constructor.prototype, and nested constructor/prototype combinations.
- Review application code for use of mergeDeep(), mergeDeepWith(), merge(), Map.toJS(), and Map.toObject() on untrusted data.
- Search logs for prior suspicious requests containing prototype-pollution keys and correlate them with authorization anomalies, unusual errors, data access spikes, or process crashes.
- If suspicious exploitation is found, rotate secrets potentially exposed through the affected application, review affected user sessions, and perform targeted application forensic analysis.
The record
Immutable.js provides many Persistent Immutable data structures. Prior to versions 3.8.3, 4.3.7, and 5.1.5, Prototype Pollution is possible in immutable via the mergeDeep(), mergeDeepWith(), merge(), Map.toJS(), and Map.toObject() APIs. This issue has been patched in versions 3.8.3, 4.3.7, and 5.1.5.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | immutable | 0 | 3.8.3 |
| npm | immutable | 4.0.0-rc.1 | 4.3.8 |
| npm | immutable | 5.0.0 | 5.1.5 |
| Chainguard | argo-workflows-ui-3.6 | 0 | 3.6.19-r3 |
| Chainguard | argo-workflows-ui-3.7 | 0 | 3.7.10-r4 |
| Chainguard | argo-workflows-ui-4.0 | 0 | 4.0.1-r4 |
| Chainguard | rancher-api-ui | 0 | 1.2.3-r6 |
| Chainguard | vitess-22 | 0 | 22.0.4-r6 |
| Chainguard | vitess-23 | 0 | 23.0.3-r7 |
| Wolfi | argo-workflows-ui-3.7 | 0 | 3.7.10-r4 |
| Wolfi | argo-workflows-ui-4.0 | 0 | 4.0.1-r4 |
| Wolfi | rancher-api-ui | 0 | 1.2.3-r6 |
| Wolfi | vitess-22 | 0 | 22.0.4-r6 |
| Wolfi | vitess-23 | 0 | 23.0.3-r7 |
Related vulnerabilities
- GHSA-wf6x-7x77-mvgw Immutable is vulnerable to Prototype Pollution Same vulnerability
- GHSA-f23m-r3pf-42rh lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and `_.omit` Also affects argo-workflows-ui-3.6
- CVE-2026-2950 Impact: Lodash versions 4.17.23 and earlier are vulnerable to prototype pollution in the… Also affects argo-workflows-ui-3.6
- GHSA-37ch-88jc-xwx2 path-to-regexp vulnerable to Regular Expression Denial of Service via multiple route… Also affects argo-workflows-ui-3.6
- CVE-2026-33750 The brace-expansion library generates arbitrary strings containing a common prefix and… Also affects argo-workflows-ui-3.6
- CVE-2026-33671 Picomatch is a glob matcher written JavaScript. Also affects argo-workflows-ui-3.6
- CVE-2026-33672 Picomatch is a glob matcher written JavaScript. Also affects argo-workflows-ui-3.6
- GHSA-f886-m6hf-6m8v brace-expansion: Zero-step sequence causes process hang and memory exhaustion Also affects argo-workflows-ui-3.6