Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft malicious .drawio with editable=0 plain-text sibling
-
DeliveryDeliver file via share/email/embed
-
ExploitVictim opens or imports diagram
-
ExecutiongetLabelValue returns unencoded label parsed as HTML
-
PersistExecute attacker JavaScript in draw.io origin
-
ImpactExfiltrate diagram data, storage, and cookies
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 victim to open or import an attacker-crafted .drawio file in draw.io prior to version 30.2.5 (UI:R is mandatory - there is no unattended trigger). The malicious file must contain a specific cell structure: an HTML sibling cell that keeps the formatted-label path enabled together with an editable=0 plain-text sibling that is excluded from the merged selection style but remains in the iteration set, so graph.cellRenderer.getLabelValue() returns its label unencoded and mxUtils.canConvertHtmlToSvg() parses it as HTML. No authentication to draw.io is needed by the attacker (PR:N); the attacker only needs to get the crafted file in front of a user. The impact is confined to the draw.io origin's same-origin context (diagram data, browser storage, non-HttpOnly cookies, same-origin actions). What limits real-world risk: required user interaction (opening/importing an untrusted file), affected versions strictly below 30.2.5, and the lack of any host-level or cross-origin impact. |
| Impact | This is a genuine but moderate-severity client-side stored XSS (CWE-79) with a vendor CVSS of 6.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N), and my independent assessment agrees closely. The decisive limiting factor is UI:R - exploitation requires the victim to open or import an attacker-crafted .drawio file; there is no path to purely remote, no-interaction compromise. No EPSS score was supplied, the CVE is NOT in CISA KEV, and no public POC is referenced, so exploitation status is: no public exploit identified at time of analysis. The impact is bounded (C:L/I:L/A:N - script runs in the draw.io origin, exposing diagram data, browser storage, non-HttpOnly cookies, and same-origin actions, but not full account/host takeover). Notably, this bypasses the earlier CVE-2026-46642 remediation, which signals that this code path (label rendering of editable=0 plain-text siblings) has attacker interest and prior scrutiny - an incomplete-fix pattern that raises the practical likelihood of a working exploit being developed. Overall this is a real 'patch promptly' issue for organizations that render untrusted .drawio files, but not an emergency network-facing RCE; the single most important signal (UI:R, no KEV, no POC) argues for routine rather than crisis prioritization. |
| Exploit ScenarioDerived | An attacker crafts a malicious .drawio diagram containing an HTML sibling cell alongside an editable=0 plain-text sibling whose unencoded label is parsed as HTML by mxUtils.canConvertHtmlToSvg(). The attacker shares or emails this file (or embeds it in a wiki/repo), and when a victim opens or imports it in a vulnerable draw.io (<30.2.5), attacker-controlled JavaScript executes in the draw.io origin, exposing diagram data, browser storage, non-HttpOnly cookies, and same-origin actions. No public POC is referenced, but the flaw is a documented bypass of the prior CVE-2026-46642 fix. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 21, 2026
Stored cross-site scripting in draw.io (jgraph/drawio) versions prior to 30.2.5 lets an attacker-crafted .drawio diagram execute JavaScript in the draw.io origin once a victim opens or imports the file and selects the affected cells. The payload survives the earlier CVE-2026-46642 remediation because an HTML sibling cell keeps the formatted-label path enabled while an editable=0 plain-text sibling is excluded from the merged selection style yet remains in the iteration set, so graph.cellRenderer.getLabelValue() returns the label unencoded and mxUtils.canConvertHtmlToSvg() then parses it as HTML. Successful exploitation exposes diagram data, browser storage, non-HttpOnly cookies, and same-origin actions available to the victim; exploitation requires user interaction (opening or importing an untrusted file) and no public exploit code has been identified at time of analysis, with a vendor CVSS of 6.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N).
RemediationAI
Vendor-released patch: 30.2.5 - upgrade draw.io (web client and any self-hosted deployment) to version 30.2.5 or later, which contains the label-encoding/formatting-path fix in commit 7976c02e1b10b1687c028d82782f9f5d90a885d6 and is described in advisory GHSA-c76x-r78m-phwx and release tag v30.2.5; rolling back to 30.2.4 or earlier reintroduces the flaw. Where immediate upgrade is not possible, the effective compensating control is refusing to open or import untrusted .drawio files (treat downloaded diagrams like executable attachments, since the trigger is simply selecting the crafted cells), which costs the ability to review third-party diagrams until the upgrade lands; serving the draw.io instance from a dedicated origin that shares no cookies or storage with other internal applications limits what an exploited session can reach, but does not prevent script execution inside draw.io itself, and note that non-HttpOnly cookies on that origin are explicitly within the attacker's reach. Sanitizing .drawio files by stripping HTML labels or normalizing editable=0 cells can neutralize the specific HTML-sibling plus plain-text-sibling construction, but it is brittle against equivalent label variants and requires a trusted sanitizer, so it should be a stopgap rather than a substitute for patching. Because exploitation requires the victim to open the file and interact with the selection (UI:R), user awareness about trust boundaries for diagram files is a useful secondary measure with no technical side effects.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
This is a CWE-79 cross-site scripting defect rooted in the formatted-label rendering path of the draw.io web client, specifically TextFormatPanel.addFont() in src/main/webapp/js/grapheditor/Format.js. draw.io cells can carry HTML labels, and the renderer decides whether to treat a label as HTML based on the selection's merged style; the crafted file combines an HTML sibling cell (which keeps that formatted-label branch enabled) with an editable=0 plain-text sibling that is dropped from the merged selection style but still iterated over during font application. Because graph.cellRenderer.getLabelValue() returns that plain-text label without HTML encoding, and mxUtils.canConvertHtmlToSvg() subsequently parses it as HTML, attacker markup reaches the DOM - a direct bypass of the fix previously shipped for CVE-2026-46642. The CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N vector indicates the attacker needs no credentials (PR:N) and delivers the payload as a file, but the victim must open/import it and select the cells (UI:R); scope is changed (S:C) because the script runs in the draw.io origin rather than the attacker's, with low confidentiality and integrity impact and no availability impact, which matches the assessed confinement of impact to that origin (diagram content, browser storage, non-HttpOnly cookies, same-origin actions) and the absence of any host-level or cross-origin effect. The affected-product CPE, cpe:2.3:a:jgraph:drawio:*:*:*:*:*:*:*:*, does not itself encode a version bound, so the authoritative constraint is the vendor advisory and release notes: everything strictly before 30.2.5.
Know when Drawio 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
Crafted file is network-delivered (AV:N) and needs no attacker privileges (PR:N) but requires the victim to open it (UI:R); script escaping into the draw.io origin justifies S:C with limited C:L/I:L and no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
draw.io is a configurable diagramming and whiteboarding application. Prior to version 30.2.5, opening or importing a crafted .drawio file can execute attacker-controlled JavaScript in the draw.io origin when selected cells are processed by TextFormatPanel.addFont() in src/main/webapp/js/grapheditor/Format.js. An HTML sibling cell keeps the formatted-label path enabled while an editable=0 plain-text sibling is excluded from the merged selection style but remains in the iteration set. graph.cellRenderer.getLabelValue() returns that plain-text label without HTML encoding, and mxUtils.canConvertHtmlToSvg() parses it as HTML, bypassing the earlier CVE-2026-46642 remediation. Successful exploitation can expose diagram data, browser storage, non-HttpOnly cookies, and same-origin actions available to the victim. This issue is fixed in version 30.2.5.
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.
OS Command Injection in GitHub repository jgraph/drawio prior to 21.5.0. Rated critical severity (CVSS 9.8), this vulner
Arbitrary Code Execution through Sanitizer Bypass in GitHub repository jgraph/drawio prior to 18.0.0. Rated critical sev
Improper Input Validation in GitHub repository jgraph/drawio prior to 18.0.6. Rated high severity (CVSS 8.8), this vulne
OS Command Injection in GitHub repository jgraph/drawio prior to 20.3.0. Rated high severity (CVSS 7.8), this vulnerabil
Denial of Service in GitHub repository jgraph/drawio prior to 18.1.3. Rated high severity (CVSS 7.5), this vulnerability
Improper Access Control in GitHub repository jgraph/drawio prior to 20.2.8. Rated high severity (CVSS 7.5), this vulnera
Exposure of Sensitive Information to an Unauthorized Actor in GitHub repository jgraph/drawio prior to 18.1.2. Rated hig
Server-Side Request Forgery (SSRF) in GitHub repository jgraph/drawio prior to 18.0.8. Rated high severity (CVSS 7.5), t
Server-Side Request Forgery (SSRF) in GitHub repository jgraph/drawio prior to 18.0.7. Rated high severity (CVSS 7.5), t
Server-Side Request Forgery (SSRF) in GitHub repository jgraph/drawio prior to 18.0.5. Rated high severity (CVSS 7.5), t
Server-Side Request Forgery (SSRF) in GitHub repository jgraph/drawio prior to 18.0.6. Rated high severity (CVSS 7.5), t
Path Traversal in WellKnownServlet in GitHub repository jgraph/drawio prior to 18.0.5. Rated high severity (CVSS 7.5), t
EUVD-2026-83987
NVD
CVE.org
EPSS
GitHub
VulDB
Exploit-DB