GitHub Advisoryadvisory · npm
GHSA-6x64-9x62-f2gx Mermaid allows CSS injection applying to sibling elements of the diagram
MEDIUM
Official page ↗
- Aliases
- CVE-2026-50159
- Ecosystem
- npm
- Packages
- mermaid
- Severity
- Moderate
- CVSS vector
- CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:L/VA:N/SC:L/SI:L/SA:L
- Weaknesses
- CWE-94
- Reviewed
- 2026-08-06
Affected packages
• npm mermaid: >= 11.0.0-alpha.1, < 11.16.1 → fixed in 11.16.1
• npm mermaid: < 10.9.8 → fixed in 10.9.8
Description
Summary
Mermaid does not fully restrict CSS to the rendered SVG subtree. Although selectors are prefixed with `#mermaid-X`, sibling (`~` and `+`) combinators can still escape the Mermaid container and inject styles to DOM elements adjacent to the diagram ``.
Most users of mermaid would not be affected by this, as mermaid adds its `` as an only child of it's parent element. However, you may be affected if you manually insert the `` (or other elements) into the DOM yourself.
Details
Mermaid namespaces CSS through with a middleware intended to scope all rules to the diagram's SVG element. CSS nesting expands `& ~ * { ... }` to `#svgId ~ *`, which selects all sibling elements following the SVG in the DOM, outside the diagram boundary.
Impact
An attacker able to supply diagram source to a page (e.g., user-generated content rendered by Mermaid) could inject CSS rules affecting sibling elements to the diagram `` on the host page. This can be used for UI redressing, hiding content, conditional CSS-based probing, or phishing-style visual manipulation.
JavaScript execution is not possible via this vector.
Patches
This has been patched in https://github.com/mermaid-js/mermaid/commit/12d472c9ed43f94814b110da8d7a9ae6dd5266ed and released in Mermaid v11.16.1.
A backport has been made for the v10 branch in 7e83f1533318b307764d961906a73377266f4c5e and was released in Mermaid v10.9.8
Workarounds
If you are inserting the `` into the DOM yourself, you can wrap it in an element with no other children, e.g. `...` or `element.innerHTML = svg`. Alternatively, you can use `mermaid.run()` or `mermaid.initialize()` which will do this for you.
Setting "securityLevel": "sandbox" will also prevent this, or setting the `secure` config value in the mermaid config to avoid allowing diagrams to modify `fontFamily`, `themeCSS`, `altFontFamily`, and `themeVariables`.
To test, you can try using a `themeCSS` with `& + * { /* my CSS here */}` and see if it's applied outside of your mermaid ``.
```mermaid-example
---
config:
themeCSS: |-
& + * { background:red !important; width:100vw !important; height:100vh !important; position:fixed !important; inset:0 !important; }
---
info
```
References
• GHSA-87f9-hvmw-gh4p/CVE-2026-41159 (related vulnerability)
• https://github.com/mermaid-js/mermaid/commit/12d472c9ed43f94814b110da8d7a9ae6dd5266ed
• https://github.com/mermaid-js/mermaid/releases/tag/mermaid%4011.16.1
• https://github.com/mermaid-js/mermaid/commit/7e83f1533318b307764d961906a73377266f4c5e
• https://github.com/mermaid-js/mermaid/releases/tag/v10.9.8
Related
Alias · CVE (1)
- CVE-2026-50159 Mermaid is a JavaScript tool that uses Markdown-inspired text to create and modify diagrams and charts. vulnerability
Weakness · CWE (1)
- CWE-94 Improper Control of Generation of Code weakness
References
- https://github.com/mermaid-js/mermaid/security/advisories/GHSA-6x64-9x62-f2gx web
- https://github.com/mermaid-js/mermaid/pull/8022 web
- https://github.com/mermaid-js/mermaid/commit/12d472c9ed43f94814b110da8d7a9ae6dd5266ed web
- https://github.com/mermaid-js/mermaid/commit/7e83f1533318b307764d961906a73377266f4c5e web
- https://github.com/mermaid-js/mermaid package
- https://github.com/mermaid-js/mermaid/releases/tag/[email protected] web
- https://github.com/mermaid-js/mermaid/releases/tag/v10.9.8 web