All vulnerabilities
CVE-2026-111759GHSA-r7fv-28h4-cvq7

markdown-it: Quadratic complexity in smartquotes with unmatched closing quotes

markdown-it markdown-itnpmLibraries & packages
CVSS
7.5High
ExploitationPublic exploit codeCISA's assessment says proof of concept code is public, assessed 19 Oct 2026. Not in the KEV catalogCISA via CVE List
Exploit odds (EPSS)0.60%Chance of exploitation activity in the next 30 days, higher than 47% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in15.0.2Also 14.3.2GitHub
Published19 Oct 2026Updated 20 Oct 2026CVE List

What fixes it

  • 15.0.2markdown-it, npmGitHubnpm install markdown-it@15.0.2
  • 14.3.2markdown-it, npmGitHubnpm install markdown-it@14.3.2

A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.

Description

Impact

When typographer: true is enabled, specially crafted Markdown can cause quadratic processing time in the smartquotes rule, potentially leading to denial of service in applications processing untrusted input.

Many opening double quotes followed by unmatched closing single quotes cause repeated scans of the entire opener stack. The same issue occurs with the quote types reversed.

The default configuration (typographer: false) is not affected, but this option is enabled with high probability.

Reproduction

import MarkdownIt from 'markdown-it'
import { performance } from 'node:perf_hooks'

const md = new MarkdownIt({ typographer: true })

for (const k of [2000, 4000, 8000, 16000, 32000]) {
  const input = '"a '.repeat(k) + "b' ".repeat(k)
  const start = performance.now()
  md.render(input)
  console.log(input.length, (performance.now() - start).toFixed(1), 'ms')
}

Result:

|input size|time| |-|-| |12000|18ms| |24000|47ms| |48000|115ms| |96000|428ms| |192000|1586ms|

Patches

Fixed in 15.0.2 and 14.3.2.

Workarounds

Disable typography with typographer: false, or disable only the smartquotes rule:

md.disable('smartquotes')

Text from GitHub Advisory Database

Affected versions 6

  • markdown-it, npm>= 15.0.0, < 15.0.2GitHub
  • markdown-it, npm< 14.3.2GitHub
  • markdown-itaffected: >= 15.0.0, < 15.0.2CVE List
  • markdown-itaffected: < 14.3.2CVE List
  • markdown-it, npmfrom 15.0.0, fixed in 15.0.2OSV
  • markdown-it, npmfrom first release, fixed in 14.3.2OSV

References 8