Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessInject crafted strings into series ids
-
DeliveryVictim loads page rendering custom legend
-
ExploitSplit tag bypasses per-item sanitize
-
ExecutionConcatenation reassembles live element
-
ImpactBrowser executes attacker JavaScript (DOM XSS)
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires a non-default billboard.js configuration: the custom HTML legend must be enabled with both legend.contents.bindto and legend.contents.template set, and the template must leave an HTML tag open after the {=TITLE} placeholder. The series ids or names must originate from untrusted or third-party data controlled or influenced by the attacker. The flaw works because sanitize() in src/module/sanitize.ts rewrites only complete <...> matches, so a trailing unterminated tag in one series id passes through unchanged and is completed by the '>' in the next id after the per-item sanitized fragments are concatenated and written via wrapper.html() without re-sanitizing the joined string. Limiting factors: the attack needs victim UI:R (the user must load/view the chart page), it affects only applications that both feed untrusted data into series identifiers and use the custom legend template; tooltip and tableview are not affected because they sanitize the whole string. Charts using default legends or trusted-only series data are not exposed. |
| Impact | This is a moderate-severity DOM-based XSS (CWE-79, CVSS 6.1) whose real-world risk is tightly bounded by its exploitation preconditions rather than by the network attack vector alone. The CVSS vector (AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N) signals a network-reachable, low-complexity flaw with no attacker privileges but required user interaction (the victim must load the page) and a scope change into the DOM/browser context. All corroborating signals point to low urgency, not a drop-everything priority: EPSS is 0.16% (5th percentile), there is no CISA KEV listing (not actively exploited), and the vuln.today decision label is 'this_month' rather than act_now or emergency. Critically, this is NOT a flaw in default configurations - the GHSA advisory states exploitation requires the non-default custom HTML legend feature (legend.contents.bindto and legend.contents.template) AND untrusted data flowing into series ids/names AND a template that leaves a tag open after {=TITLE}. It is therefore a developer-dependent sink, not a universally exploitable endpoint, which is why the low EPSS is consistent with the medium CVSS: most billboard.js deployments do not use this configuration at all. The one signal that raises attention above the EPSS floor is that a concrete PoC appears in the vendor's own GHSA advisory and the issue is a confirmed bypass of the prior fix for CVE-2026-1513. |
| Exploit ScenarioDerived | A web application uses billboard.js with a custom HTML legend (legend.contents.template) and renders chart series ids or names drawn from user-supplied or third-party data. An attacker supplies two crafted series ids that each individually survive sanitization but, once concatenated by the legend renderer, reconstruct a live element such as <img src=x onerror=...>, executing attacker JavaScript in the victim's browser when the chart is viewed. A working PoC demonstrating exactly this split-tag bypass is published in the vendor's GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 03, 2026
DOM-based cross-site scripting in the billboard.js charting library before 4.1.3 lets attacker-influenced series ids or names execute JavaScript in the browser of anyone viewing a chart built with a custom HTML legend. Only applications that set both legend.contents.bindto and legend.contents.template, use a template that leaves a tag open after the {=TITLE} placeholder, and feed untrusted or third-party data into series identifiers are exposed; default legends and trusted-only series data are not. CVSS 6.1 reflects the requirement for user interaction and the non-default configuration, EPSS is low at 0.16% (5th percentile), there is no CISA KEV entry, and the upstream advisory published by Naver includes a public PoC reference that has not been independently verified as working exploit code. The issue is a bypass of the sanitize step that was added for CVE-2026-1513 and is fixed in 4.1.3.
RemediationAI
Vendor-released patch: billboard.js 4.1.3. Upgrade billboard.js to 4.1.3 or later; the fix escapes a trailing unterminated <... in sanitize() and sanitizes the concatenated legend HTML in both updateLegendTemplate() and updateHtmlLegendTemplate() before wrapper.html(), so no further action is needed once the patched release is deployed. Where upgrading cannot be done immediately, the vendor workaround is to stop using untrusted or third-party values as series ids or names in custom legend templates, or to validate them before passing them to the chart; the trade-off is that this shifts responsibility onto application-side validation and any missed input path remains exploitable. Because exposure depends on the non-default custom legend configuration, charts that do not set legend.contents.bindto together with legend.contents.template, or that use a template which closes its tags after {=TITLE}, are not exposed and can wait for the normal dependency refresh; note that removing or disabling the custom legend template avoids the flaw but changes legend rendering and layout. Consult the upstream advisory at https://github.com/naver/billboard.js/security/advisories/GHSA-g5px-mcqp-3ghp for the full patch and workaround details.
Affected VersionsENISA
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
billboard.js renders its HTML legend from per-series fragments: updateLegendTemplate() in src/ChartInternal/internals/legend.ts and updateHtmlLegendTemplate() in src/config/resolver/canvas.ts each sanitize an individual item, concatenate the results with html += content, and write the joined string through wrapper.html(). The sanitize() routine in src/module/sanitize.ts only rewrites complete tag matches with the pattern /<\/?[^>]*>|[^<>\s]+>/g, so a trailing unterminated construct such as <img src=x onerror=... matches nothing and passes through unchanged. Because each series id is sanitized in isolation, an unterminated tag left open in one id is completed by the '>' character in the next id after concatenation, and the joined string is never re-sanitized before being written to the DOM. The result is a DOM XSS (CWE-79): an attacker who can influence series ids or names causes the browser to parse the spliced markup as a live element with an event handler. The same advisory notes that the tooltip and tableview renderers are unaffected because they sanitize the entire string rather than per-item fragments. Fixed in 4.1.3 by escaping a trailing unterminated <... inside sanitize() so concatenated content cannot complete it, and by sanitizing the concatenated HTML in both legend renderers before wrapper.html(), matching the tooltip approach. This is explicitly a bypass of the sanitizer introduced for CVE-2026-1513 (GHSA-rpc5-pm7q-hjmp).
Know when Billboard Js 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
AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
Attacker needs no privileges and supplies untrusted series data (PR:N), but the victim must view the page (UI:R) and script runs in the browser DOM crossing scope (S:C) with limited C/I, no A.
Primary rating from Vendor (naver).
CVSS VectorVendor: naver
Lifecycle Timeline
2DescriptionCVE.org
billboard.js before 4.1.3 allows an attacker to execute malicious JavaScript due to improper sanitization of series ids during legend template rendering.
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
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
EUVD-2026-115726
GHSA-qwgf-vfr8-c8w3
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB