Skip to content
Heist/ feed
Back to feed
HighFix available

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

Type: advisorySources: OSV

### 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 ```js 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: ```js md.disable('smartquotes') ```

Products
markdown-it
Affected versions
Not specified
Fixed versions
14.3.2, 15.0.2
CVEs
CVE-2026-111759
Confirmed fixed CVEs
Not specified
Updated in this feed
31 Oct 2026, 13:03 UTC · Revision 1

Source evidence

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

core-osv · Original source

Published 20 Oct 2026, 14:34 UTC

### 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 ```js 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: ```js md.disable('smartquotes') ```

osv:GHSA-r7fv-28h4-cvq7

markdown-it

Fixed versions: 15.0.2

markdown-it

Fixed versions: 14.3.2

Complete source record
{
  "id": "7faa8034808ee4fd3ba151e8d098c128982ed568c493623eaf6a90312b6ea496",
  "url": "https://osv.dev/vulnerability/GHSA-r7fv-28h4-cvq7",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "markdown-it: Quadratic complexity in smartquotes with unmatched closing quotes",
    "summary": "### 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 ```js 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: ```js md.disable('smartquotes') ```",
    "evidence": "osv:GHSA-r7fv-28h4-cvq7",
    "products": [
      {
        "name": {
          "value": "markdown-it",
          "evidence": "/affected/0/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "15.0.2",
            "evidence": "/affected/0/ranges"
          }
        ],
        "affected_versions": []
      },
      {
        "name": {
          "value": "markdown-it",
          "evidence": "/affected/1/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "14.3.2",
            "evidence": "/affected/1/ranges"
          }
        ],
        "affected_versions": []
      }
    ],
    "severity": "high",
    "structured": {
      "id": "GHSA-r7fv-28h4-cvq7",
      "aliases": [
        "CVE-2026-111759",
        "GHSA-r7fv-28h4-cvq7"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "15.0.0"
                },
                {
                  "fixed": "15.0.2"
                }
              ]
            }
          ],
          "package": {
            "name": "markdown-it",
            "purl": "pkg:npm/markdown-it",
            "ecosystem": "npm"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-r7fv-28h4-cvq7/GHSA-r7fv-28h4-cvq7.json"
          }
        },
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "14.3.2"
                }
              ]
            }
          ],
          "package": {
            "name": "markdown-it",
            "purl": "pkg:npm/markdown-it",
            "ecosystem": "npm"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-r7fv-28h4-cvq7/GHSA-r7fv-28h4-cvq7.json"
          }
        }
      ],
      "modified": "2026-10-20T14:45:03.780912898Z",
      "provider": "osv",
      "references": [
        "https://github.com/markdown-it/markdown-it/security/advisories/GHSA-r7fv-28h4-cvq7",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-111759",
        "https://github.com/markdown-it/markdown-it/commit/1b379c1b6d0522421bd1a51b77337c79af2c8670",
        "https://github.com/markdown-it/markdown-it/commit/cf27366035edf9196667110c47d9d67b030a4152",
        "https://github.com/markdown-it/markdown-it/commit/daf5a3c32303e5d9de01b12eeb725fb5990b8162",
        "https://github.com/markdown-it/markdown-it",
        "https://github.com/markdown-it/markdown-it/releases/tag/14.3.2",
        "https://github.com/markdown-it/markdown-it/releases/tag/15.0.2"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-400",
          "CWE-407"
        ],
        "severity": "HIGH",
        "github_reviewed": true,
        "nvd_published_at": "2026-10-19T18:17:00Z",
        "github_reviewed_at": "2026-10-20T14:34:50Z"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-111759",
        "evidence": "/aliases"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/database_specific/severity"
  },
  "source_id": "core-osv",
  "document_id": 389730,
  "published_at": "2026-10-20T14:34:50+00:00"
}