Skip to main content

billboard.js EUVDEUVD-2026-115726

| CVE-2026-120988 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-11-03 naver GHSA-qwgf-vfr8-c8w3
6.1
CVSS 3.1 · Vendor: naver
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Inject crafted strings into series ids
  2. Delivery
    Victim loads page rendering custom legend
  3. Exploit
    Split tag bypasses per-item sanitize
  4. Execution
    Concatenation reassembles live element
  5. Impact
    Browser 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
No patch listed yet 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

billboard.js patch: 4.1.3

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

Vendor (naver) PRIMARY 6.1 MEDIUM
AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
vuln.today AI 6.1 MEDIUM

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.

3.1 AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (naver).

CVSS VectorVendor: naver

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

2
CVSS changed
Nov 03, 2026 - 20:22 NVD
6.1 (MEDIUM)
CVE Published
Nov 03, 2026 - 07:15 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.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

EPSS Score
0.2%
Top 95% exploitable
Prevalence
Medium
popular open-source npm charting library, but only non-default custom-legend configs affected
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available No
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +30
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy