Multiple vulnerabilities in the Highcharts library bundled with Vaadin Charts
Overview
See CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') and CWE-1321: Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')
Description
| Issue | Upstream advisory | Vaadin 22 to 24 | Vaadin 25 |
|---|---|---|---|
| Dotted `series.keys` paths write to Object.prototype | GHSA-rmqc-xvr3-v46c | affected | affected |
| A `javascript:` URL in `credits.href` runs script when clicked | GHSA-5793-x2q3-c3q7 | affected | affected |
| `breadcrumbs.style` keys become SVG event handler attributes | GHSA-35rr-xwfh-x789 | not affected | affected |
| HTML text parsing falls back to unfiltered innerHTML while printing | GHSA-65hg-cf3f-5m39 | not affected | affected |
| A `javascript:` URL in an `xlink:href` attribute survives text filtering and reaches exported charts | GHSA-mw4f-gj5x-6xr4 | not affected | affected |
Through the web components API the issues are reachable where an application assigns an object it did not construct itself, typically one parsed from JSON, to the additionalOptions property of <vaadin-chart> or <vaadin-chart-series>, to updateConfiguration(), or directly to the configuration property.
Through the Java (Flow) API the typed configuration model limits which property names reach the client, but it passes string values through unchanged. The dotted keys issue is reachable through setKeys() and addKey() on the PlotOptions classes. The credits issue is not reachable through Credits.setHref() with the default configuration, which rejects schemes outside URL_SAFE_SCHEMES, but it is reachable through Credits.setUnsafeHref() and where an application widens that scheme list. The text parsing and xlink:href issues are reachable through the options that accept markup, such as Title.setText(), Subtitle.setText(), axis labels, data labels and tooltip formats. The breadcrumbs issue is not reachable through the Java model, because Breadcrumbs.setStyle() takes a typed Style.
Server-side SVG export is affected as well. SVGGenerator in vaadin-charts-flow-svg-generator renders a chart configuration with its own copy of Highcharts in a Node.js process, so the xlink:href issue applies to the SVG it returns and the dotted keys issue to the process that renders it. A new process starts for each generate() call, so injected properties do not persist between exports.
The fixed versions apply Highsoft's recommended workarounds to the bundled Highcharts when it loads, in the browser and in the SVG generator alike. The bundled Highcharts version does not change, so a dependency scanner still reports highcharts 9.2.2 or 12.2.0 on a fixed Vaadin version.
Note that chart options holding a function value, set through setFormatter() and similar methods in Java or as _fn_ properties in JSON, are evaluated as JavaScript by design. Applications must never pass untrusted data to those APIs, and this advisory does not change that.
Affected products and mitigation
| Product version | Mitigation |
|---|---|
| Vaadin 22.0.0 - 23.6.15 | Upgrade to 23.6.16 |
| Vaadin 24.0.0 - 24.4.23 | Upgrade to 24.4.24 |
| Vaadin 24.5.0 - 24.7.15 | Upgrade to 24.7.16 |
| Vaadin 24.8.0 - 24.9.22 | Upgrade to 24.9.23 |
| Vaadin 24.10.0 - 24.10.10 | Upgrade to 24.10.11 |
| Vaadin 25.0.0 - 25.2.9 | Upgrade to 25.2.10 |
| Vaadin 25.3.0 | Upgrade to 25.3.1 or newer |
Do not pass data the application does not control to the chart configuration. That covers the additionalOptions property of <vaadin-chart> and <vaadin-chart-series>, updateConfiguration() and the configuration property, setKeys() and addKey() on the PlotOptions classes, Credits.setUnsafeHref(), and the text options that accept markup.
Artifacts
| Maven coordinates | Vulnerable version | Fixed version |
|---|---|---|
| com.vaadin:vaadin | 22.0.0 - 23.6.15 | ≥23.6.16 |
| com.vaadin:vaadin | 24.0.0 - 24.4.23 | ≥24.4.24 |
| com.vaadin:vaadin | 24.5.0 - 24.7.15 | ≥24.7.16 |
| com.vaadin:vaadin | 24.8.0 - 24.9.22 | ≥24.9.23 |
| com.vaadin:vaadin | 24.10.0 - 24.10.10 | ≥24.10.11 |
| com.vaadin:vaadin | 25.0.0 - 25.0.13 | ≥25.2.10 |
| com.vaadin:vaadin | 25.1.0 - 25.1.13 | ≥25.2.10 |
| com.vaadin:vaadin | 25.2.0 - 25.2.9 | ≥25.2.10 |
| com.vaadin:vaadin | 25.3.0 | ≥25.3.1 |
| com.vaadin:vaadin-charts-flow | 22.0.0 - 23.6.15 | ≥23.6.16 |
| com.vaadin:vaadin-charts-flow | 24.0.0 - 24.4.22 | ≥24.4.24 |
| com.vaadin:vaadin-charts-flow | 24.5.0 - 24.7.14 | ≥24.7.15 |
| com.vaadin:vaadin-charts-flow | 24.8.0 - 24.9.22 | ≥24.9.23 |
| com.vaadin:vaadin-charts-flow | 24.10.0 - 24.10.10 | ≥24.10.11 |
| com.vaadin:vaadin-charts-flow | 25.0.0 - 25.0.13 | ≥25.2.10 |
| com.vaadin:vaadin-charts-flow | 25.1.0 - 25.1.13 | ≥25.2.10 |
| com.vaadin:vaadin-charts-flow | 25.2.0 - 25.2.9 | ≥25.2.10 |
| com.vaadin:vaadin-charts-flow | 25.3.0 | ≥25.3.1 |
| com.vaadin:vaadin-charts-flow-svg-generator | 21.0.0 - 23.6.15 | ≥23.6.16 |
| com.vaadin:vaadin-charts-flow-svg-generator | 24.0.0 - 24.4.22 | ≥24.4.24 |
| com.vaadin:vaadin-charts-flow-svg-generator | 24.5.0 - 24.7.14 | ≥24.7.15 |
| com.vaadin:vaadin-charts-flow-svg-generator | 24.8.0 - 24.9.22 | ≥24.9.23 |
| com.vaadin:vaadin-charts-flow-svg-generator | 24.10.0 - 24.10.10 | ≥24.10.11 |
| com.vaadin:vaadin-charts-flow-svg-generator | 25.0.0 - 25.0.13 | ≥25.2.10 |
| com.vaadin:vaadin-charts-flow-svg-generator | 25.1.0 - 25.1.13 | ≥25.2.10 |
| com.vaadin:vaadin-charts-flow-svg-generator | 25.2.0 - 25.2.9 | ≥25.2.10 |
| com.vaadin:vaadin-charts-flow-svg-generator | 25.3.0 | ≥25.3.1 |
com.vaadin:vaadin-core is not listed because Vaadin Charts is not part of Vaadin core. On the 24.4 and 24.7 lines the Charts artifacts carry a patch number of their own, which is why their fixed version differs from the platform one. The 25.0 and 25.1 lines reached end of life without a fixed release, so each has a row of its own ending at the last version published on it, 25.0.13 and 25.1.13 in Maven and 25.0.13 and 25.1.14 in npm, and their users upgrade to the 25.2 line.
| npm package | Vulnerable version | Fixed version |
|---|---|---|
| @vaadin/charts | 22.0.0 - 23.6.6 | ≥23.6.7 |
| @vaadin/charts | 24.0.0 - 24.4.18 | ≥24.4.19 |
| @vaadin/charts | 24.5.0 - 24.7.12 | ≥24.7.13 |
| @vaadin/charts | 24.8.0 - 24.9.18 | ≥24.9.19 |
| @vaadin/charts | 24.10.0 - 24.10.6 | ≥24.10.7 |
| @vaadin/charts | 25.0.0 - 25.0.13 | ≥25.2.14 |
| @vaadin/charts | 25.1.0 - 25.1.14 | ≥25.2.14 |
| @vaadin/charts | 25.2.0 - 25.2.13 | ≥25.2.14 |
| @vaadin/charts | 25.3.0 | ≥25.3.1 |
The npm versions are the web components versions and do not match the Vaadin product versions.
Note for dependency scanners
The fixed versions still depend on highcharts 9.2.2 or 12.2.0, because the fix is a workaround applied when the library loads rather than an upgrade. A scanner that reports those Highcharts versions on a fixed Vaadin version is reporting a vulnerability that the Vaadin fix already neutralises.
References
- https://github.com/highcharts/highcharts/security/advisories/GHSA-rmqc-xvr3-v46c
- https://github.com/highcharts/highcharts/security/advisories/GHSA-5793-x2q3-c3q7
- https://github.com/highcharts/highcharts/security/advisories/GHSA-35rr-xwfh-x789
- https://github.com/highcharts/highcharts/security/advisories/GHSA-65hg-cf3f-5m39
- https://github.com/highcharts/highcharts/security/advisories/GHSA-mw4f-gj5x-6xr4
- https://github.com/vaadin/web-components/pull/12886
- https://github.com/vaadin/flow-components/pull/10283
History
- 2026-10-21: Initial vulnerability report published