{"id":"CVE-2026-118255","kind":"vulnerability","aliases":["CVE-2026-118255","GHSA-6hgp-fmhr-mrg4"],"related":[],"title":"Highcharts Grid: `javascript:` URL in credits.href runs script on click","description":"### Impact\nAn attacker who controls the Grid configuration can set `credits.href` to a `javascript:` URL. The value is not validated against an allowed-scheme list before it is applied to the credits link, so activating that link runs attacker-supplied script in the origin of the page hosting the Grid. Exploitation requires that untrusted data reach the Grid configuration and that a user activate the credits link. Script running this way has the same access to page data, storage and session state as the hosting application.\n\n### Workarounds\nPaste in after the Grid Pro module is imported, before a Grid is created.\n\n```javascript\nconst { AST } = Grid;\n\nfunction sanitize(options) {\n    const credits = options && options.credits;\n\n    if (credits && typeof credits.href === 'string') {\n        const filtered = AST.filterUserAttributes({ href: credits.href });\n\n        if (!filtered.href) {\n            delete credits.href;\n        }\n    }\n\n    return options;\n}\n\n// Both Grid.grid() and grid.update() funnel through loadUserOptions, so one\n// hook covers both entry points.\nconst { prototype } = Grid.Grid;\nconst loadUserOptions = prototype.loadUserOptions;\n\nprototype.loadUserOptions = function (options, ...rest) {\n    sanitize(options);\n    return loadUserOptions.call(this, options, ...rest);\n};\n```\n\n### Obtaining the patched version\nThe 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 @highcharts/grid-lite@3.2.0`. If you load Highcharts Grid from a CDN, use a versioned URL, for example `https://cdn.jsdelivr.net/npm/@highcharts/grid-lite@3.2.0/grid-lite.js`. For more on each installation method, see the [installation guide](https://www.highcharts.com/docs/grid/installation).","summary":"Highcharts Grid applies a configured credits.href to the credits link without checking the URL scheme, so a javascript: URL is accepted. When a user activates that link, the script runs in the hosting page's origin with access to the application's data and session.","severity":"high","cvss":8.4,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"@highcharts/dashboards","fixed":["4.0.0"],"affected":">= 3.2.0, <= 3.6.0","ecosystem":"npm"},{"name":"@highcharts/grid-pro","fixed":["3.2.0"],"affected":">= 2.0.0, <= 3.1.0","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["cwe-79","dashboards","frontend","highcharts","javascript","package"],"not_affected_if":["already-on-3.2.0","fixed-configuration"],"how_to_check":"- Check the installed Highcharts Grid version in the project's package manifest or lockfile, for example `npm ls highcharts-grid` or `grep -i highcharts-grid package-lock.json`\n- Look for code that sets `credits.href` from user-supplied or stored configuration","fix":"- Upgrade Grid Pro to `3.2.0` or later\n- Until upgraded, do not allow untrusted users to set Grid configuration, and disable or sanitize `credits.href`","status":"open","published_at":"2026-10-28T19:17:29+00:00","first_seen_at":"2026-10-28T19:34:55+00:00","triaged_at":"2026-10-28T19:35:51+00:00","updated_at":"2026-10-28T20:01:43+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-28T19:35:51Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade Grid Pro to `3.2.0` or later\n- Until upgraded, do not allow untrusted users to set Grid configuration, and disable or sanitize `credits.href`","reach":"internet","title":"Highcharts Grid: credits link runs attacker JavaScript in page origin","impact":"high","summary":"Highcharts Grid applies a configured credits.href to the credits link without checking the URL scheme, so a javascript: URL is accepted. When a user activates that link, the script runs in the hosting page's origin with access to the application's data and session.","category":"package","nicknames":[],"who_cares":["javascript","highcharts","frontend","dashboards"],"confidence":0.7,"needs_auth":"unknown","worst_case":"Attacker script runs in the app's origin and reads session data","analyst_note":"Confirm the exact affected Grid Pro versions and whether the free Highcharts Grid package is also affected, using the vendor advisory or fix commit.","how_to_check":"- Check the installed Highcharts Grid version in the project's package manifest or lockfile, for example `npm ls highcharts-grid` or `grep -i highcharts-grid package-lock.json`\n- Look for code that sets `credits.href` from user-supplied or stored configuration","needs_analyst":true,"not_affected_if":["fixed-configuration","already-on-3.2.0"],"who_is_affected":"Applications that use Highcharts Grid from version 2.0.0 up to 3.2.0 and let someone other than the developer control the Grid configuration, such as saved dashboards or user-editable chart settings, are exposed. Applications where the configuration is fixed in code by developers are much less exposed.","user_interaction":"yes","needs_special_setup":"unknown","severity_if_unknown":"high"},"cost_usd":0.000643,"input_tokens":3344,"output_tokens":617,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-118255':13A,21A '-2026':12A,20A '-79':25B '/docs/grid/installation).':299C '/npm/@highcharts/grid-lite@3.2.0/grid-lite.js':286C '3.2.0':269C '6hgp':16A 'accept':51B 'access':68B,152C 'activ':55B,111C,141C 'affect':256C 'allow':99C 'allowed-schem':98C 'appli':33B,105C 'applic':71B,163C 'ast':181C 'ast.filteruserattributes':197C 'attack':78C,116C 'attacker-suppli':115C 'avail':245C 'cdn':277C 'cdn.jsdelivr.net':285C 'cdn.jsdelivr.net/npm/@highcharts/grid-lite@3.2.0/grid-lite.js':284C 'channel':251C 'check':42B 'click':10A 'configur':35B,83C,136C 'const':180C,186C,195C,220C,223C 'control':80C 'cover':216C 'creat':178C 'credit':39B,108C,143C,187C,191C 'credits.href':6A,36B,86C,193C,199C,203C 'cve':11A,19A 'cwe':24B 'dashboard':26B 'data':73B,132C,155C 'delet':202C 'distribut':250C 'entri':218C 'exampl':265C,283C 'exploit':128C 'filter':196C 'filtered.href':201C 'fmhr':17A 'frontend':27B 'function':183C,227C 'funnel':210C 'ghsa':15A 'ghsa-6hgp-fmhr-mrg4':14A 'grid':2A,32B,82C,127C,135C,169C,176C,182C,274C 'grid.grid':207C,222C 'grid.update':209C 'guid':296C 'highchart':1A,28B,31B,273C 'highcharts/dashboards':22A 'highcharts/grid-lite':268C 'highcharts/grid-pro':23A 'hook':215C 'host':63B,125C,162C 'href':198C 'impact':76C 'import':173C 'instal':267C,291C,295C 'javascript':3A,29B,48B,89C,179C 'link':40B,57B,109C,113C,144C 'list':101C,262C 'load':272C 'loaduseropt':212C,224C 'loaduseroptions.call':233C 'method':292C 'modul':171C 'mrg4':18A 'npm':253C,266C 'obtain':237C 'one':214C 'option':185C,188C,205C,228C,231C,235C 'options.credits':189C 'origin':66B,121C 'packag':30B,257C 'page':64B,124C,154C 'past':165C 'patch':239C,242C,260C 'point':219C 'pro':170C 'prototyp':221C 'prototype.loaduseroptions':225C,226C 'reach':133C 'releas':243C 'requir':129C 'rest':229C,236C 'return':204C,232C 'run':7A,60B,114C,146C 'sanit':184C,230C 'scheme':45B,100C 'script':8A,59B,118C,145C 'see':293C 'session':75B,158C 'set':85C 'state':159C 'storag':156C 'string':194C 'suppli':117C 'typeof':192C 'untrust':131C 'upgrad':254C 'url':4A,44B,49B,90C,281C 'use':278C 'user':54B,140C 'usual':249C 'valid':95C 'valu':92C 'version':240C,261C,280C 'way':148C 'without':41B 'workaround':164C 'www.highcharts.com':298C 'www.highcharts.com/docs/grid/installation).':297C","nicknames":[],"mitigations":[],"who_affected":"Applications that use Highcharts Grid from version 2.0.0 up to 3.2.0 and let someone other than the developer control the Grid configuration, such as saved dashboards or user-editable chart settings, are exposed. Applications where the configuration is fixed in code by developers are much less exposed.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T19:17:29+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:A/VC:H/VI:H/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-118255","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-118255","severity":null,"published_at":"2026-10-28T19:17:29+00:00","modified_at":"2026-10-28T19:17:29+00:00","first_seen_at":"2026-10-28T19:34:55+00:00","fetched_at":"2026-10-28T19:34:55+00:00","note":null},{"source":"ghsa","external_id":"GHSA-6hgp-fmhr-mrg4","url":"https://github.com/advisories/GHSA-6hgp-fmhr-mrg4","severity":"high","published_at":"2026-10-28T19:57:48+00:00","modified_at":"2026-10-28T19:57:51+00:00","first_seen_at":"2026-10-28T20:01:43+00:00","fetched_at":"2026-10-28T21:07:45+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}