Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify app sink merging untrusted data
-
DeliveryCraft object with __proto__ payload
-
ExploitSubmit to chart config or i18n property
-
ExecutiondeepMerge writes to Object.prototype
-
PersistInjected properties pollute all objects
-
ImpactIntegrity/availability degradation of front-end
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 | Exploitation requires the host application to merge an object it does not control into one of two specific sinks: a Vaadin chart configuration (e.g., via updateConfiguration/chart series config) or a Vaadin component's i18n property, both of which invoke the vulnerable deepMerge helper. The attacker must be able to supply a crafted object containing a __proto__ (or equivalent prototype) key that reaches that merge call. LIMITING FACTORS: this is not exploitable against a default configuration that never passes untrusted data into these merge functions (reflected by AT:P), impact is confined to client-side JavaScript integrity/availability (no confidentiality, no direct RCE absent a further gadget chain), and only the listed 23.x/24.x/25.x ranges below the fixed versions are affected while 10-13 and 15-22 are unsupported. |
| Impact | This is a client-side prototype pollution flaw (CWE-1321) in the deepMerge helpers of Vaadin Charts and Vaadin Component Base. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:L, base 6.3) is internally consistent with the description: network-reachable, no privileges, no user interaction, but AT:P captures the key limiting factor - exploitation requires the host application to merge an attacker-controlled object into a chart configuration (updateConfiguration) or a component's i18n property. Impact is partial integrity and availability only (VI:L/VA:L), with no confidentiality impact, which is typical of prototype pollution that corrupts Object.prototype but does not directly disclose data. No EPSS score, KEV listing, or public exploit is provided in the input, so this is not confirmed to be under active exploitation. The source-code evidence (PR #12483 and siblings) confirms the root cause and fix - the old deepMerge copied keys such as __proto__ without filtering, and the new object-utils.js deepMerge/deepMergePartials plus a regression test ('should not copy the __proto__ key') validate the correction. Realistically this is a moderate-priority, defense-in-depth fix rather than an urgent RCE: real risk depends heavily on whether an application actually passes untrusted input into these merge sinks, and the impact is bounded to integrity/availability degradation of the front-end unless a downstream gadget chain escalates it. |
| Exploit ScenarioDerived | An application feeds untrusted JSON (e.g., user-supplied chart settings or i18n overrides) into a Vaadin chart's updateConfiguration or a component's i18n property. An attacker submits a payload like {"__proto__": {"injected": "yes"}}, which the vulnerable deepMerge writes onto Object.prototype, making the injected property visible to every object in the running application. No public exploit was identified in the provided data, and successful exploitation depends on the application exposing one of these merge sinks to attacker-controlled data. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 30, 2026
Deep-merge prototype pollution in Vaadin Charts and Vaadin Component Base lets remote, unauthenticated attackers write arbitrary properties onto JavaScript's Object.prototype whenever a Vaadin application merges an object it does not control into a chart configuration (e.g. updateConfiguration or a chart series config) or into a component's i18n property. Once injected, those properties are visible to every object in the running client-side application, degrading UI integrity and availability rather than exposing data or yielding direct code execution. Exploitation is conditional - the host application must actually route crafted input containing a __proto__ (or equivalent prototype) key into one of those two merge sinks - and no public exploit code has been identified at time of analysis, with no confirmed active exploitation (CISA KEV). Affected ranges are Vaadin 23.0.0-23.6.13, 24.0.0-24.9.20, 24.10.0-24.10.9, 25.0.0-25.1.11 and 25.2.0-25.2.6 across the Maven artifacts and the corresponding @vaadin/charts and @vaadin/component-base npm packages.
RemediationAI
Vendor-released patches exist: upgrade com.vaadin:vaadin, vaadin-core (where applicable) and vaadin-charts-flow to 23.6.14, 24.9.21, 24.10.10, 25.1.12, or 25.2.7 and newer, and upgrade the npm packages to @vaadin/charts 23.6.5, 24.9.18, 24.10.5, 25.1.12 or 25.2.9 and newer, and @vaadin/component-base 24.9.18, 24.10.5, 25.1.12 or 25.2.9 and newer, keeping the Flow and web-component versions aligned so a patched frontend is not pulled in with an unpatched backend or vice versa; versions 10-13 and 15-22 must first be moved onto a supported 23/24/25 line. The fixes originate in upstream pull requests 12483, 12492, 12493, 12494, 12496 and 12559 in vaadin/web-components, with details at https://vaadin.com/security/cve-2026-91860. If upgrading is not immediately possible, the decisive compensating control is to stop untrusted data from reaching the two sinks: sanitize or allow-list any object bound to a chart configuration (updateConfiguration, chart series config) or to a component i18n property, stripping __proto__, constructor and prototype keys recursively - for example by re-parsing with a JSON.parse reviver that drops those keys or by copying into Object.create(null) before merge; the trade-off is extra server- and client-side validation code that can silently drop legitimate keys if the allow-list is too narrow, and it does not protect any other code path that merges untrusted input. Server-side validation is preferable to client-side filtering because a client-side check can be bypassed by an attacker who controls the payload directly, and as defense in depth Object.freeze(Object.prototype) can be applied to make prototype writes fail - with the trade-off that it breaks libraries and application code that legitimately extend Object.prototype and may surface as unrelated runtime errors. Note that detection of successful pollution is difficult after the fact, so auditing application code for merges of request-derived objects into chart or i18n configuration is recommended in addition to patching.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 5 packages in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is CWE-1321 (Improperly Controlled Modification of Object Prototype Attributes, i.e. prototype pollution) in the recursive deepMerge helpers that ship in Vaadin Charts and Vaadin Component Base. The original implementations iterated Object.keys(source) and, for any nested object value, either created an empty object on the target or recursed into it, then copied leaf values with Object.assign; nothing filtered dangerous keys, so a source object such as JSON.parse('{"__proto__": {"injected": "yes"}}') caused the key __proto__ to be treated as a normal property and the injected properties to be written onto Object.prototype, propagating into every object in the page. Two distinct sinks were reachable: the chart configuration merge path (packages/charts/src/helpers.js deepMerge used by vaadin-chart-mixin and vaadin-chart-series-mixin) and the i18n merge in packages/component-base/src/i18n-mixin.js. The upstream fix (PRs 12483, 12492, 12493, 12494, 12496, 12559 in vaadin/web-components) removes the duplicated helpers and centralizes merging in a new packages/component-base/src/object-utils.js module whose deepMerge/deepMergePartials only merge values that qualify as plain objects (inheriting from Object.prototype or from nothing), so Date instances, class instances and array values are assigned rather than traversed, and __proto__ keys are not copied; the charts helper now merely re-exports deepMerge from object-utils.js and is marked deprecated, and the i18n mixin calls deepMergePartials. The vulnerability is client-side JavaScript in nature: it affects the browser-side component library (the CPEs list vaadin, vaadin-core, vaadin-charts-flow and the npm packages @vaadin/charts and @vaadin/component-base), and while the CVSS 4.0 vector CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N yields a vendor base score of 6.3, the independent assessment applies CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L, reflecting that the attack prerequisite (AT:P) requires the application to feed untrusted data into the merge sink and that impact is limited to integrity and availability of client-side state with no confidentiality loss and no direct remote code execution absent a further gadget chain.
Know when Prototype Pollution 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:P/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N
Network-reachable with no auth or interaction, but AC:H because the app must expose an untrusted object to the merge sink; prototype pollution yields partial integrity/availability and no confidentiality.
Primary rating from Vendor (Vaadin).
CVSS VectorVendor: Vaadin
Lifecycle Timeline
1DescriptionCVE.org
A prototype pollution vulnerability exists in the deep merge helpers of Vaadin Charts and Vaadin Component Base. Merging an object the application does not control into a chart configuration or into a component's i18n property writes onto Object.prototype, making the injected properties visible to every object in the running application.
Users of affected versions should apply the following mitigation or upgrade. Releases that have fixed this issue include:
Product version Vaadin 23.0.0 - 23.6.13 Vaadin 24.0.0 - 24.9.20 Vaadin 24.10.0 - 24.10.9 Vaadin 25.0.0 - 25.1.11 Vaadin 25.2.0 - 25.2.6
Mitigation Upgrade to 23.6.14 Upgrade to 24.9.21 Upgrade to 24.10.10 Upgrade to 25.1.12 Upgrade to 25.2.7 or newer
Please note that Vaadin versions 10-13 and 15-22 are no longer supported and you should update either to the latest 23, 24, 25 version.
Artifacts Maven coordinates Vulnerable versions Fixed version com.vaadin:vaadin 23.0.0 - 23.6.13 >=23.6.14 com.vaadin:vaadin 24.0.0 - 24.9.20 >=24.9.21 com.vaadin:vaadin 24.10.0 - 24.10.9 >=24.10.10 com.vaadin:vaadin 25.0.0 - 25.1.11 >=25.1.12 com.vaadin:vaadin 25.2.0 - 25.2.6 >=25.2.7 com.vaadin:vaadin-core 24.7.0 - 24.9.20 >=24.9.21 com.vaadin:vaadin-core 24.10.0 - 24.10.9 >=24.10.10 com.vaadin:vaadin-core 25.0.0 - 25.1.11 >=25.1.12 com.vaadin:vaadin-core 25.2.0 - 25.2.6 >=25.2.7 com.vaadin:vaadin-charts-flow 23.0.0 - 23.6.13 >=23.6.14 com.vaadin:vaadin-charts-flow 24.0.0 - 24.9.20 >=24.9.21 com.vaadin:vaadin-charts-flow 24.10.0 - 24.10.9 >=24.10.10 com.vaadin:vaadin-charts-flow 25.0.0 - 25.1.11 >=25.1.12 com.vaadin:vaadin-charts-flow 25.2.0 - 25.2.6 >=25.2.7
npm packages npm package Vulnerable versions Fixed version @vaadin/charts 23.0.0 - 23.6.4 >=23.6.5 @vaadin/charts 24.0.0 - 24.9.17 >=24.9.18 @vaadin/charts 24.10.0 - 24.10.4 >=24.10.5 @vaadin/charts 25.0.0 - 25.1.11 >=25.1.12 @vaadin/charts 25.2.0 - 25.2.8 >=25.2.9 @vaadin/component-base 24.7.0 - 24.9.17 >=24.9.18 @vaadin/component-base 24.10.0 - 24.10.4 >=24.10.5 @vaadin/component-base 25.0.0 - 25.1.11 >=25.1.12 @vaadin/component-base 25.2.0 - 25.2.8 >=25.2.9
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
Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.
More in Prototype Pollution
View allPrototype pollution in Adobe Acrobat Reader versions 24.001.30356, 26.001.21367 and earlier enables arbitrary code execu
All versions of package dojo are vulnerable to Prototype Pollution via the setObject function. Rated critical severity (
Prototype pollution in the farinspace Partners WordPress plugin (versions up to and including 0.2.0) enables remote unau
The package handlebars before 4.7.7 are vulnerable to Prototype Pollution when selecting certain compiling options to co
This affects the package ini before 1.3.6. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitabl
Prototype pollution vulnerability in 'deephas' versions 1.0.0 through 1.0.5 allows attacker to cause a denial of service
A Prototype Pollution issue in Cronvel Tree-kit v.0.7.4 and before allows a remote attacker to execute arbitrary code vi
A Prototype Pollution issue in Aliconnect /sdk v.0.0.6 allows an attacker to execute arbitrary code via the aim function
All versions of the package safe-eval are vulnerable to Prototype Pollution via the safeEval function, due to improper s
This affects the package vm2 before 3.9.4 via a Prototype Pollution attack vector, which can lead to execution of arbitr
Prototype Pollution in chargeover redoc v2.0.9-rc.69 allows attackers to execute arbitrary code or cause a Denial of Ser
alizeait unflatto <= 1.0.2 was discovered to contain a prototype pollution via the method exports.unflatto at /dist/inde
EUVD-2026-89951
GHSA-48v4-h5mw-72ww
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB