CVE-2026-118244High· 7.2▾ TwilightHighcharts Core: HTML text parsing falls back to unfiltered `innerHTML` during printing
▾ Twilight zone — High severity, or a signal on a lesser flaw
impact 39.6 · likelihood 0 · exploitation 0
Need a working PoC? Pro members can cast a request and our team develops one — it lands right here.
Exploit-prediction probability, daily snapshots since Oct 29.
Disclosure to exploitation, from the record and what we observed since indexing it.
Disclosed via GHSA
0.3%
When the HTML text parser cannot obtain a document from DOMParser because the call throws, it falls back to assigning the raw markup to the innerHTML of an element created in the hosting document, and the allow-list is applied only to the resulting DOM afterwards. In Chromium the Trusted Types policy callback that the parser uses throws while a beforeprint handler is running, so if the hosting page re-renders the chart from a beforeprint handler, every HTML-rendered text option parsed at that moment, such as useHTML titles, axis labels and data labels or text set by responsive rules, is inserted unsanitized, and event handlers embedded in that markup run in the origin of the page hosting the chart. Exploitation requires that untrusted data reach the chart configuration, that the hosting page update the chart from a beforeprint handler in Chromium, and that printing be started, which the print item of the exporting menu does on its own. Charts built with Highcharts Stock, Maps and Gantt are included, since those ship from the same package as Core.
Drop-in fix - for any versions affected (12.0.0-13.0.2). Add the below IIFE to run after Highcharts is loaded.
((n)=>{n.AST.prototype.parseMarkup=function parseMarkup(t){let e,i=[];t=t.trim().replace(/ style=(["'])/g," data-style=$1");try{e=new DOMParser().parseFromString(tI?tI.createHTML(t):t,"text/html")}catch{}if(!e)try{e=new DOMParser().parseFromString(t,"text/html")}catch{}e||((e=n.doc.implementation.createHTMLDocument("")).body.innerHTML=t);let s=(t,e)=>{let i=t.localName||t.nodeName.toLowerCase(),o={tagName:i};"#text"===i&&(o.textContent=t.textContent||"");let r=t.attributes;if(r){let t={};[].forEach.call(r,e=>{"data-style"===e.name?o.style=tB.parseStyle(e.value):t[e.name]=e.value}),o.attributes=t}if(t.childNodes.length){let e=[];[].forEach.call(t.childNodes,t=>{s(t,e)}),e.length&&(o.children=e)}e.push(o)};return[].forEach.call(e.body.childNodes,t=>s(t,i)),i};})(Highcharts);
The patched releases are available from all the usual distribution channels. With npm, upgrade the affected package to the patched version listed above, for example npm install [email protected]. If you load Highcharts from the CDN, use the versioned URLs on code.highcharts.com, for example https://code.highcharts.com/13.1.0/highcharts.js. For more on each installation method, see the installation guide.
highcharts >= 12.0.0, < 12.6.1highcharts >= 13.0.0, <= 13.0.2Upgrade to a patched release:
highcharts 12.6.1highcharts 13.1.0Connected by shared product, vendor, weakness, or advisory.
CVE-2026-118251High· 8.4Highcharts: `javascript:` URL in credits.href runs script on click
CVE-2026-118246High· 8.4Highcharts Core: `breadcrumbs.style` keys become SVG event-handler attributes
CVE-2026-116796High· 7.2Highcharts Core: `javascript:` URL in an `xlink:href` attribute survives text filtering and reaches exported charts
CVE-2026-118249High· 7.2Highcharts: series column construction writes to Object.prototype
CVE-2026-118250High· 7.2Highcharts: dotted series.keys paths write to Object.prototype
CVE-2026-118253High· 8.4Highcharts Dashboards parses fullscreen labels as HTML